diff options
Diffstat (limited to 'plugin/handler_socket')
130 files changed, 39484 insertions, 0 deletions
diff --git a/plugin/handler_socket/AUTHORS b/plugin/handler_socket/AUTHORS new file mode 100644 index 00000000..b60fb015 --- /dev/null +++ b/plugin/handler_socket/AUTHORS @@ -0,0 +1,22 @@ +Akira Higuchi (https://github.com/ahiguti) + - developed HanderSocket plugin, libhsclient, and perl-Net-HandlerSocket + +Yoshinori Matsunobu (https://github.com/yoshinorim) + - introduced autotools, added support for MySQL 5.5.6, added statistics + variables + +Jeff Hodges (https://github.com/jmhodges) + - fixed some autotools scripts + +Toru Yamaguchi (https://github.com/zigorou) + - ported to MacOS X + +Moriyoshi Koizumi (https://github.com/moriyoshi) + - fixed some autotools scripts + +takeda-at (https://github.com/takada-at) + - added simple authorization function + +WheresWardy (https://github.com/WheresWardy) + - added authentication functions to libhsclient + diff --git a/plugin/handler_socket/CMakeLists.txt b/plugin/handler_socket/CMakeLists.txt new file mode 100644 index 00000000..5a1925b4 --- /dev/null +++ b/plugin/handler_socket/CMakeLists.txt @@ -0,0 +1,39 @@ + +IF(WIN32 OR WITHOUT_SERVER) + # Handlersocket does not compile on Windows, compiles but does + # not start on FreeBSD. + # It is a server plugin and disable it explicitly here. + RETURN() +ENDIF() + +MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-deprecated-declarations") + +INCLUDE_DIRECTORIES(libhsclient) + +# Handlersocket client library. We do not distribute it, +# it is just compiled in. +SET(LIBHSCLIENT_SOURCES + libhsclient/config.cpp + libhsclient/escape.cpp + libhsclient/fatal.cpp + libhsclient/hstcpcli.cpp + libhsclient/socket.cpp + libhsclient/string_util.cpp +) +ADD_CONVENIENCE_LIBRARY(hsclient ${LIBHSCLIENT_SOURCES}) +# Solaris needs to link some network libraries +TARGET_LINK_LIBRARIES(hsclient ${LIBSOCKET} ${LIBNLS} ${LIBBIND}) + +# handlersocket daemon plugin itself. +SET(HANDLERSOCKET_SOURCES + handlersocket/database.cpp + handlersocket/handlersocket.cpp + handlersocket/hstcpsvr_worker.cpp + handlersocket/hstcpsvr.cpp +) +MYSQL_ADD_PLUGIN(handlersocket + ${HANDLERSOCKET_SOURCES} + MODULE_ONLY COMPONENT Server + LINK_LIBRARIES hsclient RECOMPILE_FOR_EMBEDDED +) + diff --git a/plugin/handler_socket/ChangeLog b/plugin/handler_socket/ChangeLog new file mode 100644 index 00000000..793a3993 --- /dev/null +++ b/plugin/handler_socket/ChangeLog @@ -0,0 +1,19 @@ +1.0.6 - For MariaDB + * Modifications to Makefiles to be part of plugin directory + * Compiled by default in max builds + * Some minor changes in database.cpp to use the new MariaDB handler + interface +o * Fixed compiler warnings + +1.0.6 - 2010-10-29 + * Changed build instruction (autoreconf/configure/make), removed auto-generated files (Contributed by jmhodges) + * + +1.0.5 - 2010-10-18 + * Changed build procedures (using typical configure/make) + * Supported 5.5.6 + * Added status variables + +1.0.4 - 2010-08-15 + * Initial public release + diff --git a/plugin/handler_socket/Makefile.am b/plugin/handler_socket/Makefile.am new file mode 100644 index 00000000..7dff1982 --- /dev/null +++ b/plugin/handler_socket/Makefile.am @@ -0,0 +1,88 @@ + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = @HANDLERSOCKET_SUBDIRS@ +EXTRA_DIST= plug.in + +perl: + cd perl-Net-HandlerSocket && perl Makefile.PL && make + +install_perl: + cd perl-Net-HandlerSocket && make install + +rpms: rpm_cli rpm_perl rpm_c + +rpm_dir: + - mkdir dist + - mkdir dist/BUILD dist/RPMS dist/SOURCES dist/SPECS dist/SRPMS + +rpm_cli: clean_cli rpm_dir + sed -e "s/HANDLERSOCKET_VERSION/$(VERSION)/" \ + libhsclient/libhsclient.spec.template \ + > libhsclient/libhsclient.spec + tar cvfz dist/libhsclient.tar.gz libhsclient + rpmbuild --define "_topdir `pwd`/dist" -ta \ + dist/libhsclient.tar.gz + +rpm_perl: clean_perl rpm_dir + sed -e "s/HANDLERSOCKET_VERSION/$(VERSION)/" \ + perl-Net-HandlerSocket/perl-Net-HandlerSocket.spec.template \ + > perl-Net-HandlerSocket/perl-Net-HandlerSocket.spec + cd perl-Net-HandlerSocket && perl Makefile.PL && make clean && \ + rm -f Makefile.old + tar cvfz dist/perl-Net-HandlerSocket.tar.gz perl-Net-HandlerSocket + rpmbuild --define "_topdir `pwd`/dist" -ta \ + dist/perl-Net-HandlerSocket.tar.gz + +rpm_c: clean_c rpm_dir + sed -e "s/HANDLERSOCKET_VERSION/$(VERSION)/" \ + handlersocket/handlersocket.spec.template \ + > handlersocket/handlersocket.spec + sed -e "s|HANDLERSOCKET_MYSQL_INC|$(MYSQL_CFLAGS) $(MYSQL_INC)|" \ + -e "s|HANDLERSOCKET_MYSQL_LIB|$(MYSQL_LIB)|" \ + handlersocket/Makefile.plain.template \ + > handlersocket/Makefile.plain + tar cvfz dist/handlersocket.tar.gz handlersocket + rpmbuild --define "_topdir `pwd`/dist" -ta \ + dist/handlersocket.tar.gz + +install_rpm_pl: + - sudo rpm -e perl-Net-HandlerSocket + - sudo rpm -e perl-Net-HandlerSocket-debuginfo + make clean + make rpm_perl + - sudo rpm -U dist/RPMS/*/perl*.rpm + +installrpms: + - sudo rpm -e handlersocket + - sudo rpm -e handlersocket-debuginfo + - sudo rpm -e perl-Net-HandlerSocket + - sudo rpm -e perl-Net-HandlerSocket-debuginfo + - sudo rpm -e libhsclient + - sudo rpm -e libhsclient-debuginfo + make clean + make rpm_cli + - sudo rpm -U dist/RPMS/*/libhsclient*.rpm + make clean + make rpm_perl + - sudo rpm -U dist/RPMS/*/perl*.rpm + make clean + make rpm_c + - sudo rpm -U dist/RPMS/*/handlersocket*.rpm + +clean_cli: + cd libhsclient && make clean + cd client && make clean + +clean_perl: + cd perl-Net-HandlerSocket && perl Makefile.PL && make clean && \ + rm -f Makefile.old + +clean_c: + cd handlersocket && make clean + +clean_all: clean_cli clean_perl clean_c + cd regtest && make clean + rm -rf dist/*/* + rm -f dist/*.tar.gz + diff --git a/plugin/handler_socket/README b/plugin/handler_socket/README new file mode 100644 index 00000000..9a3bed7a --- /dev/null +++ b/plugin/handler_socket/README @@ -0,0 +1,82 @@ +Notes added by Monty: + +This is HandlerSocket version 1.0.6 (See ChangeLog file) +The original code can be found at: + +https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL + +----------------------------------------------------------------------------- +HandlerSocket plugin for MySQL + +Copyright (c) 2010 DeNA Co.,Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of DeNA Co.,Ltd. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY DeNA Co.,Ltd. "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DeNA Co.,Ltd. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +----------------------------------------------------------------------------- +About HandlerSocket + +HandlerSocket is a NoSQL plugin for MySQL. It works as a daemon inside the +mysqld process, accept tcp connections, and execute requests from clients. +HandlerSocket does not support SQL queries. Instead, it supports simple CRUD +operations on tables. + +Because of the following reasons, HandlerSocket is much faster than the +mysqld/libmysql pair in some circumstances: + + - HandlerSocket manipulates data without parsing SQL, which causes less + CPU usage. + - HandlerSocket reads many requests from clients and executes their + requests in bulk, which causes less CPU and disk usage. + - HandlerSocket client/server protocol is more compact than the + mysql/libmysql pair, which causes less network usage. + +The current version of HandlerSocket only works with GNU/Linux. The source +archive of HandlerSocket includes a C++ and a Perl client libraries. +Here is a list of client libraries for other languages: + + - PHP + http://openpear.org/package/Net_HandlerSocket + http://github.com/tz-lom/HSPHP + http://code.google.com/p/php-handlersocket/ + - Java + http://code.google.com/p/hs4j/ + http://code.google.com/p/handlersocketforjava/ + - Python + http://pypi.python.org/pypi/python-handler-socket + https://code.launchpad.net/~songofacandy/+junk/pyhandlersocket + - Ruby + https://github.com/winebarrel/ruby-handlersocket + https://github.com/miyucy/handlersocket + - JavaScript + https://github.com/koichik/node-handlersocket + - Scala + https://github.com/fujohnwang/hs2client + +The home of HandlerSocket is here: + https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL + +More documents are available in docs-en/ and docs-ja/ directories. + diff --git a/plugin/handler_socket/autogen.sh b/plugin/handler_socket/autogen.sh new file mode 100755 index 00000000..3b80afd1 --- /dev/null +++ b/plugin/handler_socket/autogen.sh @@ -0,0 +1,117 @@ +#!/bin/sh + +warn() { +echo -e "\tWARNING: $@" 1>&2 +} + +# init + +LIBTOOLIZE=libtoolize +ACLOCAL=aclocal +AUTOCONF=autoconf +AUTOHEADER=autoheader +AUTOMAKE=automake + +case `uname -s` in +Darwin) +LIBTOOLIZE=glibtoolize +;; +FreeBSD) +ACLOCAL_ARGS="$ACLOCAL_ARGS -I /usr/local/share/aclocal/" +;; +esac + + +# libtoolize +echo "Searching libtoolize..." +if [ `which $LIBTOOLIZE` ] ; then +echo -e "\tFOUND: libtoolize -> $LIBTOOLIZE" +else +warn "Cannot Found libtoolize... input libtool command" + read LIBTOOLIZE + LIBTOOLIZE=`which $LIBTOOLIZE` + if [ `which $LIBTOOLIZE` ] ; then +echo -e "\tSET: libtoolize -> $LIBTOOLIZE" + else +warn "$LIBTOOLIZE: Command not found." + exit 1; + fi +fi + +# aclocal +echo "Searching aclocal..." +if [ `which $ACLOCAL` ] ; then +echo -e "\tFOUND: aclocal -> $ACLOCAL" +else +warn "Cannot Found aclocal... input aclocal command" + read ACLOCAL + ACLOCAL=`which $ACLOCAL` + if [ `which $ACLOCAL` ] ; then +echo -e "\tSET: aclocal -> $ACLOCAL" + else +warn "$ACLOCAL: Command not found." + exit 1; + fi +fi + +# automake +echo "Searching automake..." +if [ `which $AUTOMAKE` ] ; then +echo -e "\tFOUND: automake -> $AUTOMAKE" +else +warn "Cannot Found automake... input automake command" + read AUTOMAKE + ACLOCAL=`which $AUTOMAKE` + if [ `which $AUTOMAKE` ] ; then +echo -e "\tSET: automake -> $AUTOMAKE" + else +warn "$AUTOMAKE: Command not found." + exit 1; + fi +fi + +# autoheader +echo "Searching autoheader..." +if [ `which $AUTOHEADER` ] ; then +echo -e "\tFOUND: autoheader -> $AUTOHEADER" +else +warn "Cannot Found autoheader... input autoheader command" + read AUTOHEADER + ACLOCAL=`which $AUTOHEADER` + if [ `which $AUTOHEADER` ] ; then +echo -e "\tSET: autoheader -> $AUTOHEADER" + else +warn "$AUTOHEADER: Command not found." + exit 1; + fi +fi + +# autoconf +echo "Searching autoconf..." +if [ `which $AUTOCONF` ] ; then +echo -e "\tFOUND: autoconf -> $AUTOCONF" +else +warn "Cannot Found autoconf... input autoconf command" + read AUTOCONF + ACLOCAL=`which $AUTOCONF` + if [ `which $AUTOCONF` ] ; then +echo -e "\tSET: autoconf -> $AUTOCONF" + else +warn "$AUTOCONF: Command not found." + exit 1; + fi +fi + +echo "Running libtoolize ..." +$LIBTOOLIZE --force --copy +echo "Running aclocal ..." +$ACLOCAL ${ACLOCAL_ARGS} -I . +echo "Running autoheader..." +$AUTOHEADER +echo "Running automake ..." +$AUTOMAKE --add-missing --copy +echo "Running autoconf ..." +$AUTOCONF + +mkdir m4 2> /dev/null + diff --git a/plugin/handler_socket/client/Makefile.am b/plugin/handler_socket/client/Makefile.am new file mode 100644 index 00000000..e89727a7 --- /dev/null +++ b/plugin/handler_socket/client/Makefile.am @@ -0,0 +1,24 @@ +CXXFLAGS += -fimplicit-templates +AM_INCLUDES= -I$(srcdir)/../libhsclient +bin_PROGRAMS=hsclient +hsclient_SOURCES= hsclient.cpp +hsclient_LDFLAGS= -static -L../libhsclient -lhsclient +hsclient_CXXFLAGS= $(AM_INCLUDES) + +hstest: hstest.o + $(CXX) $(CXXFLAGS) $(MY_CXXFLAGS) $(LFLAGS) hstest.o \ + -L../libhsclient/.libs -lhsclient $(MYSQL_LIB) \ + -o hstest + +hstest.o: hstest.cpp + $(CXX) $(CXXFLAGS) $(MY_CXXFLAGS) $(MYSQL_INC) $(AM_INCLUDES) \ + -c hstest.cpp + +hslongrun: hslongrun.o + $(CXX) $(CXXFLAGS) $(MY_CXXFLAGS) $(LFLAGS) hslongrun.o \ + -L../libhsclient/.libs -lhsclient $(MYSQL_LIB) \ + -o hslongrun + +hslongrun.o: hslongrun.cpp + $(CXX) $(CXXFLAGS) $(MY_CXXFLAGS) $(MYSQL_INC) $(AM_INCLUDES) \ + -c hslongrun.cpp diff --git a/plugin/handler_socket/client/hsclient.cpp b/plugin/handler_socket/client/hsclient.cpp new file mode 100644 index 00000000..0dd8332e --- /dev/null +++ b/plugin/handler_socket/client/hsclient.cpp @@ -0,0 +1,88 @@ + +// vim:sw=2:ai + +#include "hstcpcli.hpp" +#include "string_util.hpp" + +namespace dena { + +int +hstcpcli_main(int argc, char **argv) +{ + config conf; + parse_args(argc, argv, conf); + socket_args sockargs; + sockargs.set(conf); + hstcpcli_ptr cli = hstcpcli_i::create(sockargs); + const std::string dbname = conf.get_str("dbname", "hstest"); + const std::string table = conf.get_str("table", "hstest_table1"); + const std::string index = conf.get_str("index", "PRIMARY"); + const std::string fields = conf.get_str("fields", "k,v"); + const int limit = conf.get_int("limit", 0); + const int skip = conf.get_int("skip", 0); + std::vector<std::string> keys; + std::vector<string_ref> keyrefs; + size_t num_keys = 0; + while (true) { + const std::string conf_key = std::string("k") + to_stdstring(num_keys); + const std::string k = conf.get_str(conf_key, ""); + const std::string kx = conf.get_str(conf_key, "x"); + if (k.empty() && kx == "x") { + break; + } + ++num_keys; + keys.push_back(k); + } + for (size_t i = 0; i < keys.size(); ++i) { + const string_ref ref(keys[i].data(), keys[i].size()); + keyrefs.push_back(ref); + } + const std::string op = conf.get_str("op", "="); + const string_ref op_ref(op.data(), op.size()); + cli->request_buf_open_index(0, dbname.c_str(), table.c_str(), + index.c_str(), fields.c_str()); + cli->request_buf_exec_generic(0, op_ref, num_keys == 0 ? 0 : &keyrefs[0], + num_keys, limit, skip, string_ref(), 0, 0); + int code = 0; + size_t numflds = 0; + do { + if (cli->request_send() != 0) { + fprintf(stderr, "request_send: %s\n", cli->get_error().c_str()); + break; + } + if ((code = cli->response_recv(numflds)) != 0) { + fprintf(stderr, "response_recv: %s\n", cli->get_error().c_str()); + break; + } + } while (false); + cli->response_buf_remove(); + do { + if ((code = cli->response_recv(numflds)) != 0) { + fprintf(stderr, "response_recv: %s\n", cli->get_error().c_str()); + break; + } + while (true) { + const string_ref *const row = cli->get_next_row(); + if (row == 0) { + break; + } + printf("REC:"); + for (size_t i = 0; i < numflds; ++i) { + const std::string val(row[i].begin(), row[i].size()); + printf(" %s", val.c_str()); + } + printf("\n"); + } + } while (false); + cli->response_buf_remove(); + return 0; +} + +}; + +int +main(int argc, char **argv) +{ + return dena::hstcpcli_main(argc, argv); +} + diff --git a/plugin/handler_socket/client/hslongrun.cpp b/plugin/handler_socket/client/hslongrun.cpp new file mode 100644 index 00000000..b7c02951 --- /dev/null +++ b/plugin/handler_socket/client/hslongrun.cpp @@ -0,0 +1,1041 @@ + +// vim:sw=2:ai + +#include <signal.h> +#include <sys/time.h> +#include <stdio.h> +#include <string.h> +#include <vector> +#include <map> +#include <stdlib.h> +#include <memory> +#include <errno.h> +#include <mysql.h> +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "util.hpp" +#include "auto_ptrcontainer.hpp" +#include "socket.hpp" +#include "hstcpcli.hpp" +#include "string_util.hpp" +#include "mutex.hpp" + +namespace dena { + +struct auto_mysql : private noncopyable { + auto_mysql() : db(0) { + reset(); + } + ~auto_mysql() { + if (db) { + mysql_close(db); + } + } + void reset() { + if (db) { + mysql_close(db); + } + if ((db = mysql_init(0)) == 0) { + fatal_abort("failed to initialize mysql client"); + } + } + operator MYSQL *() const { return db; } + private: + MYSQL *db; +}; + +struct auto_mysql_res : private noncopyable { + auto_mysql_res(MYSQL *db) { + res = mysql_store_result(db); + } + ~auto_mysql_res() { + if (res) { + mysql_free_result(res); + } + } + operator MYSQL_RES *() const { return res; } + private: + MYSQL_RES *res; +}; + +struct auto_mysql_stmt : private noncopyable { + auto_mysql_stmt(MYSQL *db) { + stmt = mysql_stmt_init(db); + } + ~auto_mysql_stmt() { + if (stmt) { + mysql_stmt_close(stmt); + } + } + operator MYSQL_STMT *() const { return stmt; } + private: + MYSQL_STMT *stmt; +}; + +double +gettimeofday_double() +{ + struct timeval tv = { }; + if (gettimeofday(&tv, 0) != 0) { + fatal_abort("gettimeofday"); + } + return static_cast<double>(tv.tv_usec) / 1000000 + tv.tv_sec; +} + +struct record_value { + mutex lock; + bool deleted; + bool unknown_state; + std::string key; + std::vector<std::string> values; + record_value() : deleted(true), unknown_state(false) { } +}; + +struct hs_longrun_shared { + config conf; + socket_args arg; + int verbose; + long num_threads; + int usleep; + volatile mutable int running; + auto_ptrcontainer< std::vector<record_value *> > records; + hs_longrun_shared() : verbose(0), num_threads(0), usleep(0), running(1) { } +}; + +struct thread_base { + thread_base() : need_join(false), stack_size(256 * 1024) { } + virtual ~thread_base() { + join(); + } + virtual void run() = 0; + void start() { + if (!start_nothrow()) { + fatal_abort("thread::start"); + } + } + bool start_nothrow() { + if (need_join) { + return need_join; /* true */ + } + void *const arg = this; + pthread_attr_t attr; + if (pthread_attr_init(&attr) != 0) { + fatal_abort("pthread_attr_init"); + } + if (pthread_attr_setstacksize(&attr, stack_size) != 0) { + fatal_abort("pthread_attr_setstacksize"); + } + const int r = pthread_create(&thr, &attr, thread_main, arg); + if (pthread_attr_destroy(&attr) != 0) { + fatal_abort("pthread_attr_destroy"); + } + if (r != 0) { + return need_join; /* false */ + } + need_join = true; + return need_join; /* true */ + } + void join() { + if (!need_join) { + return; + } + int e = 0; + if ((e = pthread_join(thr, 0)) != 0) { + fatal_abort("pthread_join"); + } + need_join = false; + } + private: + static void *thread_main(void *arg) { + thread_base *p = static_cast<thread_base *>(arg); + p->run(); + return 0; + } + private: + pthread_t thr; + bool need_join; + size_t stack_size; +}; + +struct hs_longrun_stat { + unsigned long long verify_error_count; + unsigned long long runtime_error_count; + unsigned long long unknown_count; + unsigned long long success_count; + hs_longrun_stat() + : verify_error_count(0), runtime_error_count(0), + unknown_count(0), success_count(0) { } + void add(const hs_longrun_stat& x) { + verify_error_count += x.verify_error_count; + runtime_error_count += x.runtime_error_count; + unknown_count += x.unknown_count; + success_count += x.success_count; + } +}; + +struct hs_longrun_thread_base : public thread_base { + struct arg_type { + int id; + std::string worker_type; + char op; + int lock_flag; + const hs_longrun_shared& sh; + arg_type(int id, const std::string& worker_type, char op, int lock_flag, + const hs_longrun_shared& sh) + : id(id), worker_type(worker_type), op(op), lock_flag(lock_flag), + sh(sh) { } + }; + arg_type arg; + hs_longrun_stat stat; + drand48_data randbuf; + unsigned int seed; + hs_longrun_thread_base(const arg_type& arg) + : arg(arg), seed(0) { + seed = time(0) + arg.id + 1; + srand48_r(seed, &randbuf); + } + virtual ~hs_longrun_thread_base() { } + virtual void run() = 0; + size_t rand_record() { + double v = 0; + drand48_r(&randbuf, &v); + const size_t sz = arg.sh.records.size(); + size_t r = size_t(v * sz); + if (r >= sz) { + r = 0; + } + return r; + } + int verify_update(const std::string& k, const std::string& v1, + const std::string& v2, const std::string& v3, record_value& rec, + uint32_t num_rows, bool cur_unknown_state); + int verify_read(const std::string& k, uint32_t num_rows, uint32_t num_flds, + const std::string rrec[4], record_value& rec); + int verify_readnolock(const std::string& k, uint32_t num_rows, + uint32_t num_flds, const std::string rrec[4]); +}; + +int +hs_longrun_thread_base::verify_update(const std::string& k, + const std::string& v1, const std::string& v2, const std::string& v3, + record_value& rec, uint32_t num_rows, bool cur_unknown_state) +{ + const bool op_success = num_rows == 1; + int ret = 0; + if (!rec.unknown_state) { + if (!rec.deleted && !op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_update_failure\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } else if (rec.deleted && op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_update_success\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } + } + if (op_success) { + rec.values.resize(4); + rec.values[0] = k; + rec.values[1] = v1; + rec.values[2] = v2; + rec.values[3] = v3; + if (ret == 0 && !rec.unknown_state) { + ++stat.success_count; + } + } + rec.unknown_state = cur_unknown_state; + if (arg.sh.verbose >= 100 && ret == 0) { + fprintf(stderr, "%s %s %s %s %s\n", arg.worker_type.c_str(), + k.c_str(), v1.c_str(), v2.c_str(), v3.c_str()); + } + return ret; +} + +int +hs_longrun_thread_base::verify_read(const std::string& k, + uint32_t num_rows, uint32_t num_flds, const std::string rrec[4], + record_value& rec) +{ + const bool op_success = num_rows != 0; + int ret = 0; + if (!rec.unknown_state) { + if (!rec.deleted && !op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_read_failure\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } else if (rec.deleted && op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_read_success\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } else if (num_flds != 4) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_read_fldnum %d\n", + arg.worker_type.c_str(), arg.id, k.c_str(), + static_cast<int>(num_flds)); + } + ret = 1; + } else if (rec.deleted) { + /* nothing to verify */ + } else { + int diff = 0; + for (size_t i = 0; i < 4; ++i) { + if (rec.values[i] == rrec[i]) { + /* ok */ + } else { + diff = 1; + } + } + if (diff) { + std::string mess; + for (size_t i = 0; i < 4; ++i) { + const std::string& expected = rec.values[i]; + const std::string& val = rrec[i]; + mess += " " + val + "/" + expected; + } + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_read_value %s\n", + arg.worker_type.c_str(), arg.id, k.c_str(), mess.c_str()); + } + ret = 1; + } + } + } + if (arg.sh.verbose >= 100 && ret == 0) { + fprintf(stderr, "%s %s\n", arg.worker_type.c_str(), k.c_str()); + } + if (ret == 0 && !rec.unknown_state) { + ++stat.success_count; + } + return ret; +} + +int +hs_longrun_thread_base::verify_readnolock(const std::string& k, + uint32_t num_rows, uint32_t num_flds, const std::string rrec[4]) +{ + int ret = 0; + if (num_rows != 1 || num_flds != 4) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_read_failure\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } + if (arg.sh.verbose >= 100 && ret == 0) { + fprintf(stderr, "%s -> %s %s %s %s %s\n", arg.worker_type.c_str(), + k.c_str(), rrec[0].c_str(), rrec[1].c_str(), rrec[2].c_str(), + rrec[3].c_str()); + } + if (ret == 0) { + ++stat.success_count; + } + return ret; +} + +struct hs_longrun_thread_hs : public hs_longrun_thread_base { + hs_longrun_thread_hs(const arg_type& arg) + : hs_longrun_thread_base(arg) { } + void run(); + int check_hs_error(const char *mess, record_value *rec); + int op_insert(record_value& rec); + int op_delete(record_value& rec); + int op_update(record_value& rec); + int op_read(record_value& rec); + int op_readnolock(int k); + hstcpcli_ptr cli; + socket_args sockargs; +}; + +struct lock_guard : noncopyable { + lock_guard(mutex& mtx) : mtx(mtx) { + mtx.lock(); + } + ~lock_guard() { + mtx.unlock(); + } + mutex& mtx; +}; + +string_ref +to_string_ref(const std::string& s) +{ + return string_ref(s.data(), s.size()); +} + +std::string +to_string(const string_ref& s) +{ + return std::string(s.begin(), s.size()); +} + +void +hs_longrun_thread_hs::run() +{ + config c = arg.sh.conf; + if (arg.op == 'R' || arg.op == 'N') { + c["port"] = to_stdstring(arg.sh.conf.get_int("hsport", 9998)); + } else { + c["port"] = to_stdstring(arg.sh.conf.get_int("hsport_wr", 9999)); + } + sockargs.set(c); + + while (arg.sh.running) { + if (cli.get() == 0 || !cli->stable_point()) { + cli = hstcpcli_i::create(sockargs); + if (check_hs_error("connect", 0) != 0) { + cli.reset(); + continue; + } + cli->request_buf_open_index(0, "hstestdb", "hstesttbl", "PRIMARY", + "k,v1,v2,v3", "k,v1,v2,v3"); + cli->request_send(); + if (check_hs_error("openindex_send", 0) != 0) { + cli.reset(); + continue; + } + size_t num_flds = 0; + cli->response_recv(num_flds); + if (check_hs_error("openindex_recv", 0) != 0) { + cli.reset(); + continue; + } + cli->response_buf_remove(); + } + const size_t rec_id = rand_record(); + if (arg.lock_flag) { + record_value& rec = *arg.sh.records[rec_id]; + lock_guard g(rec.lock); + int e = 0; + switch (arg.op) { + case 'I': + e = op_insert(rec); + break; + case 'D': + e = op_delete(rec); + break; + case 'U': + e = op_update(rec); + break; + case 'R': + e = op_read(rec); + break; + default: + break; + } + } else { + int e = 0; + switch (arg.op) { + case 'N': + e = op_readnolock(rec_id); + break; + default: + break; + } + } + } +} + +int +hs_longrun_thread_hs::op_insert(record_value& rec) +{ + const std::string k = rec.key; + const std::string v1 = "iv1_" + k + "_" + to_stdstring(arg.id); + const std::string v2 = "iv2_" + k + "_" + to_stdstring(arg.id); + const std::string v3 = "iv3_" + k + "_" + to_stdstring(arg.id); + const string_ref op_ref("+", 1); + const string_ref op_args[4] = { + to_string_ref(k), + to_string_ref(v1), + to_string_ref(v2), + to_string_ref(v3) + }; + cli->request_buf_exec_generic(0, op_ref, op_args, 4, 1, 0, + string_ref(), 0, 0, 0, 0); + cli->request_send(); + if (check_hs_error("op_insert_send", &rec) != 0) { return 1; } + size_t numflds = 0; + cli->response_recv(numflds); + if (arg.sh.verbose > 10) { + const string_ref *row = cli->get_next_row(); + fprintf(stderr, "HS op=+ errrcode=%d errmess=[%s]\n", cli->get_error_code(), + row ? to_string(row[0]).c_str() : ""); + } + const bool op_success = cli->get_error_code() == 0; + int ret = 0; + if (!rec.unknown_state) { + if (rec.deleted && !op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_insert_failure\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } else if (!rec.deleted && op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_insert_success\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } + } else { + ++stat.unknown_count; + } + if (op_success) { + rec.values.resize(4); + rec.values[0] = k; + rec.values[1] = v1; + rec.values[2] = v2; + rec.values[3] = v3; + rec.deleted = false; + if (arg.sh.verbose >= 100 && ret == 0) { + fprintf(stderr, "HS_INSERT %s %s %s %s\n", k.c_str(), v1.c_str(), + v2.c_str(), v3.c_str()); + } + if (ret == 0 && !rec.unknown_state) { + ++stat.success_count; + } + rec.unknown_state = false; + } + cli->response_buf_remove(); + return ret; +} + +int +hs_longrun_thread_hs::op_delete(record_value& rec) +{ + const std::string k = rec.key; + const string_ref op_ref("=", 1); + const string_ref op_args[1] = { + to_string_ref(k), + }; + const string_ref modop_ref("D", 1); + cli->request_buf_exec_generic(0, op_ref, op_args, 1, 1, 0, + modop_ref, 0, 0, 0, 0); + cli->request_send(); + if (check_hs_error("op_delete_send", &rec) != 0) { return 1; } + size_t numflds = 0; + cli->response_recv(numflds); + if (check_hs_error("op_delete_recv", &rec) != 0) { return 1; } + const string_ref *row = cli->get_next_row(); + const bool op_success = (numflds > 0 && row != 0 && + to_string(row[0]) == "1"); + int ret = 0; + if (!rec.unknown_state) { + if (!rec.deleted && !op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_delete_failure\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } else if (rec.deleted && op_success) { + ++stat.verify_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "VERIFY_ERROR: %s wid=%d k=%s " + "unexpected_delete_success\n", + arg.worker_type.c_str(), arg.id, k.c_str()); + } + ret = 1; + } + } + cli->response_buf_remove(); + if (op_success) { + rec.deleted = true; + if (ret == 0 && !rec.unknown_state) { + ++stat.success_count; + } + rec.unknown_state = false; + } + if (arg.sh.verbose >= 100 && ret == 0) { + fprintf(stderr, "HS_DELETE %s\n", k.c_str()); + } + return ret; +} + +int +hs_longrun_thread_hs::op_update(record_value& rec) +{ + const std::string k = rec.key; + const std::string v1 = "uv1_" + k + "_" + to_stdstring(arg.id); + const std::string v2 = "uv2_" + k + "_" + to_stdstring(arg.id); + const std::string v3 = "uv3_" + k + "_" + to_stdstring(arg.id); + const string_ref op_ref("=", 1); + const string_ref op_args[1] = { + to_string_ref(k), + }; + const string_ref modop_ref("U", 1); + const string_ref modop_args[4] = { + to_string_ref(k), + to_string_ref(v1), + to_string_ref(v2), + to_string_ref(v3) + }; + cli->request_buf_exec_generic(0, op_ref, op_args, 1, 1, 0, + modop_ref, modop_args, 4, 0, 0); + cli->request_send(); + if (check_hs_error("op_update_send", &rec) != 0) { return 1; } + size_t numflds = 0; + cli->response_recv(numflds); + if (check_hs_error("op_update_recv", &rec) != 0) { return 1; } + const string_ref *row = cli->get_next_row(); + uint32_t num_rows = row + ? atoi_uint32_nocheck(row[0].begin(), row[0].end()) : 0; + cli->response_buf_remove(); + const bool cur_unknown_state = (num_rows == 1); + return verify_update(k, v1, v2, v3, rec, num_rows, cur_unknown_state); +} + +int +hs_longrun_thread_hs::op_read(record_value& rec) +{ + const std::string k = rec.key; + const string_ref op_ref("=", 1); + const string_ref op_args[1] = { + to_string_ref(k), + }; + cli->request_buf_exec_generic(0, op_ref, op_args, 1, 1, 0, + string_ref(), 0, 0, 0, 0); + cli->request_send(); + if (check_hs_error("op_read_send", 0) != 0) { return 1; } + size_t num_flds = 0; + size_t num_rows = 0; + cli->response_recv(num_flds); + if (check_hs_error("op_read_recv", 0) != 0) { return 1; } + const string_ref *row = cli->get_next_row(); + std::string rrec[4]; + if (row != 0 && num_flds == 4) { + for (int i = 0; i < 4; ++i) { + rrec[i] = to_string(row[i]); + } + ++num_rows; + } + row = cli->get_next_row(); + if (row != 0) { + ++num_rows; + } + cli->response_buf_remove(); + return verify_read(k, num_rows, num_flds, rrec, rec); +} + +int +hs_longrun_thread_hs::op_readnolock(int key) +{ + const std::string k = to_stdstring(key); + const string_ref op_ref("=", 1); + const string_ref op_args[1] = { + to_string_ref(k), + }; + cli->request_buf_exec_generic(0, op_ref, op_args, 1, 1, 0, + string_ref(), 0, 0, 0, 0); + cli->request_send(); + if (check_hs_error("op_read_send", 0) != 0) { return 1; } + size_t num_flds = 0; + size_t num_rows = 0; + cli->response_recv(num_flds); + if (check_hs_error("op_read_recv", 0) != 0) { return 1; } + const string_ref *row = cli->get_next_row(); + std::string rrec[4]; + if (row != 0 && num_flds == 4) { + for (int i = 0; i < 4; ++i) { + rrec[i] = to_string(row[i]); + } + ++num_rows; + } + row = cli->get_next_row(); + if (row != 0) { + ++num_rows; + } + cli->response_buf_remove(); + return verify_readnolock(k, num_rows, num_flds, rrec); +} + +int +hs_longrun_thread_hs::check_hs_error(const char *mess, record_value *rec) +{ + const int err = cli->get_error_code(); + if (err == 0) { + return 0; + } + ++stat.runtime_error_count; + if (arg.sh.verbose > 0) { + const std::string estr = cli->get_error(); + fprintf(stderr, "RUNTIME_ERROR: op=%c wid=%d %s: %d %s\n", + arg.op, arg.id, mess, err, estr.c_str()); + } + if (rec) { + rec->unknown_state = true; + } + return 1; +} + +struct hs_longrun_thread_my : public hs_longrun_thread_base { + hs_longrun_thread_my(const arg_type& arg) + : hs_longrun_thread_base(arg), connected(false) { } + void run(); + void show_mysql_error(const char *mess, record_value *rec); + int op_insert(record_value& rec); + int op_delete(record_value& rec); + int op_update(record_value& rec); + int op_delins(record_value& rec); + int op_read(record_value& rec); + auto_mysql db; + bool connected; +}; + +void +hs_longrun_thread_my::run() +{ + const std::string mysql_host = arg.sh.conf.get_str("host", "localhost"); + const std::string mysql_user = arg.sh.conf.get_str("mysqluser", "root"); + const std::string mysql_passwd = arg.sh.conf.get_str("mysqlpass", ""); + const std::string mysql_dbname = "hstestdb"; + + while (arg.sh.running) { + if (!connected) { + if (!mysql_real_connect(db, mysql_host.c_str(), mysql_user.c_str(), + mysql_passwd.c_str(), mysql_dbname.c_str(), mysql_port, 0, 0)) { + show_mysql_error("mysql_real_connect", 0); + continue; + } + } + connected = true; + const size_t rec_id = rand_record(); + record_value& rec = *arg.sh.records[rec_id]; + lock_guard g(rec.lock); + int e = 0; + switch (arg.op) { + #if 0 + case 'I': + e = op_insert(rec); + break; + case 'D': + e = op_delete(rec); + break; + case 'U': + e = op_update(rec); + break; + #endif + case 'T': + e = op_delins(rec); + break; + case 'R': + e = op_read(rec); + break; + default: + break; + } + } +} + +int +hs_longrun_thread_my::op_delins(record_value& rec) +{ + const std::string k = rec.key; + const std::string v1 = "div1_" + k + "_" + to_stdstring(arg.id); + const std::string v2 = "div2_" + k + "_" + to_stdstring(arg.id); + const std::string v3 = "div3_" + k + "_" + to_stdstring(arg.id); + int success = 0; + bool cur_unknown_state = false; + do { + char query[1024]; + #if 1 + if (mysql_query(db, "begin") != 0) { + if (arg.sh.verbose >= 20) { + fprintf(stderr, "mysql: e=[%s] q=[%s]\n", mysql_error(db), "begin"); + } + break; + } + #endif + cur_unknown_state = true; + snprintf(query, 1024, + "delete from hstesttbl where k = '%s'", k.c_str()); + if (mysql_query(db, query) != 0) { + if (arg.sh.verbose >= 20) { + fprintf(stderr, "mysql: e=[%s] q=[%s]\n", mysql_error(db), query); + } + break; + } + if (mysql_affected_rows(db) != 1) { + if (arg.sh.verbose >= 20) { + fprintf(stderr, "mysql: notfound: [%s]\n", query); + } + break; + } + snprintf(query, 1024, + "insert into hstesttbl values ('%s', '%s', '%s', '%s')", + k.c_str(), v1.c_str(), v2.c_str(), v3.c_str()); + if (mysql_query(db, query) != 0) { + if (arg.sh.verbose >= 20) { + fprintf(stderr, "mysql: e=[%s] q=[%s]\n", mysql_error(db), query); + } + break; + } + #if 1 + if (mysql_query(db, "commit") != 0) { + if (arg.sh.verbose >= 20) { + fprintf(stderr, "mysql: e=[%s] q=[%s]\n", mysql_error(db), "commit"); + } + break; + } + #endif + success = true; + cur_unknown_state = false; + } while (false); + return verify_update(k, v1, v2, v3, rec, (success != 0), cur_unknown_state); +} + +int +hs_longrun_thread_my::op_read(record_value& rec) +{ + const std::string k = rec.key; + char query[1024] = { 0 }; + const int len = snprintf(query, 1024, + "select k,v1,v2,v3 from hstesttbl where k='%s'", k.c_str()); + const int r = mysql_real_query(db, query, len > 0 ? len : 0); + if (r != 0) { + show_mysql_error(query, 0); + return 1; + } + MYSQL_ROW row = 0; + unsigned long *lengths = 0; + unsigned int num_rows = 0; + unsigned int num_flds = 0; + auto_mysql_res res(db); + std::string rrec[4]; + if (res != 0) { + num_flds = mysql_num_fields(res); + row = mysql_fetch_row(res); + if (row != 0) { + lengths = mysql_fetch_lengths(res); + if (num_flds == 4) { + for (int i = 0; i < 4; ++i) { + rrec[i] = std::string(row[i], lengths[i]); + } + } + ++num_rows; + row = mysql_fetch_row(res); + if (row != 0) { + ++num_rows; + } + } + } + return verify_read(k, num_rows, num_flds, rrec, rec); +} + +void +hs_longrun_thread_my::show_mysql_error(const char *mess, record_value *rec) +{ + ++stat.runtime_error_count; + if (arg.sh.verbose > 0) { + fprintf(stderr, "RUNTIME_ERROR: op=%c wid=%d [%s]: %s\n", + arg.op, arg.id, mess, mysql_error(db)); + } + if (rec) { + rec->unknown_state = true; + } + db.reset(); + connected = false; +} + +void +mysql_do(MYSQL *db, const char *query) +{ + if (mysql_real_query(db, query, strlen(query)) != 0) { + fprintf(stderr, "mysql: e=[%s] q=[%s]\n", mysql_error(db), query); + fatal_abort("mysql_do"); + } +} + +void +hs_longrun_init_table(const config& conf, int num_prepare, + hs_longrun_shared& shared) +{ + const std::string mysql_host = conf.get_str("host", "localhost"); + const std::string mysql_user = conf.get_str("mysqluser", "root"); + const std::string mysql_passwd = conf.get_str("mysqlpass", ""); + const std::string mysql_dbname = ""; + auto_mysql db; + if (!mysql_real_connect(db, mysql_host.c_str(), mysql_user.c_str(), + mysql_passwd.c_str(), mysql_dbname.c_str(), mysql_port, 0, 0)) { + fprintf(stderr, "mysql: error=[%s]\n", mysql_error(db)); + fatal_abort("hs_longrun_init_table"); + } + mysql_do(db, "drop database if exists hstestdb"); + mysql_do(db, "create database hstestdb"); + mysql_do(db, "use hstestdb"); + mysql_do(db, + "create table hstesttbl (" + "k int primary key," + "v1 varchar(32) not null," + "v2 varchar(32) not null," + "v3 varchar(32) not null" + ") character set utf8 collate utf8_bin engine = innodb"); + for (int i = 0; i < num_prepare; ++i) { + const std::string i_str = to_stdstring(i); + const std::string v1 = "pv1_" + i_str; + const std::string v2 = "pv2_" + i_str; + const std::string v3 = "pv3_" + i_str; + char buf[1024]; + snprintf(buf, 1024, "insert into hstesttbl(k, v1, v2, v3) values" + "(%d, '%s', '%s', '%s')", i, v1.c_str(), v2.c_str(), v3.c_str()); + mysql_do(db, buf); + record_value *rec = shared.records[i]; + rec->key = i_str; + rec->values.resize(4); + rec->values[0] = i_str; + rec->values[1] = v1; + rec->values[2] = v2; + rec->values[3] = v3; + rec->deleted = false; + } +} + +int +hs_longrun_main(int argc, char **argv) +{ + hs_longrun_shared shared; + parse_args(argc, argv, shared.conf); + shared.conf["host"] = shared.conf.get_str("host", "localhost"); + shared.verbose = shared.conf.get_int("verbose", 1); + const int table_size = shared.conf.get_int("table_size", 10000); + for (int i = 0; i < table_size; ++i) { + std::auto_ptr<record_value> rec(new record_value()); + rec->key = to_stdstring(i); + shared.records.push_back_ptr(rec); + } + mysql_library_init(0, 0, 0); + const int duration = shared.conf.get_int("duration", 10); + const int num_hsinsert = shared.conf.get_int("num_hsinsert", 10); + const int num_hsdelete = shared.conf.get_int("num_hsdelete", 10); + const int num_hsupdate = shared.conf.get_int("num_hsupdate", 10); + const int num_hsread = shared.conf.get_int("num_hsread", 10); + const int num_myread = shared.conf.get_int("num_myread", 10); + const int num_mydelins = shared.conf.get_int("num_mydelins", 10); + int num_hsreadnolock = shared.conf.get_int("num_hsreadnolock", 10); + const bool always_filled = (num_hsinsert == 0 && num_hsdelete == 0); + if (!always_filled) { + num_hsreadnolock = 0; + } + hs_longrun_init_table(shared.conf, always_filled ? table_size : 0, + shared); + /* create worker threads */ + static const struct thrtmpl_type { + const char *type; char op; int num; int hs; int lock; + } thrtmpl[] = { + { "hsinsert", 'I', num_hsinsert, 1, 1 }, + { "hsdelete", 'D', num_hsdelete, 1, 1 }, + { "hsupdate", 'U', num_hsupdate, 1, 1 }, + { "hsread", 'R', num_hsread, 1, 1 }, + { "hsreadnolock", 'N', num_hsreadnolock, 1, 0 }, + { "myread", 'R', num_myread, 0, 1 }, + { "mydelins", 'T', num_mydelins, 0, 1 }, + }; + typedef auto_ptrcontainer< std::vector<hs_longrun_thread_base *> > thrs_type; + thrs_type thrs; + for (size_t i = 0; i < sizeof(thrtmpl)/sizeof(thrtmpl[0]); ++i) { + const thrtmpl_type& e = thrtmpl[i]; + for (int j = 0; j < e.num; ++j) { + int id = thrs.size(); + const hs_longrun_thread_hs::arg_type arg(id, e.type, e.op, e.lock, + shared); + std::auto_ptr<hs_longrun_thread_base> thr; + if (e.hs) { + thr.reset(new hs_longrun_thread_hs(arg)); + } else { + thr.reset(new hs_longrun_thread_my(arg)); + } + thrs.push_back_ptr(thr); + } + } + shared.num_threads = thrs.size(); + /* start threads */ + fprintf(stderr, "START\n"); + shared.running = 1; + for (size_t i = 0; i < thrs.size(); ++i) { + thrs[i]->start(); + } + /* wait */ + sleep(duration); + /* stop thread */ + shared.running = 0; + for (size_t i = 0; i < thrs.size(); ++i) { + thrs[i]->join(); + } + fprintf(stderr, "DONE\n"); + /* summary */ + typedef std::map<std::string, hs_longrun_stat> stat_map; + stat_map sm; + for (size_t i = 0; i < thrs.size(); ++i) { + hs_longrun_thread_base *const thr = thrs[i]; + const std::string wt = thr->arg.worker_type; + hs_longrun_stat& v = sm[wt]; + v.add(thr->stat); + } + hs_longrun_stat total; + for (stat_map::const_iterator i = sm.begin(); i != sm.end(); ++i) { + if (i->second.verify_error_count != 0) { + fprintf(stderr, "%s verify_error %llu\n", i->first.c_str(), + i->second.verify_error_count); + } + if (i->second.runtime_error_count) { + fprintf(stderr, "%s runtime_error %llu\n", i->first.c_str(), + i->second.runtime_error_count); + } + if (i->second.unknown_count) { + fprintf(stderr, "%s unknown %llu\n", i->first.c_str(), + i->second.unknown_count); + } + fprintf(stderr, "%s success %llu\n", i->first.c_str(), + i->second.success_count); + total.add(i->second); + } + if (total.verify_error_count != 0) { + fprintf(stderr, "TOTAL verify_error %llu\n", total.verify_error_count); + } + if (total.runtime_error_count != 0) { + fprintf(stderr, "TOTAL runtime_error %llu\n", total.runtime_error_count); + } + if (total.unknown_count != 0) { + fprintf(stderr, "TOTAL unknown %llu\n", total.unknown_count); + } + fprintf(stderr, "TOTAL success %llu\n", total.success_count); + mysql_library_end(); + return 0; +} + +}; + +int +main(int argc, char **argv) +{ + return dena::hs_longrun_main(argc, argv); +} + diff --git a/plugin/handler_socket/client/hspool_test.pl b/plugin/handler_socket/client/hspool_test.pl new file mode 100755 index 00000000..03227e31 --- /dev/null +++ b/plugin/handler_socket/client/hspool_test.pl @@ -0,0 +1,224 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use DB::HandlerSocket::Pool; +use DBI; + +my %conf = (); +for my $i (@ARGV) { + my ($k, $v) = split(/=/, $i); + $conf{$k} = $v; +} + +my $verbose = get_conf("verbose", 0); +my $actions_str = get_conf("actions", + "create,insert,verify,verify2,verify3,verify4,clean"); +my $tablesize = get_conf("tablesize", 1000); +my $db = get_conf("db", "hstestdb"); +my $table = get_conf("table", "testtbl"); +my $table_schema = get_conf("table_schema", undef); +my $engine = get_conf("engine", "innodb"); +my $host = get_conf("host", "localhost"); +my $mysqlport = get_conf("mysqlport", 3306); +my $hsport_rd = get_conf("hsport_rd", 9998); +my $hsport_wr = get_conf("hsport_wr", 9999); +my $loop = get_conf("loop", 10000); +my $op = get_conf("op", "="); +my $ssps = get_conf("ssps", 0); +my $num_moreflds = get_conf("moreflds", 0); +my $moreflds_prefix = get_conf("moreflds_prefix", "f"); +my $mysql_user = 'root'; +my $mysql_password = ''; + +my $dsn = "DBI:MariaDB:database=;host=$host;port=$mysqlport" + . ";mariadb_server_prepare=$ssps"; +my $dbh = DBI->connect($dsn, $mysql_user, $mysql_password, + { RaiseError => 1 }); +my $hsargs = { 'host' => $host, 'port' => $hsport_rd }; +my $hspool = new DB::HandlerSocket::Pool({ + hostmap => { + "$db.$table" => { + host => $host, + port => $hsport_rd, + }, + }, + resolve => undef, + error => undef, +}); +$table_schema = "(k int primary key, fc30 varchar(30), ft text)" + if (!defined($table_schema)); + +my @actions = split(/,/, $actions_str); +for my $action (@actions) { + print "ACTION: $action\n"; + eval "hstest_$action()"; + if ($@) { + die $@; + } + print "ACTION: $action DONE\n"; +} + +sub get_conf { + my ($key, $def) = @_; + my $val = $conf{$key}; + if ($val) { + print "$key=$val\n"; + } else { + $val = $def; + my $defstr = $def || "(undef)"; + print "$key=$defstr(default)\n"; + } + return $val; +} + +sub hstest_create { + $dbh->do("drop database if exists $db"); + $dbh->do("create database $db"); + $dbh->do("use $db"); + $dbh->do("create table $table $table_schema engine=$engine"); +} + +sub hstest_dump { + $dbh->do("use $db"); + my $sth = $dbh->prepare("select * from $table"); + $sth->execute(); + my $arr = $sth->fetchall_arrayref(); + for my $rec (@$arr) { + print "REC:"; + for my $row (@$rec) { + print " $row"; + } + print "\n"; + } +} + +sub hstest_insert { + $dbh->do("use $db"); + my $sth = $dbh->prepare("insert into $table values (?, ?, ?)"); + for (my $k = 0; $k < $tablesize; ++$k) { + my $fc30 = "fc30_$k"; + my $ft = "ft_$k"; + $sth->execute($k, $fc30, $ft); + } +} + +sub hstest_verify { + $dbh->do("use $db"); + my $sth = $dbh->prepare("select * from $table order by k"); + $sth->execute(); + my $arr = $sth->fetchall_arrayref(); + my $hsres = $hspool->index_find($db, $table, "PRIMARY", "k,fc30,ft", + ">=", [ 0 ], $tablesize, 0); + for (my $i = 0; $i < $tablesize; ++$i) { + my $rec = $arr->[$i]; + my $differ = 0; + print "REC:" if $verbose; + for (my $j = 0; $j < 3; ++$j) { + my $fld = $rec->[$j]; + my $hsidx = $i * 3 + $j; + my $hsfld = $hsres->[$hsidx]; + if ($hsfld ne $fld) { + $differ = 1; + } + if ($differ) { + print " $fld:$hsfld" if $verbose; + } else { + print " $hsfld" if $verbose; + } + } + print "\n" if $verbose; + if ($differ) { + die "verification failed"; + } + } +} + +sub hstest_verify2 { + $dbh->do("use $db"); + my $sth = $dbh->prepare("select * from $table order by k"); + $sth->execute(); + my $arr = $sth->fetchall_arrayref(); + my $hsresa = $hspool->index_find_multi($db, $table, "PRIMARY", + "k,fc30,ft", [ [ -1, ">=", [ 0 ], $tablesize, 0 ] ]); + my $hsres = $hsresa->[0]; + for (my $i = 0; $i < $tablesize; ++$i) { + my $rec = $arr->[$i]; + my $differ = 0; + print "REC:" if $verbose; + for (my $j = 0; $j < 3; ++$j) { + my $fld = $rec->[$j]; + my $hsidx = $i * 3 + $j; + my $hsfld = $hsres->[$hsidx]; + if ($hsfld ne $fld) { + $differ = 1; + } + if ($differ) { + print " $fld:$hsfld" if $verbose; + } else { + print " $hsfld" if $verbose; + } + } + print "\n" if $verbose; + if ($differ) { + die "verification failed"; + } + } +} + +sub hashref_to_str { + my $href = $_[0]; + my $r = ''; + for my $k (sort keys %$href) { + my $v = $href->{$k}; + $r .= "($k=>$v)"; + } + return $r; +} + +sub hstest_verify3 { + $dbh->do("use $db"); + my $sth = $dbh->prepare("select * from $table order by k"); + $sth->execute(); + my $hsres_t = $hspool->index_find($db, $table, "PRIMARY", "k,fc30,ft", + ">=", [ 0 ], $tablesize, 0); + my $hsres = DB::HandlerSocket::Pool::result_single_to_hasharr( + [ 'k', 'fc30', 'ft' ], $hsres_t); + for (my $i = 0; $i < $tablesize; ++$i) { + my $mystr = hashref_to_str($sth->fetchrow_hashref()); + my $hsstr = hashref_to_str($hsres->[$i]); + if ($mystr ne $hsstr) { + print "DIFF my=[$mystr] hs=[$hsstr]\n" if $verbose; + die "verification failed"; + } else { + print "OK $hsstr\n" if $verbose; + } + } +} + +sub hstest_verify4 { + $dbh->do("use $db"); + my $sth = $dbh->prepare("select * from $table order by k"); + $sth->execute(); + my $hsres_t = $hspool->index_find($db, $table, "PRIMARY", "k,fc30,ft", + ">=", [ 0 ], $tablesize, 0); + my $hsres = DB::HandlerSocket::Pool::result_single_to_hashhash( + [ 'k', 'fc30', 'ft' ], 'k', $hsres_t); + my $rechash = $sth->fetchall_hashref('k'); + while (my ($k, $href) = each (%$rechash)) { + my $mystr = hashref_to_str($href); + my $hsstr = hashref_to_str($hsres->{$k}); + if ($mystr ne $hsstr) { + print "DIFF my=[$mystr] hs=[$hsstr]\n" if $verbose; + die "verification failed"; + } else { + print "OK $hsstr\n" if $verbose; + } + } +} + +sub hstest_clean { + $hspool->clear_pool(); + $dbh->do("drop database if exists $db"); +} + diff --git a/plugin/handler_socket/client/hstest.cpp b/plugin/handler_socket/client/hstest.cpp new file mode 100644 index 00000000..b5551fed --- /dev/null +++ b/plugin/handler_socket/client/hstest.cpp @@ -0,0 +1,1532 @@ + +// vim:sw=2:ai + +#include <signal.h> +#include <sys/time.h> +#include <stdio.h> +#include <string.h> +#include <vector> +#include <stdlib.h> +#include <memory> +#include <errno.h> +#include <mysql.h> +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "util.hpp" +#include "auto_ptrcontainer.hpp" +#include "socket.hpp" +#include "thread.hpp" +#include "hstcpcli.hpp" + +#if __GNUC__ >= 4 +long atomic_exchange_and_add(volatile long *valp, long c) +{ + return __sync_fetch_and_add(valp, c); +} +#else +#include <bits/atomicity.h> +using namespace __gnu_cxx; +long atomic_exchange_and_add(volatile long *valp, long c) +{ + return __exchange_and_add((volatile _Atomic_word *)valp, c); +} +#endif + +namespace dena { + +struct auto_mysql : private noncopyable { + auto_mysql() : db(0) { + reset(); + } + ~auto_mysql() { + if (db) { + mysql_close(db); + } + } + void reset() { + if (db) { + mysql_close(db); + } + if ((db = mysql_init(0)) == 0) { + fatal_abort("failed to initialize mysql client"); + } + } + operator MYSQL *() const { return db; } + private: + MYSQL *db; +}; + +struct auto_mysql_res : private noncopyable { + auto_mysql_res(MYSQL *db) { + res = mysql_store_result(db); + } + ~auto_mysql_res() { + if (res) { + mysql_free_result(res); + } + } + operator MYSQL_RES *() const { return res; } + private: + MYSQL_RES *res; +}; + +struct auto_mysql_stmt : private noncopyable { + auto_mysql_stmt(MYSQL *db) { + stmt = mysql_stmt_init(db); + } + ~auto_mysql_stmt() { + if (stmt) { + mysql_stmt_close(stmt); + } + } + operator MYSQL_STMT *() const { return stmt; } + private: + MYSQL_STMT *stmt; +}; + +namespace { + +double +gettimeofday_double() +{ + struct timeval tv; + if (gettimeofday(&tv, 0) != 0) { + fatal_abort("gettimeofday"); + } + return static_cast<double>(tv.tv_usec) / 1000000 + tv.tv_sec; +} + +// unused +void +wait_close(int fd) +{ + char buf[1024]; + while (true) { + int r = read(fd, buf, sizeof(buf)); + if (r <= 0) { + break; + } + } +} + +// unused +void +gentle_close(int fd) +{ + int r = shutdown(fd, SHUT_WR); + if (r != 0) { + return; + } + wait_close(fd); +} + +}; + +struct hstest_shared { + config conf; + socket_args arg; + int verbose; + size_t loop; + size_t pipe; + char op; + long num_threads; + mutable volatile long count; + mutable volatile long conn_count; + long wait_conn; + volatile char *keygen; + long keygen_size; + mutable volatile int enable_timing; + int usleep; + int dump; + hstest_shared() : verbose(0), loop(0), pipe(0), op('G'), num_threads(0), + count(0), conn_count(0), wait_conn(0), keygen(0), keygen_size(0), + enable_timing(0), usleep(0), dump(0) { } + void increment_count(unsigned int c = 1) const volatile { + atomic_exchange_and_add(&count, c); + } + void increment_conn(unsigned int c) const volatile { + atomic_exchange_and_add(&conn_count, c); + while (wait_conn != 0 && conn_count < wait_conn) { + sleep(1); + } + // fprintf(stderr, "wait_conn=%ld done\n", wait_conn); + } +}; + +struct hstest_thread { + struct arg_type { + size_t id; + const hstest_shared& sh; + bool watch_flag; + arg_type(size_t i, const hstest_shared& s, bool w) + : id(i), sh(s), watch_flag(w) { } + }; + hstest_thread(const arg_type& a) : arg(a), io_success_count(0), + op_success_count(0), response_min(99999), response_max(0), + response_sum(0), response_avg(0) { } + void operator ()(); + void test_1(); + void test_2_3(int test_num); + void test_4_5(int test_num); + void test_6(int test_num); + void test_7(int test_num); + void test_8(int test_num); + void test_9(int test_num); + void test_10(int test_num); + void test_11(int test_num); + void test_12(int test_num); + void test_21(int test_num); + void test_22(int test_num); + void test_watch(); + void sleep_if(); + void set_timing(double time_spent); + arg_type arg; + auto_file fd; + size_t io_success_count; + size_t op_success_count; + double response_min, response_max, response_sum, response_avg; +}; + +void +hstest_thread::test_1() +{ + char buf[1024]; + unsigned int seed = arg.id; + seed ^= arg.sh.conf.get_int("seed_xor", 0); + std::string err; + if (socket_connect(fd, arg.sh.arg, err) != 0) { + fprintf(stderr, "connect: %d %s\n", errno, strerror(errno)); + return; + } + const char op = arg.sh.op; + const int tablesize = arg.sh.conf.get_int("tablesize", 0); + for (size_t i = 0; i < arg.sh.loop; ++i) { + for (size_t j = 0; j < arg.sh.pipe; ++j) { + int k = 0, v = 0, len = 0; + if (op == 'G') { + k = rand_r(&seed); + v = rand_r(&seed); /* unused */ + if (tablesize != 0) { + k &= tablesize; + } + len = snprintf(buf, sizeof(buf), "%c\tk%d\n", op, k); + } else { + k = rand_r(&seed); + v = rand_r(&seed); + if (tablesize != 0) { + k &= tablesize; + } + len = snprintf(buf, sizeof(buf), "%c\tk%d\tv%d\n", op, k, v); + } + const int wlen = write(fd.get(), buf, len); + if (wlen != len) { + return; + } + } + size_t read_cnt = 0; + size_t read_pos = 0; + while (read_cnt < arg.sh.pipe) { + const int rlen = read(fd.get(), buf + read_pos, sizeof(buf) - read_pos); + if (rlen <= 0) { + return; + } + read_pos += rlen; + while (true) { + const char *const p = static_cast<const char *>(memchr(buf, '\n', + read_pos)); + if (p == 0) { + break; + } + ++read_cnt; + ++io_success_count; + arg.sh.increment_count(); + if (p != buf && buf[0] == '=') { + ++op_success_count; + } + const size_t rest_size = buf + read_pos - (p + 1); + if (rest_size != 0) { + memmove(buf, p + 1, rest_size); + } + read_pos = rest_size; + } + } + } +} + +void +hstest_thread::test_2_3(int test_num) +{ +#if 0 + char buf_k[128], buf_v[128]; + unsigned int seed = arg.id; + op_base_t op = static_cast<op_base_t>(arg.sh.op); + micli_ptr hnd; + if (test_num == 2) { + hnd = micli_i::create_remote(arg.sh.conf); + } else if (test_num == 3) { + // hnd = micli_i::create_inproc(arg.sh.localdb); + } + if (hnd.get() == 0) { + return; + } + for (size_t i = 0; i < arg.sh.loop; ++i) { + for (size_t j = 0; j < arg.sh.pipe; ++j) { + int k = 0, v = 0, klen = 0, vlen = 0; + k = rand_r(&seed); + klen = snprintf(buf_k, sizeof(buf_k), "k%d", k); + v = rand_r(&seed); /* unused */ + vlen = snprintf(buf_v, sizeof(buf_v), "v%d", v); + string_ref arr[2]; + arr[0] = string_ref(buf_k, klen); + arr[1] = string_ref(buf_v, vlen); + pstrarr_ptr rec(arr, 2); + if (hnd->execute(op, 0, 0, rec.get_const())) { + ++io_success_count; + arg.sh.increment_count(); + const dataset& res = hnd->get_result_ref(); + if (res.size() == 1) { + ++op_success_count; + } + } + } + } +#endif +} + +void +hstest_thread::test_4_5(int test_num) +{ +#if 0 + char buf_k[128], buf_v[8192]; + memset(buf_v, ' ', sizeof(buf_v)); + unsigned int seed = arg.id; + op_base_t op = static_cast<op_base_t>(arg.sh.op); + micli_ptr hnd; + if (test_num == 4) { + hnd = micli_i::create_remote(arg.sh.conf); + } else if (test_num == 5) { + hnd = micli_i::create_inproc(arg.sh.localdb); + } + if (hnd.get() == 0) { + return; + } + for (size_t i = 0; i < arg.sh.loop; ++i) { + for (size_t j = 0; j < arg.sh.pipe; ++j) { + int k = 0, klen = 0, vlen = 0; + k = i & 0x0000ffffUL; + if (k == 0) { + fprintf(stderr, "k=0\n"); + } + klen = snprintf(buf_k, sizeof(buf_k), "k%d", k); + vlen = rand_r(&seed) % 8192; + string_ref arr[2]; + arr[0] = string_ref(buf_k, klen); + arr[1] = string_ref(buf_v, vlen); + pstrarr_ptr rec(arr, 2); + if (hnd->execute(op, 0, 0, rec.get_const())) { + ++io_success_count; + const dataset& res = hnd->get_result_ref(); + if (res.size() == 1) { + ++op_success_count; + } + } + } + } +#endif +} + +void +hstest_thread::test_6(int test_num) +{ + int count = arg.sh.conf.get_int("count", 1); + auto_file fds[count]; + for (int i = 0; i < count; ++i) { + const double t1 = gettimeofday_double(); + std::string err; + if (socket_connect(fds[i], arg.sh.arg, err) != 0) { + fprintf(stderr, "id=%zu i=%d err=%s\n", arg.id, i, err.c_str()); + } + const double t2 = gettimeofday_double(); + if (t2 - t1 > 1) { + fprintf(stderr, "id=%zu i=%d time %f\n", arg.id, i, t2 - t1); + } + } +} + +void +hstest_thread::test_7(int num) +{ + /* + set foo 0 0 10 + 0123456789 + STORED + get foo + VALUE foo 0 10 + 0123456789 + END + get var + END + */ + char buf[1024]; + const int keep_connection = arg.sh.conf.get_int("keep_connection", 1); + unsigned int seed = arg.id; + seed ^= arg.sh.conf.get_int("seed_xor", 0); + const int tablesize = arg.sh.conf.get_int("tablesize", 0); + const char op = arg.sh.op; + for (size_t i = 0; i < arg.sh.loop; ++i) { + const double tm1 = gettimeofday_double(); + std::string err; + if (fd.get() < 0 && socket_connect(fd, arg.sh.arg, err) != 0) { + fprintf(stderr, "connect: %d %s\n", errno, strerror(errno)); + return; + } + for (size_t j = 0; j < arg.sh.pipe; ++j) { + int k = 0, v = 0, len = 0; + if (op == 'G') { + k = rand_r(&seed); + v = rand_r(&seed); /* unused */ + if (tablesize != 0) { + k &= tablesize; + } + len = snprintf(buf, sizeof(buf), "get k%d\r\n", k); + } else { + k = rand_r(&seed); + v = rand_r(&seed); + if (tablesize != 0) { + k &= tablesize; + } + char vbuf[1024]; + int vlen = snprintf(vbuf, sizeof(vbuf), + "v%d" + // "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + // "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + // "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + // "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + // "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + , v); + len = snprintf(buf, sizeof(buf), "set k%d 0 0 %d\r\n%s\r\n", + k, vlen, vbuf); + } + const int wlen = write(fd.get(), buf, len); + if (wlen != len) { + return; + } + } + size_t read_cnt = 0; + size_t read_pos = 0; + bool read_response_done = false; + bool expect_value = false; + while (!read_response_done) { + const int rlen = read(fd.get(), buf + read_pos, sizeof(buf) - read_pos); + if (rlen <= 0) { + return; + } + read_pos += rlen; + while (true) { + const char *const p = static_cast<const char *>(memchr(buf, '\n', + read_pos)); + if (p == 0) { + break; + } + ++read_cnt; + if (expect_value) { + expect_value = false; + } else if (p >= buf + 6 && memcmp(buf, "VALUE ", 6) == 0) { + expect_value = true; + ++op_success_count; + } else { + if (p == buf + 7 && memcmp(buf, "STORED\r", 7) == 0) { + ++op_success_count; + } + read_response_done = true; + } + const size_t rest_size = buf + read_pos - (p + 1); + if (rest_size != 0) { + memmove(buf, p + 1, rest_size); + } + read_pos = rest_size; + } + ++io_success_count; + } + arg.sh.increment_count(); + if (!keep_connection) { + fd.close(); + } + const double tm2 = gettimeofday_double(); + set_timing(tm2 - tm1); + sleep_if(); + } +} + +struct rec { + std::string key; + std::string value; +}; + +void +hstest_thread::test_8(int test_num) +{ +#if 0 + char buf_k[128], buf_v[128]; + unsigned int seed = arg.id; + // op_base_t op = static_cast<op_base_t>(arg.sh.op); + using namespace boost::multi_index; + typedef member<rec, std::string, &rec::key> rec_get_key; + typedef ordered_unique<rec_get_key> oui; + typedef multi_index_container< rec, indexed_by<oui> > mic; + #if 0 + typedef std::map<std::string, std::string> m_type; + m_type m; + #endif + mic m; + for (size_t i = 0; i < arg.sh.loop; ++i) { + for (size_t j = 0; j < arg.sh.pipe; ++j) { + int k = 0, v = 0, klen = 0, vlen = 0; + k = rand_r(&seed); + klen = snprintf(buf_k, sizeof(buf_k), "k%d", k); + v = rand_r(&seed); /* unused */ + vlen = snprintf(buf_v, sizeof(buf_v), "v%d", v); + const std::string ks(buf_k, klen); + const std::string vs(buf_v, vlen); + rec r; + r.key = ks; + r.value = vs; + m.insert(r); + // m.insert(std::make_pair(ks, vs)); + ++io_success_count; + ++op_success_count; + arg.sh.increment_count(); + } + } +#endif +} + +struct mysqltest_thread_initobj : private noncopyable { + mysqltest_thread_initobj() { + mysql_thread_init(); + } + ~mysqltest_thread_initobj() { + mysql_thread_end(); + } +}; + +void +hstest_thread::test_9(int test_num) +{ + /* create table hstest + * ( k varchar(255) not null, v varchar(255) not null, primary key(k)) + * engine = innodb; */ + auto_mysql db; + // mysqltest_thread_initobj initobj; + std::string err; + const char op = arg.sh.op; + const std::string suffix = arg.sh.conf.get_str("value_suffix", "upd"); + unsigned long long err_cnt = 0; + unsigned long long query_cnt = 0; + #if 0 + my_bool reconnect = 0; + if (mysql_options(db, MYSQL_OPT_RECONNECT, &reconnect) != 0) { + err = "mysql_options() failed"; + ++err_cnt; + return; + } + #endif + unsigned int seed = time(0) + arg.id + 1; + seed ^= arg.sh.conf.get_int("seed_xor", 0); + drand48_data randbuf; + srand48_r(seed, &randbuf); + const std::string mysql_host = arg.sh.conf.get_str("host", "localhost"); + const int mysql_port = arg.sh.conf.get_int("mysqlport", 3306); + const int num = arg.sh.loop; + const std::string mysql_user = arg.sh.conf.get_str("mysqluser", "root"); + const std::string mysql_passwd = arg.sh.conf.get_str("mysqlpass", ""); + const std::string mysql_dbname = arg.sh.conf.get_str("dbname", "hstest"); + const int keep_connection = arg.sh.conf.get_int("keep_connection", 1); + const int verbose = arg.sh.conf.get_int("verbose", 1); + const int tablesize = arg.sh.conf.get_int("tablesize", 10000); + const int moreflds = arg.sh.conf.get_int("moreflds", 0); + const std::string moreflds_prefix = arg.sh.conf.get_str( + "moreflds_prefix", "column0123456789_"); + const int use_handler = arg.sh.conf.get_int("handler", 0); + const int sched_flag = arg.sh.conf.get_int("sched", 0); + const int use_in = arg.sh.conf.get_int("in", 0); + const int ssps = use_in ? 0 : arg.sh.conf.get_int("ssps", 0); + std::string flds = "v"; + for (int i = 0; i < moreflds; ++i) { + char buf[1024]; + snprintf(buf, sizeof(buf), ",%s%d", moreflds_prefix.c_str(), i); + flds += std::string(buf); + } + int connected = 0; + std::auto_ptr<auto_mysql_stmt> stmt; + string_buffer wbuf; + for (int i = 0; i < num; ++i) { + const double tm1 = gettimeofday_double(); + const int flags = 0; + if (connected == 0) { + if (!mysql_real_connect(db, mysql_host.c_str(), + mysql_user.c_str(), mysql_user.empty() ? 0 : mysql_passwd.c_str(), + mysql_dbname.c_str(), mysql_port, 0, flags)) { + err = "failed to connect: " + std::string(mysql_error(db)); + if (verbose >= 1) { + fprintf(stderr, "e=[%s]\n", err.c_str()); + } + ++err_cnt; + return; + } + arg.sh.increment_conn(1); + } + int r = 0; + if (connected == 0 && use_handler) { + const char *const q = "handler hstest_table1 open"; + r = mysql_real_query(db, q, strlen(q)); + if (r != 0) { + err = 1; + } + } + if (connected == 0 && ssps) { + stmt.reset(new auto_mysql_stmt(db)); + const char *const q = "select v from hstest_table1 where k = ?"; + r = mysql_stmt_prepare(*stmt, q, strlen(q)); + if (r != 0) { + fprintf(stderr, "ssps err\n"); + ++err_cnt; + return; + } + } + connected = 1; + std::string result_str; + unsigned int err = 0; + unsigned int num_flds = 0, num_affected_rows = 0; + int got_data = 0; + char buf_query[16384]; + int buf_query_len = 0; + int k = 0, v = 0; + { + double kf = 0, vf = 0; + drand48_r(&randbuf, &kf); + drand48_r(&randbuf, &vf); + k = int(kf * tablesize); + v = int(vf * tablesize); + #if 0 + k = rand_r(&seed); + v = rand_r(&seed); + if (tablesize != 0) { + k %= tablesize; + } + #endif + if (op == 'G') { + if (use_handler) { + buf_query_len = snprintf(buf_query, sizeof(buf_query), + "handler hstest_table1 read `primary` = ( '%d' )", k); + // TODO: moreflds + } else if (ssps) { + // + } else if (use_in) { + wbuf.clear(); + char *p = wbuf.make_space(1024); + int len = snprintf(p, 1024, "select %s from hstest_table1 where k in ('%d'", flds.c_str(), k); + wbuf.space_wrote(len); + for (int j = 1; j < use_in; ++j) { + /* generate more key */ + drand48_r(&randbuf, &kf); + k = int(kf * tablesize); + p = wbuf.make_space(1024); + int len = snprintf(p, 1024, ", '%d'", k); + wbuf.space_wrote(len); + } + wbuf.append_literal(")"); + } else { + buf_query_len = snprintf(buf_query, sizeof(buf_query), + "select %s from hstest_table1 where k = '%d'", flds.c_str(), k); + } + } else if (op == 'U') { + buf_query_len = snprintf(buf_query, sizeof(buf_query), + "update hstest_table1 set v = '%d_%d%s' where k = '%d'", + v, k, suffix.c_str(), k); + } else if (op == 'R') { + buf_query_len = snprintf(buf_query, sizeof(buf_query), + "replace into hstest_table1 values ('%d', 'v%d')", k, v); + // TODO: moreflds + } + } + if (r == 0) { + if (ssps) { + MYSQL_BIND bind[1] = { }; + bind[0].buffer_type = MYSQL_TYPE_LONG; + bind[0].buffer = (char *)&k; + bind[0].is_null = 0; + bind[0].length = 0; + if (mysql_stmt_bind_param(*stmt, bind)) { + fprintf(stderr, "err: %s\n", mysql_stmt_error(*stmt)); + ++err_cnt; + return; + } + r = mysql_stmt_execute(*stmt); + // fprintf(stderr, "stmt exec\n"); + } else if (use_in) { + r = mysql_real_query(db, wbuf.begin(), wbuf.size()); + } else { + r = mysql_real_query(db, buf_query, buf_query_len); + // fprintf(stderr, "real query\n"); + } + ++query_cnt; + } + if (r != 0) { + err = 1; + } else if (ssps) { + if (verbose >= 0) { + char resbuf[1024]; + unsigned long res_len = 0; + MYSQL_BIND bind[1] = { }; + bind[0].buffer_type = MYSQL_TYPE_STRING; + bind[0].buffer = resbuf; + bind[0].buffer_length = sizeof(resbuf); + bind[0].length = &res_len; + if (mysql_stmt_bind_result(*stmt, bind)) { + fprintf(stderr, "err: %s\n", mysql_stmt_error(*stmt)); + ++err_cnt; + return; + } + if (mysql_stmt_fetch(*stmt)) { + fprintf(stderr, "err: %s\n", mysql_stmt_error(*stmt)); + ++err_cnt; + return; + } + if (!result_str.empty()) { + result_str += " "; + } + result_str += std::string(resbuf, res_len); + // fprintf(stderr, "SSPS RES: %s\n", result_str.c_str()); + got_data = 1; + } else { + got_data = 1; + } + } else { + auto_mysql_res res(db); + if (res != 0) { + if (verbose >= 0) { + num_flds = mysql_num_fields(res); + MYSQL_ROW row = 0; + while ((row = mysql_fetch_row(res)) != 0) { + got_data += 1; + unsigned long *const lengths = mysql_fetch_lengths(res); + if (verbose >= 2) { + for (unsigned int i = 0; i < num_flds; ++i) { + if (!result_str.empty()) { + result_str += " "; + } + result_str += std::string(row[i], lengths[i]); + } + } + } + } else { + MYSQL_ROW row = 0; + while ((row = mysql_fetch_row(res)) != 0) { + got_data += 1; + } + } + } else { + if (mysql_field_count(db) == 0) { + num_affected_rows = mysql_affected_rows(db); + } else { + err = 1; + } + } + } + if (verbose >= 2 || (verbose >= 1 && err != 0)) { + if (err) { + ++err_cnt; + const char *const errstr = mysql_error(db); + fprintf(stderr, "e=[%s] a=%u q=[%s]\n", errstr, + num_affected_rows, buf_query); + } else { + fprintf(stderr, "a=%u q=[%s] r=[%s]\n", num_affected_rows, buf_query, + result_str.c_str()); + } + } + if (err == 0) { + ++io_success_count; + if (num_affected_rows > 0 || got_data > 0) { + op_success_count += got_data; + } else { + if (verbose >= 1) { + fprintf(stderr, "k=%d numaff=%u gotdata=%d\n", + k, num_affected_rows, got_data); + } + } + arg.sh.increment_count(); + } + if (!keep_connection) { + if (stmt.get() != 0) { + stmt.reset(); + } + db.reset(); + connected = 0; + } + const double tm2 = gettimeofday_double(); + set_timing(tm2 - tm1); + sleep_if(); + if (sched_flag) { + sched_yield(); + } + } + if (verbose >= 1) { + fprintf(stderr, "thread finished (error_count=%llu)\n", err_cnt); + } +} + +void +hstest_thread::test_10(int test_num) +{ + const int keep_connection = arg.sh.conf.get_int("keep_connection", 1); + unsigned int seed = time(0) + arg.id + 1; + seed ^= arg.sh.conf.get_int("seed_xor", 0); + drand48_data randbuf; + srand48_r(seed, &randbuf); + std::string err; + int keepconn_count = 0; + const char op = arg.sh.op; + const int verbose = arg.sh.conf.get_int("verbose", 1); + const std::string suffix = arg.sh.conf.get_str("value_suffix", "upd"); + const int tablesize = arg.sh.conf.get_int("tablesize", 10000); + const int firstkey = arg.sh.conf.get_int("firstkey", 0); + const int sched_flag = arg.sh.conf.get_int("sched", 0); + const int moreflds = arg.sh.conf.get_int("moreflds", 0); + const std::string dbname = arg.sh.conf.get_str("dbname", "hstest"); + const std::string table = arg.sh.conf.get_str("table", "hstest_table1"); + const std::string index = arg.sh.conf.get_str("index", "PRIMARY"); + const std::string field = arg.sh.conf.get_str("field", "v"); + const int use_in = arg.sh.conf.get_int("in", 0); + const std::string moreflds_prefix = arg.sh.conf.get_str( + "moreflds_prefix", "column0123456789_"); + const int dump = arg.sh.dump; + const int nodup = arg.sh.conf.get_int("nodup", 0); + std::string moreflds_str; + for (int i = 0; i < moreflds; ++i) { + char sbuf[1024]; + snprintf(sbuf, sizeof(sbuf), ",%s%d", moreflds_prefix.c_str(), i); + moreflds_str += std::string(sbuf); + } + string_buffer wbuf; + char rbuf[16384]; + for (size_t i = 0; i < arg.sh.loop; ++i) { + int len = 0, rlen = 0, wlen = 0; + #if 0 + const double tm1 = gettimeofday_double(); + #endif + if (fd.get() < 0) { + if (socket_connect(fd, arg.sh.arg, err) != 0) { + fprintf(stderr, "connect: %d %s\n", errno, strerror(errno)); + return; + } + char *wp = wbuf.make_space(1024); + len = snprintf(wp, 1024, + "P\t1\t%s\t%s\tPRIMARY\t%s%s\n", dbname.c_str(), table.c_str(), + field.c_str(), moreflds_str.c_str()); + /* pst_num, db, table, index, retflds */ + wbuf.space_wrote(len); + wlen = write(fd.get(), wbuf.begin(), len); + if (len != wlen) { + fprintf(stderr, "write: %d %d\n", len, wlen); + return; + } + wbuf.clear(); + rlen = read(fd.get(), rbuf, sizeof(rbuf)); + if (rlen <= 0 || rbuf[rlen - 1] != '\n') { + fprintf(stderr, "read: rlen=%d errno=%d\n", rlen, errno); + return; + } + if (rbuf[0] != '0') { + fprintf(stderr, "failed to open table\n"); + return; + } + arg.sh.increment_conn(1); + } + const double tm1 = gettimeofday_double(); + for (size_t j = 0; j < arg.sh.pipe; ++j) { + int k = 0, v = 0; + { + while (true) { + double kf = 0, vf = 0; + drand48_r(&randbuf, &kf); + drand48_r(&randbuf, &vf); + k = int(kf * tablesize) + firstkey; + v = int(vf * tablesize) + firstkey; + if (k - firstkey < arg.sh.keygen_size) { + volatile char *const ptr = arg.sh.keygen + (k - firstkey); + // int oldv = __sync_fetch_and_or(ptr, 1); + int oldv = *ptr; + *ptr += 1; + if (nodup && oldv != 0) { + if (dump) { + fprintf(stderr, "retry\n"); + } + continue; + } + } else { + if (nodup) { + if (dump) { + fprintf(stderr, "retry2\n"); + } + continue; + } + } + size_t len = 0; + if (op == 'G') { + if (use_in) { + char *wp = wbuf.make_space(1024); + len = snprintf(wp, 1024, "1\t=\t1\t\t%d\t0\t@\t0\t%d\t%d", + use_in, use_in, k); + wbuf.space_wrote(len); + for (int j = 1; j < use_in; ++j) { + drand48_r(&randbuf, &kf); + k = int(kf * tablesize) + firstkey; + char *wp = wbuf.make_space(1024); + len = snprintf(wp, 1024, "\t%d", k); + wbuf.space_wrote(len); + } + wbuf.append_literal("\n"); + } else { + char *wp = wbuf.make_space(1024); + len = snprintf(wp, 1024, "1\t=\t1\t%d\n", k); + wbuf.space_wrote(len); + } + } else if (op == 'U') { + char *wp = wbuf.make_space(1024); + len = snprintf(wp, 1024, + "1\t=\t1\t%d\t1\t0\tU\t%d_%d%s\n", k, v, k, suffix.c_str()); + wbuf.space_wrote(len); + } + break; + } + } + } + wlen = write(fd.get(), wbuf.begin(), wbuf.size()); + if ((size_t) wlen != wbuf.size()) { + fprintf(stderr, "write: %d %d\n", (int)wbuf.size(), wlen); + return; + } + wbuf.clear(); + size_t read_cnt = 0; + size_t read_pos = 0; + while (read_cnt < arg.sh.pipe) { + rlen = read(fd.get(), rbuf + read_pos, sizeof(rbuf) - read_pos); + if (rlen <= 0) { + fprintf(stderr, "read: %d\n", rlen); + return; + } + read_pos += rlen; + while (true) { + const char *const nl = static_cast<const char *>(memchr(rbuf, '\n', + read_pos)); + if (nl == 0) { + break; + } + ++read_cnt; + ++io_success_count; + const char *t1 = static_cast<const char *>(memchr(rbuf, '\t', + nl - rbuf)); + if (t1 == 0) { + fprintf(stderr, "error \n"); + break; + } + ++t1; + const char *t2 = static_cast<const char *>(memchr(t1, '\t', + nl - t1)); + if (t2 == 0) { + if (verbose > 1) { + fprintf(stderr, "key: notfound \n"); + } + break; + } + ++t2; + if (t1 == rbuf + 2 && rbuf[0] == '0') { + if (op == 'G') { + ++op_success_count; + arg.sh.increment_count(); + } else if (op == 'U') { + const char *t3 = t2; + while (t3 != nl && t3[0] >= 0x10) { + ++t3; + } + if (t3 != t2 + 1 || t2[0] != '1') { + const std::string mess(t2, t3); + fprintf(stderr, "mod: %s\n", mess.c_str()); + } else { + ++op_success_count; + arg.sh.increment_count(); + if (arg.sh.dump && arg.sh.pipe == 1) { + fwrite(wbuf.begin(), wbuf.size(), 1, stderr); + } + } + } + } else { + const char *t3 = t2; + while (t3 != nl && t3[0] >= 0x10) { + ++t3; + } + const std::string mess(t2, t3); + fprintf(stderr, "err: %s\n", mess.c_str()); + } + const size_t rest_size = rbuf + read_pos - (nl + 1); + if (rest_size != 0) { + memmove(rbuf, nl + 1, rest_size); + } + read_pos = rest_size; + } + } + if (!keep_connection) { + fd.reset(); + arg.sh.increment_conn(-1); + } else if (keep_connection > 1 && ++keepconn_count > keep_connection) { + keepconn_count = 0; + fd.reset(); + arg.sh.increment_conn(-1); + } + const double tm2 = gettimeofday_double(); + set_timing(tm2 - tm1); + sleep_if(); + if (sched_flag) { + sched_yield(); + } + } + if (dump) { + fprintf(stderr, "done\n"); + } +} + +void +hstest_thread::sleep_if() +{ + if (arg.sh.usleep) { + struct timespec ts = { + arg.sh.usleep / 1000000, + (arg.sh.usleep % 1000000) * 1000 + }; + nanosleep(&ts, 0); + } +} + +void +hstest_thread::set_timing(double time_spent) +{ + response_min = std::min(response_min, time_spent); + response_max = std::max(response_max, time_spent); + response_sum += time_spent; + if (op_success_count != 0) { + response_avg = response_sum / op_success_count; + } +} + +void +hstest_thread::test_11(int test_num) +{ + const int keep_connection = arg.sh.conf.get_int("keep_connection", 1); + const int tablesize = arg.sh.conf.get_int("tablesize", 0); + unsigned int seed = arg.id; + seed ^= arg.sh.conf.get_int("seed_xor", 0); + std::string err; + hstcpcli_ptr cli; + for (size_t i = 0; i < arg.sh.loop; ++i) { + if (cli.get() == 0) { + cli = hstcpcli_i::create(arg.sh.arg); + cli->request_buf_open_index(0, "hstest", "hstest_table1", "", "v"); + /* pst_num, db, table, index, retflds */ + if (cli->request_send() != 0) { + fprintf(stderr, "reuqest_send: %s\n", cli->get_error().c_str()); + return; + } + size_t num_flds = 0; + if (cli->response_recv(num_flds) != 0) { + fprintf(stderr, "reuqest_recv: %s\n", cli->get_error().c_str()); + return; + } + cli->response_buf_remove(); + } + for (size_t j = 0; j < arg.sh.pipe; ++j) { + char buf[256]; + int k = 0, v = 0, len = 0; + { + k = rand_r(&seed); + v = rand_r(&seed); /* unused */ + if (tablesize != 0) { + k &= tablesize; + } + len = snprintf(buf, sizeof(buf), "%d", k); + } + const string_ref key(buf, len); + const string_ref op("=", 1); + cli->request_buf_exec_generic(0, op, &key, 1, 1, 0, string_ref(), 0, 0); + } + if (cli->request_send() != 0) { + fprintf(stderr, "reuqest_send: %s\n", cli->get_error().c_str()); + return; + } + size_t read_cnt = 0; + for (size_t j = 0; j < arg.sh.pipe; ++j) { + size_t num_flds = 0; + if (cli->response_recv(num_flds) != 0) { + fprintf(stderr, "reuqest_recv: %s\n", cli->get_error().c_str()); + return; + } + { + ++read_cnt; + ++io_success_count; + arg.sh.increment_count(); + { + ++op_success_count; + } + } + cli->response_buf_remove(); + } + if (!keep_connection) { + cli.reset(); + } + } +} + +void +hstest_thread::test_watch() +{ + const int timelimit = arg.sh.conf.get_int("timelimit", 0); + const int timelimit_offset = timelimit / 2; + int loop = 0; + double t1 = 0, t2 = 0; + size_t cnt_t1 = 0, cnt_t2 = 0; + size_t prev_cnt = 0; + double now_f = 0; + while (true) { + sleep(1); + const size_t cnt = arg.sh.count; + const size_t df = cnt - prev_cnt; + prev_cnt = cnt; + const double now_prev = now_f; + now_f = gettimeofday_double(); + if (now_prev != 0) { + const double rps = static_cast<double>(df) / (now_f - now_prev); + fprintf(stderr, "now: %zu cntdiff: %zu tdiff: %f rps: %f\n", + static_cast<size_t>(now_f), df, now_f - now_prev, rps); + } + if (timelimit != 0) { + if (arg.sh.wait_conn == 0 || arg.sh.conn_count >= arg.sh.wait_conn) { + ++loop; + } + if (loop == timelimit_offset) { + t1 = gettimeofday_double(); + cnt_t1 = cnt; + arg.sh.enable_timing = 1; + fprintf(stderr, "start timing\n"); + } else if (loop == timelimit_offset + timelimit) { + t2 = gettimeofday_double(); + cnt_t2 = cnt; + const size_t cnt_diff = cnt_t2 - cnt_t1; + const double tdiff = t2 - t1; + const double qps = cnt_diff / (tdiff != 0 ? tdiff : 1); + fprintf(stderr, "(%f: %zu, %f: %zu), %10.5f qps\n", + t1, cnt_t1, t2, cnt_t2, qps); + size_t keycnt = 0; + for (int i = 0; i < arg.sh.keygen_size; ++i) { + if (arg.sh.keygen[i]) { + ++keycnt; + } + } + fprintf(stderr, "keygen=%zu\n", keycnt); + break; + } + } + } +#if 0 + int loop = 0; + double t1 = 0, t2 = 0; + size_t cnt_t1 = 0, cnt_t2 = 0; + size_t prev_cnt = 0; + while (true) { + sleep(1); + const size_t cnt = arg.sh.count; + const size_t df = cnt - prev_cnt; + prev_cnt = cnt; + const size_t now = time(0); + fprintf(stderr, "%zu %zu\n", now, df); + if (timelimit != 0) { + ++loop; + if (loop == timelimit_offset) { + t1 = gettimeofday_double(); + cnt_t1 = cnt; + } else if (loop == timelimit_offset + timelimit) { + t2 = gettimeofday_double(); + cnt_t2 = cnt; + const size_t cnt_diff = cnt_t2 - cnt_t1; + const double tdiff = t2 - t1; + const double qps = cnt_diff / (tdiff != 0 ? tdiff : 1); + fprintf(stderr, "(%f: %zu, %f: %zu), %10.5f qps\n", + t1, cnt_t1, t2, cnt_t2, qps); + size_t keycnt = 0; + for (int i = 0; i < arg.sh.keygen_size; ++i) { + if (arg.sh.keygen[i]) { + ++keycnt; + } + } + fprintf(stderr, "keygen=%zu\n", keycnt); + _exit(0); + } + } + } +#endif +} + +void +hstest_thread::test_12(int test_num) +{ + /* NOTE: num_threads should be 1 */ + /* create table hstest + * ( k varchar(255) not null, v varchar(255) not null, primary key(k)) + * engine = innodb; */ + mysqltest_thread_initobj initobj; + auto_mysql db; + std::string err; + unsigned long long err_cnt = 0; + unsigned long long query_cnt = 0; + #if 0 + my_bool reconnect = 0; + if (mysql_options(db, MYSQL_OPT_RECONNECT, &reconnect) != 0) { + err = "mysql_options() failed"; + ++err_cnt; + return; + } + #endif + const std::string mysql_host = arg.sh.conf.get_str("host", "localhost"); + const int mysql_port = arg.sh.conf.get_int("mysqlport", 3306); + const unsigned int num = arg.sh.loop; + const size_t pipe = arg.sh.pipe; + const std::string mysql_user = arg.sh.conf.get_str("mysqluser", "root"); + const std::string mysql_passwd = arg.sh.conf.get_str("mysqlpass", ""); + const std::string mysql_dbname = arg.sh.conf.get_str("db", "hstest"); + const int keep_connection = arg.sh.conf.get_int("keep_connection", 1); + const int verbose = arg.sh.conf.get_int("verbose", 1); + const int use_handler = arg.sh.conf.get_int("handler", 0); + int connected = 0; + unsigned int k = 0; + string_buffer buf; + for (unsigned int i = 0; i < num; ++i) { + const int flags = 0; + if (connected == 0 && !mysql_real_connect(db, mysql_host.c_str(), + mysql_user.c_str(), mysql_user.empty() ? 0 : mysql_passwd.c_str(), + mysql_dbname.c_str(), mysql_port, 0, flags)) { + err = "failed to connect: " + std::string(mysql_error(db)); + if (verbose >= 1) { + fprintf(stderr, "e=[%s]\n", err.c_str()); + } + ++err_cnt; + return; + } + int r = 0; + if (connected == 0 && use_handler) { + const char *const q = "handler hstest open"; + r = mysql_real_query(db, q, strlen(q)); + if (r != 0) { + err = 1; + } + } + connected = 1; + std::string result_str; + unsigned int err = 0; + unsigned int num_flds = 0, num_affected_rows = 0; + int got_data = 0; + buf.clear(); + buf.append_literal("insert into hstest values "); + for (size_t j = 0; j < pipe; ++j) { + const unsigned int v = ~k; + if (j != 0) { + buf.append_literal(","); + } + char *wp = buf.make_space(64); + int buf_query_len = snprintf(wp, 64, "('k%u', 'v%u')", k, v); + buf.space_wrote(buf_query_len); + ++k; + } + if (r == 0) { + r = mysql_real_query(db, buf.begin(), buf.size()); + ++query_cnt; + } + if (r != 0) { + err = 1; + } else { + auto_mysql_res res(db); + if (res != 0) { + if (verbose >= 0) { + num_flds = mysql_num_fields(res); + MYSQL_ROW row = 0; + while ((row = mysql_fetch_row(res)) != 0) { + got_data = 1; + unsigned long *const lengths = mysql_fetch_lengths(res); + if (verbose >= 2) { + for (unsigned int i = 0; i < num_flds; ++i) { + if (!result_str.empty()) { + result_str += " "; + } + result_str += std::string(row[i], lengths[i]); + } + } + } + } + } else { + if (mysql_field_count(db) == 0) { + num_affected_rows = mysql_affected_rows(db); + } else { + err = 1; + } + } + } + if (verbose >= 2 || (verbose >= 1 && err != 0)) { + if (err) { + ++err_cnt; + const char *const errstr = mysql_error(db); + fprintf(stderr, "e=[%s] a=%u q=[%s]\n", errstr, + num_affected_rows, std::string(buf.begin(), buf.size()).c_str()); + } else { + fprintf(stderr, "a=%u q=[%s] r=[%s]\n", num_affected_rows, + std::string(buf.begin(), buf.size()).c_str(), + result_str.c_str()); + } + } + if (err == 0) { + ++io_success_count; + if (num_affected_rows > 0 || got_data > 0) { + ++op_success_count; + } + arg.sh.increment_count(pipe); + } + if (!keep_connection) { + db.reset(); + connected = 0; + } + } + if (verbose >= 1) { + fprintf(stderr, "thread finished (error_count=%llu)\n", err_cnt); + } +} + +void +hstest_thread::test_21(int num) +{ + /* fsync test */ + unsigned int id = arg.id; + std::string err; + #if 0 + if (socket_connect(fd, arg.sh.arg, err) != 0) { + fprintf(stderr, "connect: %d %s\n", errno, strerror(errno)); + return; + } + #endif + auto_file logfd; + char fname[1024]; + snprintf(fname, sizeof(fname), "synctest_%u", id); + int open_flags = O_WRONLY | O_CREAT | O_TRUNC | O_APPEND; + logfd.reset(open(fname, open_flags, 0644)); + if (logfd.get() < 0) { + fprintf(stderr, "open: %s: %d %s\n", fname, errno, strerror(errno)); + return; + } + char buf[1024]; + unsigned long long count = 0; + while (true) { + snprintf(buf, sizeof(buf), "%u %llu\n", id, count); + const size_t len = strlen(buf); + if (write(logfd.get(), buf, len) != (ssize_t)len) { + fprintf(stderr, "write: %s: %d %s\n", fname, errno, strerror(errno)); + return; + } + #if 0 + if (write(fd.get(), buf, len) != (ssize_t)len) { + fprintf(stderr, "write(sock): %d %s\n", errno, strerror(errno)); + return; + } + #endif + if (fdatasync(logfd.get()) != 0) { + fprintf(stderr, "fsync: %s: %d %s\n", fname, errno, strerror(errno)); + return; + } + ++count; + ++op_success_count; + arg.sh.increment_count(); + } +} + +void +hstest_thread::test_22(int num) +{ + /* dd if=/dev/zero of=dummy.dat bs=1024M count=100 */ + unsigned int id = arg.id; + std::string err; + auto_file filefd; + char fname[1024]; + snprintf(fname, sizeof(fname), "dummy.dat"); + int open_flags = O_RDONLY | O_DIRECT; + filefd.reset(open(fname, open_flags, 0644)); + if (filefd.get() < 0) { + fprintf(stderr, "open: %s: %d %s\n", fname, errno, strerror(errno)); + return; + } + char buf_x[4096 * 2]; + char *const buf = (char *)(size_t(buf_x + 4096) / 4096 * 4096); + unsigned long long count = 0; + drand48_data randbuf; + unsigned long long seed = time(0); + seed *= 10; + seed += id; + srand48_r(seed, &randbuf); + for (unsigned int i = 0; i < arg.sh.loop; ++i) { + double kf = 0; + drand48_r(&randbuf, &kf); + kf *= (209715200 / 1); + // fprintf(stderr, "v=%f\n", kf); + off_t v = static_cast<off_t>(kf); + v %= (209715200 / 1); + v *= (512 * 1); + const double tm1 = gettimeofday_double(); + const ssize_t r = pread(filefd.get(), buf, (512 * 1), v); + const double tm2 = gettimeofday_double(); + if (r < 0) { + fprintf(stderr, "pread: %s: %d %s\n", fname, errno, strerror(errno)); + return; + } + ++count; + ++op_success_count; + arg.sh.increment_count(); + set_timing(tm2 - tm1); + } +} + +void +hstest_thread::operator ()() +{ + if (arg.watch_flag) { + return test_watch(); + } + int test_num = arg.sh.conf.get_int("test", 1); + if (test_num == 1) { + test_1(); + } else if (test_num == 2 || test_num == 3) { + test_2_3(test_num); + } else if (test_num == 4 || test_num == 5) { + test_4_5(test_num); + } else if (test_num == 6) { + test_6(test_num); + } else if (test_num == 7) { + test_7(test_num); + } else if (test_num == 8) { + test_8(test_num); + } else if (test_num == 9) { + test_9(test_num); + } else if (test_num == 10) { + test_10(test_num); + } else if (test_num == 11) { + test_11(test_num); + } else if (test_num == 12) { + test_12(test_num); + } else if (test_num == 21) { + test_21(test_num); + } else if (test_num == 22) { + test_22(test_num); + } + const int halt = arg.sh.conf.get_int("halt", 0); + if (halt) { + fprintf(stderr, "thread halted\n"); + while (true) { + sleep(100000); + } + } + fprintf(stderr, "thread finished\n"); +} + +int +hstest_main(int argc, char **argv) +{ + ignore_sigpipe(); + hstest_shared shared; + parse_args(argc, argv, shared.conf); + shared.conf["port"] = shared.conf["hsport"]; + shared.arg.set(shared.conf); + shared.loop = shared.conf.get_int("num", 1000); + shared.pipe = shared.conf.get_int("pipe", 1); + shared.verbose = shared.conf.get_int("verbose", 1); + const int tablesize = shared.conf.get_int("tablesize", 0); + std::vector<char> keygen(tablesize); + shared.keygen = &keygen[0]; + shared.keygen_size = tablesize; + shared.usleep = shared.conf.get_int("usleep", 0); + shared.dump = shared.conf.get_int("dump", 0); + shared.num_threads = shared.conf.get_int("num_threads", 10); + shared.wait_conn = shared.conf.get_int("wait_conn", 0); + const std::string op = shared.conf.get_str("op", "G"); + if (op.size() > 0) { + shared.op = op[0]; + } + #if 0 + const int localdb_flag = shared.conf.get_int("local", 0); + if (localdb_flag) { + shared.localdb = database_i::create(shared.conf); + } + #endif + const int num_thrs = shared.num_threads; + typedef thread<hstest_thread> thread_type; + typedef std::auto_ptr<thread_type> thread_ptr; + typedef auto_ptrcontainer< std::vector<thread_type *> > thrs_type; + thrs_type thrs; + for (int i = 0; i < num_thrs; ++i) { + const hstest_thread::arg_type arg(i, shared, false); + thread_ptr thr(new thread<hstest_thread>(arg)); + thrs.push_back_ptr(thr); + } + for (size_t i = 0; i < thrs.size(); ++i) { + thrs[i]->start(); + } + thread_ptr watch_thread; + const int timelimit = shared.conf.get_int("timelimit", 0); + { + const hstest_thread::arg_type arg(0, shared, true); + watch_thread = thread_ptr(new thread<hstest_thread>(arg)); + watch_thread->start(); + } + size_t iocnt = 0, opcnt = 0; + double respmin = 999999, respmax = 0; + double respsum = 0; + if (timelimit != 0) { + watch_thread->join(); + } + for (size_t i = 0; i < thrs.size(); ++i) { + if (timelimit == 0) { + thrs[i]->join(); + } + iocnt += (*thrs[i])->io_success_count; + opcnt += (*thrs[i])->op_success_count; + respmin = std::min(respmin, (*thrs[i])->response_min); + respmax = std::max(respmax, (*thrs[i])->response_max); + respsum += (*thrs[i])->response_sum; + } + fprintf(stderr, "io_success_count=%zu op_success_count=%zu\n", iocnt, opcnt); + fprintf(stderr, "respmin=%f respmax=%f respsum=%f respavg=%f\n", + respmin, respmax, respsum, respsum / opcnt); + size_t keycnt = 0; + for (size_t i = 0; i < keygen.size(); ++i) { + if (keygen[i]) { + ++keycnt; + } + } + fprintf(stderr, "keycnt=%zu\n", keycnt); + _exit(0); + return 0; +} + +}; + +int +main(int argc, char **argv) +{ + return dena::hstest_main(argc, argv); +} + diff --git a/plugin/handler_socket/client/hstest.pl b/plugin/handler_socket/client/hstest.pl new file mode 100755 index 00000000..1363e153 --- /dev/null +++ b/plugin/handler_socket/client/hstest.pl @@ -0,0 +1,228 @@ +#!/usr/bin/env perl + +# vim:sw=8:ai:ts=8 + +use strict; +use warnings; + +use DBI; +use Net::HandlerSocket; + +my %conf = (); +for my $i (@ARGV) { + my ($k, $v) = split(/=/, $i); + $conf{$k} = $v; +} + +my $verbose = get_conf("verbose", 0); +my $actions_str = get_conf("actions", "hsread"); +my $tablesize = get_conf("tablesize", 10000); +my $db = get_conf("db", "hstest"); +my $table = get_conf("table", "hstest_table1"); +my $engine = get_conf("engine", "innodb"); +my $host = get_conf("host", "localhost"); +my $mysqlport = get_conf("mysqlport", 3306); +my $mysqluser = get_conf("mysqluser", "root"); +my $mysqlpass = get_conf("mysqlpass", ""); +my $hsport = get_conf("hsport", 9999); +my $loop = get_conf("loop", 10000); +my $op = get_conf("op", "="); +my $ssps = get_conf("ssps", 0); +my $num_moreflds = get_conf("moreflds", 0); +my $moreflds_prefix = get_conf("moreflds_prefix", "column0123456789_"); +my $keytype = get_conf("keytype", "varchar(32)"); +my $file = get_conf("file", undef); + +my $dsn = "DBI:MariaDB:database=;host=$host;port=$mysqlport" + . ";mariadb_server_prepare=$ssps"; +my $dbh = DBI->connect($dsn, $mysqluser, $mysqlpass, { RaiseError => 1 }); +my $hsargs = { 'host' => $host, 'port' => $hsport }; +my $cli = new Net::HandlerSocket($hsargs); + +my @actions = split(/,/, $actions_str); +for my $action (@actions) { + if ($action eq "table") { + print("TABLE $db.$table\n"); + $dbh->do("drop database if exists $db"); + $dbh->do("create database $db"); + $dbh->do("use $db"); + my $moreflds = get_createtbl_moreflds_str(); + $dbh->do( + "create table $table (" . + "k $keytype primary key" . + ",v varchar(32) not null" . + $moreflds . + ") character set utf8 collate utf8_bin " . + "engine = $engine"); + } elsif ($action eq "insert") { + print("INSERT $db.$table tablesize=$tablesize\n"); + $dbh->do("use $db"); + my $moreflds = get_insert_moreflds_str(); + for (my $i = 0; $i < $tablesize; $i += 100) { + my $qstr = "insert into $db.$table values"; + for (my $j = 0; $j < 100; ++$j) { + if ($j != 0) { + $qstr .= ","; + } + my $k = "" . ($i + $j); + my $v = "v" . int(rand(1000)) . ($i + $j); + $qstr .= "('$k', '$v'"; + for (my $j = 0; $j < $num_moreflds; ++$j) { + $qstr .= ",'$j'"; + } + $qstr .= ")"; + } + $dbh->do($qstr); + print "$i/$tablesize\n" if $i % 1000 == 0; + } + } elsif ($action eq "read") { + print("READ $db.$table op=$op loop=$loop\n"); + $dbh->do("use $db"); + my $moreflds = get_select_moreflds_str(); + my $sth = $dbh->prepare( + "select k,v$moreflds from $db.$table where k = ?"); + for (my $i = 0; $i < $loop; ++$i) { + my $k = "" . int(rand($tablesize)); + # print "k=$k\n"; + $sth->execute($k); + if ($verbose >= 10) { + print "RET:"; + while (my $ref = $sth->fetchrow_arrayref()) { + my $rk = $ref->[0]; + my $rv = $ref->[1]; + print " $rk $rv"; + } + print "\n"; + } + print "$i/$loop\n" if $i % 1000 == 0; + } + } elsif ($action eq "hsinsert") { + print("HSINSERT $db.$table tablesize=$tablesize\n"); + $cli->open_index(1, $db, $table, '', 'k,v'); + for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v = "v" . int(rand(1000)) . $i; + my $r = $cli->execute_insert(1, [ $k, $v ]); + if ($r->[0] != 0) { + die; + } + print "$i/$tablesize\n" if $i % 1000 == 0; + } + } elsif ($action eq "hsread") { + print("HSREAD $db.$table op=$op loop=$loop\n"); + my $moreflds = get_select_moreflds_str(); + $cli->open_index(1, $db, $table, '', "k,v$moreflds"); + for (my $i = 0; $i < $loop; ++$i) { + my $k = "" . int(rand($tablesize)); + # print "k=$k\n"; + my $r = $cli->execute_find(1, $op, [ $k ], 1, 0); + if ($verbose >= 10) { + my $len = scalar(@{$r}); + print "LEN=$len"; + for my $e (@{$r}) { + print " [$e]"; + } + print "\n"; + } + print "$i/$loop\n" if $i % 1000 == 0; + } + } elsif ($action eq "hsupdate") { + my $vbase = "v" . int(rand(1000)); + print("HSUPDATE $db.$table op=$op loop=$loop vbase=$vbase\n"); + $cli->open_index(1, $db, $table, '', 'v'); + for (my $i = 0; $i < $loop; ++$i) { + my $k = "" . int(rand($tablesize)); + my $v = $vbase . $i; + print "k=$k v=$v\n"; + my $r = $cli->execute_update(1, $op, [ $k ], 1, 0, + [ $v ]); + if ($verbose >= 10) { + print "UP k=$k v=$v\n"; + } + print "$i/$loop\n" if $i % 1000 == 0; + } + } elsif ($action eq "hsdelete") { + print("HSDELETE $db.$table op=$op loop=$loop\n"); + $cli->open_index(1, $db, $table, '', ''); + for (my $i = 0; $i < $loop; ++$i) { + my $k = "" . int(rand($tablesize)); + print "k=$k\n"; + my $r = $cli->execute_delete(1, $op, [ $k ], 1, 0); + if ($verbose >= 10) { + print "DEL k=$k\n"; + } + print "$i/$loop\n" if $i % 1000 == 0; + } + } elsif ($action eq "verify") { + verify_do(); + } +} + +sub verify_do { + my ($fail_cnt, $ok_cnt) = (0, 0); + my $sth = $dbh->prepare("select v from $db.$table where k = ?"); + use FileHandle; + my $fh = new FileHandle($file, "r"); + while (my $line = <$fh>) { + chomp($line); + my @vec = split(/\t/, $line); + my $k = $vec[3]; + my $v = $vec[7]; + next if (!defined($k) || !defined($v)); + # print "$k $v\n"; + $sth->execute($k); + my $aref = $sth->fetchrow_arrayref(); + if (!defined($aref)) { + print "FAILED: $k notfound\n"; + ++$fail_cnt; + } else { + my $gv = $aref->[0]; + if ($gv ne $v) { + print "FAILED: $k got=$gv expected=$v\n"; + ++$fail_cnt; + } else { + print "OK: $k $v $gv\n" if $verbose >= 10; + ++$ok_cnt; + } + } + } + print "OK=$ok_cnt FAIL=$fail_cnt\n"; +} + +sub get_conf { + my ($key, $def) = @_; + my $val = $conf{$key}; + if ($val) { + print "$key=$val\n"; + } else { + $val = $def; + $def ||= ''; + print "$key=$def(default)\n"; + } + return $val; +} + +sub get_createtbl_moreflds_str { + my $s = ""; + for (my $j = 0; $j < $num_moreflds; ++$j) { + $s .= ",$moreflds_prefix$j varchar(30)"; + } + return $s; +} + +sub get_select_moreflds_str { + my $s = ""; + for (my $i = 0; $i < $num_moreflds; ++$i) { + $s .= ",$moreflds_prefix$i"; + } + return $s; +} + +sub get_insert_moreflds_str { + my $s = ""; + for (my $i = 0; $i < $num_moreflds; ++$i) { + $s .= ",?"; + } + return $s; +} + diff --git a/plugin/handler_socket/client/hstest_hs.sh b/plugin/handler_socket/client/hstest_hs.sh new file mode 100755 index 00000000..1b9eee18 --- /dev/null +++ b/plugin/handler_socket/client/hstest_hs.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +exec ./hstest test=10 tablesize=10000 host=localhost hsport=9998 num=10000000 \ + num_threads=100 timelimit=10 $@ diff --git a/plugin/handler_socket/client/hstest_hs_more50.sh b/plugin/handler_socket/client/hstest_hs_more50.sh new file mode 100755 index 00000000..b7539c52 --- /dev/null +++ b/plugin/handler_socket/client/hstest_hs_more50.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +exec ./hstest test=10 key_mask=9999 host=localhost port=9998 num=10000000 \ + num_threads=100 timelimit=10 moreflds=50 $@ diff --git a/plugin/handler_socket/client/hstest_md.sh b/plugin/handler_socket/client/hstest_md.sh new file mode 100755 index 00000000..8129f884 --- /dev/null +++ b/plugin/handler_socket/client/hstest_md.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +./hstest test=7 key_mask=9999 host=localhost port=11211 num=10000 \ + num_threads=10 timelimit=10 op=R $@ +./hstest test=7 key_mask=9999 host=localhost port=11211 num=1000000 \ + num_threads=100 timelimit=10 op=G $@ + diff --git a/plugin/handler_socket/client/hstest_my.sh b/plugin/handler_socket/client/hstest_my.sh new file mode 100755 index 00000000..cf917cf4 --- /dev/null +++ b/plugin/handler_socket/client/hstest_my.sh @@ -0,0 +1,3 @@ +#!/bin/bash +exec ./hstest test=9 tablesize=9999 host=localhost mysqlport=3306 num=1000000 \ + num_threads=100 verbose=1 timelimit=10 $@ diff --git a/plugin/handler_socket/client/hstest_my_more50.sh b/plugin/handler_socket/client/hstest_my_more50.sh new file mode 100755 index 00000000..6782b5e8 --- /dev/null +++ b/plugin/handler_socket/client/hstest_my_more50.sh @@ -0,0 +1,3 @@ +#!/bin/bash +exec ./hstest test=9 key_mask=9999 host=localhost port=3306 num=1000000 \ + num_threads=100 verbose=1 timelimit=10 moreflds=50 $@ diff --git a/plugin/handler_socket/configure.ac b/plugin/handler_socket/configure.ac new file mode 100644 index 00000000..4395fcf1 --- /dev/null +++ b/plugin/handler_socket/configure.ac @@ -0,0 +1,144 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +#AC_PREREQ([2.63b]) +AC_INIT([handlersocket-plugin], [1.0.6], [https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/issues]) +AC_CONFIG_HEADERS([config.h]) +AM_INIT_AUTOMAKE([-Wall -Werror foreign]) +AC_CONFIG_SRCDIR([libhsclient/fatal.cpp]) +AC_CONFIG_MACRO_DIR([m4]) + +AC_PROG_CC +AC_PROG_CXX +AC_PROG_CPP +AC_PROG_LIBTOOL + +ac_mysql_debug= +AC_ARG_ENABLE(mysql-debug, + [AS_HELP_STRING([--enable-mysql-debug], [specify whether MySQL is build with DBUG_ON])],[ac_mysql_debug="$enableval"],[ac_mysql_debug=no]) +AC_MSG_CHECKING([if --enable-mysql-debug is specified]) +AC_MSG_RESULT($ac_mysql_debug) + +AC_DEFUN([CONFIG_OPTION_MYSQL],[ + AC_MSG_CHECKING([mysql source]) + + MYSQL_SOURCE_VERSION= + MYSQL_INC= + ac_mysql_source_dir= + AC_ARG_WITH([mysql-source], + [AS_HELP_STRING([--with-mysql-source=PATH], [MySQL source directory PATH])], + [ + ac_mysql_source_dir=`cd $withval && pwd` + if test -f "$ac_mysql_source_dir/sql/handler.h" ; then + MYSQL_INC="-I$ac_mysql_source_dir/sql" + MYSQL_INC="$MYSQL_INC -I$ac_mysql_source_dir/include" + MYSQL_INC="$MYSQL_INC -I$ac_mysql_source_dir/regex" + MYSQL_INC="$MYSQL_INC -I$ac_mysql_source_dir" + AC_SUBST(MYSQL_INC) + if test -f "$ac_mysql_source_dir/VERSION"; then + source "$ac_mysql_source_dir/VERSION" + MYSQL_SOURCE_VERSION="$MYSQL_VERSION_MAJOR.$MYSQL_VERSION_MINOR.$MYSQL_VERSION_PATCH" + else + if test -f "$ac_mysql_source_dir/configure.in"; then + MYSQL_SOURCE_VERSION=`cat $ac_mysql_source_dir/configure.in | grep "\[[MySQL Server\]]" | sed -e "s|.*\([[0-9]]\+\.[[0-9]]\+\.[[0-9]]\+[[0-9a-zA-Z\_\-]]*\).*|\1|"` + else + AC_MSG_ERROR([invalid MySQL source directory: $ac_mysql_source_dir]) + fi + fi + AC_MSG_RESULT([yes: Using $ac_mysql_source_dir, version $MYSQL_SOURCE_VERSION]) + else + AC_MSG_ERROR([invalid MySQL source directory: $ac_mysql_source_dir]) + fi + ], + [AC_MSG_ERROR([--with-mysql-source=PATH is required for standalone build])] + ) + + MYSQL_BIN_VERSION= + ac_mysql_config= + AC_ARG_WITH([mysql-bindir], + [AS_HELP_STRING([--with-mysql-bindir=PATH], [MySQL binary directory PATH. This should be the directory where mysql_config is located.])], + [ + mysql_bin_dir=`cd $withval 2> /dev/null && pwd || echo ""` + ac_mysql_config="$mysql_bin_dir/mysql_config" + ], + [ + AC_PATH_PROG([ac_mysql_config], [mysql_config]) + ] + ) + + AC_MSG_CHECKING([mysql binary]) + if test ! -x "$ac_mysql_config" ; then + AC_MSG_ERROR([mysql_config not found! You have to specify the directory where mysql_config resides to --with-mysql-bindir=PATH.]) + fi + + MYSQL_CFLAGS_ADD=`"$ac_mysql_config" --cflags` + MYSQL_CFLAGS="$MYSQL_CFLAGS $MYSQL_CFLAGS_ADD" + if test "$ac_mysql_debug" = "yes"; then + MYSQL_CFLAGS="$MYSQL_CFLAGS -DDBUG_ON -DENABLED_DEBUG_SYNC" + else + MYSQL_CFLAGS="$MYSQL_CFLAGS -DDBUG_OFF" + fi + AC_SUBST(MYSQL_CFLAGS) + + MYSQL_BIN_VERSION=`"$ac_mysql_config" --version` + AC_MSG_RESULT([yes: Using $ac_mysql_config, version $MYSQL_BIN_VERSION]) + + MYSQL_LIB=`"$ac_mysql_config" --libs_r` + LIB_DIR=`echo $MYSQL_LIB | sed -e "s|.*-L/|/|" | sed -e "s| .*||"` + # FIXME + if test a`basename "$LIB_DIR"` = amysql ; then + MYSQL_LIB="-L`dirname $LIB_DIR` $MYSQL_LIB" + # FIXME + fi + AC_SUBST(MYSQL_LIB) + + if test a$MYSQL_SOURCE_VERSION != a$MYSQL_BIN_VERSION ; then + AC_MSG_ERROR([MySQL source version does not match MySQL binary version]) + fi + + AC_MSG_CHECKING([mysql plugin dir]) + ac_mysql_plugin_dir= + AC_ARG_WITH([mysql-plugindir], + [AS_HELP_STRING([--with-mysql-plugindir=PATH], [MySQL plugin directory where handlersocket.so to be copied])], + [ + ac_mysql_plugin_dir=`cd $withval && pwd` + if test -d "$ac_mysql_plugin_dir/" ; then + PLUGIN_DIR="$ac_mysql_plugin_dir" + AC_SUBST(PLUGIN_DIR) + AC_MSG_RESULT([yes: Using $ac_mysql_plugin_dir]) + else + AC_MSG_ERROR([invalid MySQL plugin directory : $ac_mysql_plugin_dir]) + fi + ], + [ + LIB_DIR_TMP=`"$ac_mysql_config" --plugindir` + if test ! -d "$LIB_DIR_TMP"; then + LIB_DIR_TMP=`"$ac_mysql_config" --libs_r | sed -e "s|.*-L/|/|" | sed -e "s| .*||"`/plugin + # FIXME + fi + ac_mysql_plugin_dir=$LIB_DIR_TMP + PLUGIN_DIR="$ac_mysql_plugin_dir" + AC_SUBST(PLUGIN_DIR) + AC_MSG_RESULT([--with-mysql-plugindir was not set. Using $ac_mysql_plugin_dir]) + ] + ) +]) + +HANDLERSOCKET_SUBDIRS="libhsclient" +AC_ARG_ENABLE(handlersocket_server, + [ --enable-handlersocket-server build HandlerSocket plugin (defalut=yes)]) +if test "$enable_handlersocket_server" != "no"; then + CONFIG_OPTION_MYSQL + HANDLERSOCKET_SUBDIRS="libhsclient handlersocket client" +fi +AC_SUBST(HANDLERSOCKET_SUBDIRS) + +CFLAGS="$CFLAGS -Werror" +CXXFLAGS="$CXXFLAGS -Wall -g -fno-rtti -fno-exceptions -fPIC -DPIC" + +AC_CONFIG_FILES([Makefile + handlersocket/Makefile + libhsclient/Makefile + client/Makefile]) + +AC_OUTPUT diff --git a/plugin/handler_socket/docs-en/about-handlersocket.en.txt b/plugin/handler_socket/docs-en/about-handlersocket.en.txt new file mode 100644 index 00000000..73b9cab5 --- /dev/null +++ b/plugin/handler_socket/docs-en/about-handlersocket.en.txt @@ -0,0 +1,72 @@ + +----------------------------------------------------------------------------- +HandlerSocket plugin for MySQL + +Copyright (c) 2010 DeNA Co.,Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of DeNA Co.,Ltd. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY DeNA Co.,Ltd. "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DeNA Co.,Ltd. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +----------------------------------------------------------------------------- +About HandlerSocket + +HandlerSocket is a NoSQL plugin for MySQL. It works as a daemon inside the +mysqld process, accept tcp connections, and execute requests from clients. +HandlerSocket does not support SQL queries. Instead, it supports simple CRUD +operations on tables. + +Because of the following reasons, HandlerSocket is much faster than the +mysqld/libmysql pair in some circumstances: + + - HandlerSocket manipulates data without parsing SQL, which causes less + CPU usage. + - HandlerSocket reads many requests from clients and executes their + requests in bulk, which causes less CPU and disk usage. + - HandlerSocket client/server protocol is more compact than the + mysql/libmysql pair, which causes less network usage. + +The current version of HandlerSocket only works with GNU/Linux. The source +archive of HandlerSocket includes a C++ and a Perl client libraries. +Here is a list of other language bindings: + + - PHP + http://openpear.org/package/Net_HandlerSocket + http://github.com/tz-lom/HSPHP + http://code.google.com/p/php-handlersocket/ + - Java + http://code.google.com/p/handlersocketforjava/ + - Python + https://code.launchpad.net/~songofacandy/+junk/pyhandlersocket + - Ruby + https://github.com/winebarrel/ruby-handlersocket + https://github.com/miyucy/handlersocket + - JavaScript(Node.js) + https://github.com/koichik/node-handlersocket + +The home of HandlerSocket is here: + https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL + +More documents are available in docs-en/ and docs-ja/ directories. + diff --git a/plugin/handler_socket/docs-en/configuration-options.en.txt b/plugin/handler_socket/docs-en/configuration-options.en.txt new file mode 100644 index 00000000..60fb6d85 --- /dev/null +++ b/plugin/handler_socket/docs-en/configuration-options.en.txt @@ -0,0 +1,99 @@ + +----------------------------------------------------------------- +handlersocket_verbose (default = 10, min = 0, max = 10000) + + Specify the logging verboseness. + +----------------------------------------------------------------- +handlersocket_address (default = '') + + Specify the address to bind. If empty, it binds to 0.0.0.0. + +----------------------------------------------------------------- +handlersocket_port (default = '9998') + + Specify the port to bind. This option is for the listener for + read requests. If empty, the listener is disabled. + +----------------------------------------------------------------- +handlersocket_port_wr (default = '9999') + + Specify the port to bind. This option is for the listener for + write requests. If empty, the listener is disabled. + +----------------------------------------------------------------- +handlersocket_epoll (default = 1, min = 0, max = 1) + + Specify whether handlersocket uses epoll for I/O multiplexing. + +----------------------------------------------------------------- +handlersocket_threads (default = 16, min = 1, max = 3000) + + Specify the number of handlersocket worker threads. This option + is for the listener for read requests. Recommended value is + (the number of CPU cores * 2). + +----------------------------------------------------------------- +handlersocket_threads_wr (default = 1, min = 1, max = 3000) + + Specify the number of handlersocket worker threads. This option + is for the listener for write requests. Recommended value is 1. + +----------------------------------------------------------------- +handlersocket_timeout (default = 300, min = 30, max = 3600) + + Specify the socket timeout in seconds. + +----------------------------------------------------------------- +handlersocket_backlog (default = 32768, min = 5, max = 1000000) + + Specify the length of the listen backlog. + +----------------------------------------------------------------- +handlersocket_sndbuf (default = 0, min = 0, max = 1677216) + + Specify the maximum socket send buffer in bytes. If 0, the + system-wide default value is set. + +----------------------------------------------------------------- +handlersocket_rcvbuf (default = 0, min = 0, max = 1677216) + + Specify the maximum socket receive buffer in bytes. If 0, the + system-wide default value is set. + +----------------------------------------------------------------- +handlersocket_readsize (default = 0, min = 0, max = 1677216) + + Specify the minimum length of the handlersocket request buffer. + Larger value can make handlersocket faster for large requests, + but can consume memory. The default value is possibly 4096. + +----------------------------------------------------------------- +handlersocket_accept_balance (default = 0, min = 0, max = 10000) + + When this option is set to non-zero, handlersocket tries to + balance accepted connections among threads. Non-zero is + recommended if you use persistent connections (i.e., connection + pooling on the client side). + +----------------------------------------------------------------- +handlersocket_wrlock_timeout (default = 12, min = 0, max = 3600) + + Specify the lock timeout in seconds. When a write request is + performed, handlersocket acquires an advisory lock named + 'handlersocket_wr'. This option sets the timeout for the + locking. + +----------------------------------------------------------------- +handlersocket_plain_secret (default = '') + + When this option is specified, a plain-text authentication is + enabled for the listener for read requests. This option + specifies the secret key for the authentication. + +----------------------------------------------------------------- +handlersocket_plain_secret_wr (default = '') + + This option specifies the secret key for the listener for write + requests. + diff --git a/plugin/handler_socket/docs-en/installation.en.txt b/plugin/handler_socket/docs-en/installation.en.txt new file mode 100644 index 00000000..0a0616fa --- /dev/null +++ b/plugin/handler_socket/docs-en/installation.en.txt @@ -0,0 +1,92 @@ +1. Building Handlersocket + + Handlersocket mainly consists of libhsclient, handlersocket, and C++/Perl clients. libhsclient is a common library shared from both client and server(plugin). handlersocket is a MySQL daemon plugin. + To build Handlersocket, you need both MySQL source code and MySQL binary. It is not required to pre-build MySQL source code, but source itself is needed because Handlersocket depends on MySQL header files that only MySQL source distribution contains. MySQL binary is just a normal MySQL binary distribution. You can use official MySQL binaries provided by Oracle. + Since Handlersocket uses daemon plugin interface supported from MySQL 5.1, +MySQL 5.1 or higher version is required. + Please make sure that you use identical MySQL version between MySQL source +and MySQL binary. Otherwise you might encounter serious problems (i.e. server +crash, etc). + Here are steps to build Handlersocket. + +* Get MySQL source code + +* Get MySQL binary + +* Build Handlersocket + $ ./autogen.sh + $ ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin + + --with-mysql-source refers to the top of MySQL source directory (which +contains the VERSION file or the configure.in file), --with-mysql-bindir +refers to where MySQL binary executables (i.e. mysql_config) are located, +and --with-mysql-plugindir refers to a plugin directory where plugin +libraries (*.so) are installed. + + $ make + $ sudo make install + + Both libhsclient and the handlersocket plugin will be installed. + + +2. Using Handlersocket + +Append configuration options for handlersocket to my.cnf. + + [mysqld] + loose_handlersocket_port = 9998 + # the port number to bind to (for read requests) + loose_handlersocket_port_wr = 9999 + # the port number to bind to (for write requests) + loose_handlersocket_threads = 16 + # the number of worker threads (for read requests) + loose_handlersocket_threads_wr = 1 + # the number of worker threads (for write requests) + open_files_limit = 65535 + # to allow handlersocket accept many concurrent + # connections, make open_files_limit as large as + # possible. + +Log in to mysql as root, and execute the following query. + + mysql> install plugin handlersocket soname 'handlersocket.so'; + +If handlersocket.so is successfully installed, it starts +accepting connections on port 9998 and 9999. Running +'show processlist' should show handlersocket worker threads. + +----------------------------------------------------------------- +On the client side, you need to install libhsclient for c++ apps +and perl-Net-HandlerSocket for perl apps. They do not require +MySQL to compile. + + $ ./autogen.sh + $ ./configure --disable-handlersocket-server + $ make + $ sudo make install + $ cd perl-Net-HandlerSocket + $ perl Makefile.PL + $ make + $ sudo make install + +----------------------------------------------------------------- +Alternatively, you can use the rpm installation. If your OS +supports rpms, you can use the following commands to build and +install handlersocket rpm packages. + +(Server side, installs HandlerSocket plugin) + $ ./autogen.sh + $ ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin + $ make rpm_cli + $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm + $ make rpm_c + $ sudo rpm -U dist/RPMS/*/handlersocket*.rpm + +(Client side, installs client libraries) + $ ./autogen.sh + $ ./configure --disable-handlersocket-server + $ make rpm_cli + $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm + $ make rpm_perl + $ sudo rpm -U dist/RPMS/*/perl-Net-HandlerSocket*.rpm + diff --git a/plugin/handler_socket/docs-en/perl-client.en.txt b/plugin/handler_socket/docs-en/perl-client.en.txt new file mode 100644 index 00000000..cc913851 --- /dev/null +++ b/plugin/handler_socket/docs-en/perl-client.en.txt @@ -0,0 +1,134 @@ + +----------------------------------------------------------------- +To open a connection to the handlersocket plugin, you need to +create a Net::HandlerSocket object. + + use Net::HandlerSocket; + my $args = { host => 'localhost', port => 9998 }; + my $hs = new Net::HandlerSocket($args); + +----------------------------------------------------------------- +Before executing table operations, you need to open an index to +work with. + + my $err = $hs->open_index(3, 'database1', 'table1', 'PRIMARY', + 'f1,f2'); + die $hs->get_error() if $res->[0] != 0; + +The first argument for open_index is an integer value which is +used to identify an open table, which is only valid within the +same Net::HandlerSocket object. The 4th argument is the name of +index to open. If 'PRIMARY' is specified, the primary index is +open. The 5th argument is a comma-separated list of column names. + +----------------------------------------------------------------- +To read a record from a table using an index, call the +execute_single method. + + my $res = $hs->execute_single(3, '=', [ 'foo' ], 1, 0); + die $hs->get_error() if $res->[0] != 0; + shift(@$res); + +The first argument must be an integer which has specified as the +first argument for open_index on the same Net::HandlerSocket +object. The second argument specifies the search operation. The +current version of handlersocket supports '=', '>=', '<=', '>', +and '<'. The 3rd argument specifies the key to find, which must +an arrayref whose length is equal to or smaller than the number +of key columns of the index. The 4th and the 5th arguments +specify the maximum number of records to be retrieved, and the +number of records skipped before retrieving records. The columns +to be retrieved are specified by the 5th argument for the +corresponding open_index call. + +The execute_single method always returns an arrayref. The first +element is the error code, which is 0 when no error is occurred. +The remaining are the field values. If more than one record is +returned, it is flatten to an 1-dimensional array. For example, +when 5 records that have 3 columns are returned, you can retrieve +values using the following code. + + die $hs->get_error() if $res->[0] != 0; + shift(@$res); + for (my $row = 0; $row < 5; ++$row) { + for (my $col = 0; $col < 3; ++$col) { + my $value = $res->[$row * 5 + $col]; + # ... + } + } + +----------------------------------------------------------------- +To update or delete records, you need to specify more arguments +for the execute_single method. Note that the Net::HandlerSocket +object must be connected to a handlersocket worker for write +operations, which is port 9999 by default. +(For safety, the port 9998 only allows read operations, and the +port 9999 allows write operations also. The port 9999 allows +read operations too, but slower than 9998 because of record +locking etc.. Port numbers can be changed using the +'handlersocket_port' and the 'handlersocket_port_wr' +configuration options of mysqld.) + + my $args = { host => 'localhost', port => 9999 }; + my $hs = new Net::HandlerSocket($args); + + my $res = $hs->execute_single(3, '=', [ 'bar' ], 1, 0, 'U', + [ 'fubar', 'hoge' ]); + die $hs->get_error() if $res->[0] != 0; + my $num_updated_rows = $res->[1]; + + my $res = $hs->execute_single(3, '=', [ 'baz' ], 1, 0, 'D'); + die $hs->get_error() if $res->[0] != 0; + my $num_deleted_rows = $res->[1]; + +The 6th argument for execute_single specifies the modification +operation. The current version supports 'U' and 'D'. For the 'U' +operation, the 7th argument specifies the new value for the row. +The columns to be modified are specified by the 5th argument for +the corresponding open_index call. For the 'D' operation, the +7th argument can be omitted. + +----------------------------------------------------------------- +The execute_single method can be used for inserting records also. + + my $res = $hs->execute_single(3, '+', [ 'foo', 'bar', 'baz' ]); + die $hs->get_error() if $res->[0] != 0; + +The 3rd argument must be an arrayref whose elements correspond to +the 5th argument for the corresponding open_index call. If there +is a column which is not appeared in the 5th argument for the +open_index, the default value for the column is set. + +----------------------------------------------------------------- +Multiple operations can be executed in a single call. Executing +multiple operations in a single call is much faster than +executing them separatedly. + + my $rarr = $hs->execute_multi([ + [ 0, '>=', [ 'foo' ], 5, 0 ], + [ 2, '=', [ 'bar' ], 1, 0 ], + [ 4, '<', [ 'baz' ], 10, 5 ], + ]); + for my $res (@$rarr) { + die $hs->get_error() if $res->[0] != 0; + shift(@$res); + # ... + } + +----------------------------------------------------------------- +If handlersocket is configured to authenticate client connections +(ie., handlersocket_plain_secret or handlersocket_plain_secret_wr +is set), a client must call 'auth' method before any other +methods. + + my $res = $hs->auth('password'); + die $hs->get_error() if $res->[0] != 0; + +----------------------------------------------------------------- +When an error is occurred, the first element of the returned +arrayref becomes a non-zero value. A negative value indicates +that an I/O error is occurred and the Net::HandlerSocket object +should be disposed. A positive value means that the connection is +still active and the Net::HandlerSocket object can be reused +later. + diff --git a/plugin/handler_socket/docs-en/protocol.en.txt b/plugin/handler_socket/docs-en/protocol.en.txt new file mode 100644 index 00000000..3518be36 --- /dev/null +++ b/plugin/handler_socket/docs-en/protocol.en.txt @@ -0,0 +1,205 @@ + +---------------------------------------------------------------------------- +The HandlerSocket protocol + +---------------------------------------------------------------------------- +Basic syntax + +- The HandlerSocket protocol is line-based. Each line ends with LF(0x0a). +- Each line consists a concatenation of tokens separated by HT(0x09). +- A token is either NULL or an encoded string. Note that you need to + distinguish NULL from an empty string, as most DBMs does so. +- NULL is expressed as a single NUL(0x00). +- An encoded string is a string with the following encoding rules. + - Characters in the range [0x10 - 0xff] are encoded as itselves. + - A character in the range [0x00 - 0x0f] is prefixed by 0x01 and + shifted by 0x40. For example, 0x03 is encoded as 0x01 0x43. +- Note that a string can be empty. A continuation of 0x09 0x09 means that + there is an empty string between them. A continuation of 0x09 0x0a means + that there is an empty string at the end of the line. + +---------------------------------------------------------------------------- +Request and Response + +- The HandlerSocket protocol is a simple request/response protocol. After a + connection is established, the client side sends a request, and then the + server side sends a response. +- A request/response consists of a single line. +- Requests can be pipelined; That is, you can send multiple requests (ie. + lines) at one time, and receive responses for them at one time. + +---------------------------------------------------------------------------- +Opening index + +The 'open_index' request has the following syntax. + + P <indexid> <dbname> <tablename> <indexname> <columns> [<fcolumns>] + +- <indexid> is a number in decimal. +- <dbname>, <tablename>, and <indexname> are strings. To open the primary + key, use PRIMARY as <indexname>. +- <columns> is a comma-separated list of column names. +- <fcolumns> is a comma-separated list of column names. This parameter is + optional. + +Once an 'open_index' request is issued, the HandlerSocket plugin opens the +specified index and keep it open until the client connection is closed. Each +open index is identified by <indexid>. If <indexid> is already open, the old +open index is closed. You can open the same combination of <dbname> +<tablename> <indexname> multiple times, possibly with different <columns>. +For efficiency, keep <indexid> small as far as possible. + +---------------------------------------------------------------------------- +Getting data + +The 'find' request has the following syntax. + + <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] + +LIM is a sequence of the following parameters. + + <limit> <offset> + +IN is a sequence of the following parameters. + + @ <icol> <ivlen> <iv1> ... <ivn> + +FILETER is a sequence of the following parameters. + + <ftyp> <fop> <fcol> <fval> + +- <indexid> is a number. This number must be an <indexid> specified by a + 'open_index' request executed previously on the same connection. +- <op> specifies the comparison operation to use. The current version of + HandlerSocket supports '=', '>', '>=', '<', and '<='. +- <vlen> indicates the length of the trailing parameters <v1> ... <vn>. This + must be smaller than or equal to the number of index columns specified by + the <indexname> parameter of the corresponding 'open_index' request. +- <v1> ... <vn> specify the index column values to fetch. +- LIM is optional. <limit> and <offset> are numbers. When omitted, it works + as if 1 and 0 are specified. These parameter works like LIMIT of SQL. + These values don't include the number of records skipped by a filter. +- IN is optional. It works like WHERE ... IN syntax of SQL. <icol> must be + smaller than the number of index columns specified by the <indexname> + parameter of the corresponding 'open_index' request. If IN is specified in + a find request, the <icol>-th parameter value of <v1> ... <vn> is ignored. +- FILTERs are optional. A FILTER specifies a filter. <ftyp> is either 'F' + (filter) or 'W' (while). <fop> specifies the comparison operation to use. + <fcol> must be smaller than the number of columns specified by the + <fcolumns> parameter of the corresponding 'open_index' request. Multiple + filters can be specified, and work as the logical AND of them. The + difference of 'F' and 'W' is that, when a record does not meet the + specified condition, 'F' simply skips the record, and 'W' stops the loop. + +---------------------------------------------------------------------------- +Updating/Deleting data + +The 'find_modify' request has the following syntax. + + <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] MOD + +MOD is a sequence of the following parameters. + + <mop> <m1> ... <mk> + +- <mop> is 'U' (update), '+' (increment), '-' (decrement), 'D' (delete), + 'U?', '+?', '-?', or 'D?'. If the '?' suffix is specified, it returns + the contents of the records before modification (as if it's a 'find' + request), instead of the number of modified records. +- <m1> ... <mk> specifies the column values to set. The length of <m1> ... + <mk> must be smaller than or equal to the length of <columns> specified by + the corresponding 'open_index' request. If <mop> is 'D', these parameters + are ignored. If <mop> is '+' or '-', values must be numeric. If <mop> is + '-' and it attempts to change a column value from negative to positive or + positive to negative, the column value is not modified. + +---------------------------------------------------------------------------- +Inserting data + +The 'insert' request has the following syntax. + + <indexid> + <vlen> <v1> ... <vn> + +- <vlen> indicates the length of the trailing parameters <v1> ... <vn>. This + must be smaller than or equal to the length of <columns> specified by the + corresponding 'open_index' request. +- <v1> ... <vn> specify the column values to set. For columns not in + <columns>, the default values for each column are set. + +---------------------------------------------------------------------------- +Authentication + +The 'auth' request has the following syntax. + + A <atyp> <akey> + +- <atyp> must be '1' +- An 'auth' request succeeds iff <akey> is the correct secret specified by + the 'handlersocket_plain_secret' or 'handlersocket_plain_secret_rw'. +- If an authentication is enabled for a listener, any other requests on a + connection fail before an 'auth' request succeeded on the connection. + +---------------------------------------------------------------------------- +Response syntax + +HandlerSocket returns a response of the following syntax for each request. + + <errorcode> <numcolumns> <r1> ... <rn> + +- <errorcode> indicates whether the request has successfully executed or not. + '0' means success. Non-zero means an error. +- <numcolumns> indicates the number of columns of the result set. +- <r1> ... <rn> is the result set. The length of <r1> ... <rn> is always a + multiple of <numcolumns>. It is possible that <r1> ... <rn> is empty. + +If <errorcode> is non-zero, <numcolumns> is always 1 and <r1> indicates a +human-readable error message, though sometimes <r1> is not provided. + +---------------------------------------------------------------------------- +Response for 'open_index' + +If 'open_index' is succeeded, HandlerSocket returns a line of the following +syntax. + + 0 1 + +---------------------------------------------------------------------------- +Response for 'find' + +If 'find' is succeeded, HandlerSocket returns a line of the following +syntax. + + 0 <numcolumns> <r1> ... <rn> + +- <numcolumns> always equals to the length of <columns> of the corresponding + 'open_index' request. +- <r1> ... <rn> is the result set. If N rows are found, the length of <r1> + ... <rn> becomes ( <numcolumns> * N ). + +---------------------------------------------------------------------------- +Response for 'find_modify' + +If 'find_modify' is succeeded, HandlerSocket returns a line of the following +syntax. + + 0 1 <nummod> + +- <nummod> is the number of modified rows. +- As an exception, if the '?' suffix is specified in <mop>, a response has + the syntax of a response for 'find' instead. + +---------------------------------------------------------------------------- +Response for 'insert' + +If 'insert' is succeeded, HanderSocket returns a line of the following +syntax. + + 0 1 + +---------------------------------------------------------------------------- +Response for 'auth' + +If 'auth' is succeeded, HanderSocket returns a line of the following syntax. + + 0 1 + diff --git a/plugin/handler_socket/docs-ja/about-handlersocket.ja.txt b/plugin/handler_socket/docs-ja/about-handlersocket.ja.txt new file mode 100644 index 00000000..2a152e87 --- /dev/null +++ b/plugin/handler_socket/docs-ja/about-handlersocket.ja.txt @@ -0,0 +1,51 @@ + + +----------------------------------------------------------------- +ソースコードの利用にあたっての免責事項 + +本ソフトウェアの開発者および株式会社ディー・エヌ・エーは、本フト +ウェアの不稼動、稼動不良を含む法律上の瑕疵担保責任、その他保証責 +任を負わないものとします。また、本ソフトウエアの開発者および株式 +会社ディー・エヌ・エーは、本ソフトウェアの商品性、またはお客様の +特定の目的に対する適合性について、いかなる保証も負わないものとし +ます。 + +----------------------------------------------------------------- +handlersocket pluginについて + +mysqlサーバに常駐し、innodb等のストレージエンジンへの直接のアクセ +スを提供するプラグインです。handlersocketプラグインは自前のリス +ナーを持ち、専用のクライアントライブラリ(libhsclient)を使ってそれ +にアクセスします。 + +mysqlの標準クライアントライブラリ(libmysql)を使ったアクセスと比べ +て、以下のような利点があります。 +・接続あたりに消費するリソースが少ないため、同時接続数が事実上無 + 制限。したがって接続数を気にせず持続接続を使えます。 +・高速(単純な参照クエリで3倍〜10倍程度)。 +・通信プロトコルがコンパクト。libmysqlを使うとデータ転送時にレ + コード名などが付随するために通信内容が冗長ですが、libhsclientで + はデータのみが転送されるため、帯域消費が少なくなります。場合に + よっては10倍以上libmysqlのほうが冗長になります。 + +現在のバージョンでは以下のような処理をサポートしています。 +・指定された索引について、指定された値と完全一致するようなレコー + ドを取得。(SELECT ??? FROM tbl WHERE k1 = v1 AND k2 = v2...)。 + 索引を使わない検索はサポートしていません。 +・指定された索引について、指定された値の位置の前後のレコードを取 + 得。(SELECT ??? FROM tbl WHERE k1 >= v1 LIMIT 100) +・前述のような手段で取得したレコードに対するUPDATEとDELETE +・レコードのINSERT + +以下のような言語をサポートします。 +・C++。libhsclientをリンクします。 +・Perl。Net::HandlerSocketをuseします。 + +現在のバージョンではGNU/Linuxでのみ動作します。 + +----------------------------------------------------------------- +既知の問題 + +・killでhandlersocketスレッドを殺すと、スレッド数が減ったまま回復 + しません。 + diff --git a/plugin/handler_socket/docs-ja/installation.ja.txt b/plugin/handler_socket/docs-ja/installation.ja.txt new file mode 100644 index 00000000..0e8f3513 --- /dev/null +++ b/plugin/handler_socket/docs-ja/installation.ja.txt @@ -0,0 +1,88 @@ + +----------------------------------------------------------------- +HandlerSocketプラグインのビルド方法(RPMを使わない方法) + +以下のようにしてconfigureを実行します。 + + $ ./autogen.sh + $ ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin + +ここで--with-mysql-sourceにはMySQLのソースコードのトップディレク +トリを指定します(そこにVERSIONファイルかconfigure.inファイルがなく +てはなりません)。--with-mysql-bindirにはインストール済みのMySQL +のmysql_configコマンドが有るディレクトリを指定します。 +その後以下のようにビルド・インストールします。 + + $ make + $ sudo make install + +----------------------------------------------------------------- +クライアントライブラリのビルド方法(RPMを使わない方法) + +クライアントライブラリをビルドする際には、MySQLのソースコードは +必要ありません。またMySQLがインストールされている必要もありません。 + + $ ./autogen.sh + $ ./configure --disable-handlersocket-server + $ make + $ sudo make install + $ cd perl-Net-HandlerSocket + $ perl Makefile.PL + $ make + $ sudo make install + +----------------------------------------------------------------- +ビルド方法(RPM) + +以下のように実行すれば、rpmパッケージがビルド&インストールされま +す。 + +(MySQLサーバ側、HandlerSocketプラグインをインストールする) + $ ./autogen.sh + $ ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin + $ make rpm_cli + $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm + $ make rpm_c + $ sudo rpm -U dist/RPMS/*/handlersocket*.rpm + +(クライアント側、クライアントライブラリをインストールする) + $ ./autogen.sh + $ ./configure --disable-handlersocket-server + $ make rpm_cli + $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm + $ make rpm_perl + $ sudo rpm -U dist/RPMS/*/perl-Net-HandlerSocket*.rpm + +----------------------------------------------------------------- +起動 + +mysqlを起動した状態で、mysqlの設定ファイル(my.cnf等)に以下の内容を +追加します。 + + [mysqld] + handlersocket_port = 9998 + # handlersocketが接続を受け付けるポート(参照系リクエスト用) + handlersocket_port_wr = 9999 + # handlersocketが接続を受け付けるポート(更新系リクエスト用) + handlersocket_address = + # handlersocketがバインドするアドレス(空のままでOK) + handlersocket_verbose = 0 + # デバッグ用 + handlersocket_timeout = 300 + # 通信タイムアウト(秒) + handlersocket_threads = 16 + # handlersocketのワーカースレッド数 + thread_concurrency = 128 + # handlersocketが幾つかのスレッドを占有するため、大きめの + # 値を指定してください + open_files_limit = 65535 + # ソケットを大量に開けるようにするため、大きめの値を指定し + # てください + +以下のクエリを実行します。 + + mysql> install plugin handlersocket soname 'handlersocket.so'; + Query OK, 0 rows affected (0.06 sec) + +以上でhandlersocketへクライアントからアクセスできるようになります。 + diff --git a/plugin/handler_socket/docs-ja/perl-client.ja.txt b/plugin/handler_socket/docs-ja/perl-client.ja.txt new file mode 100644 index 00000000..90b7e4d6 --- /dev/null +++ b/plugin/handler_socket/docs-ja/perl-client.ja.txt @@ -0,0 +1,126 @@ + +----------------------------------------------------------------- +handlersocketプラグインへの接続を開くには、Net::HandlerSocketオブ +ジェクトを作成します。 + + use Net::HandlerSocket; + my $args = { host => 'localhost', port => 9998 }; + my $hs = new Net::HandlerSocket($args); + +----------------------------------------------------------------- +検索などの命令を実行する前に、処理対象となる索引を開く必要があり +ます。 + + my $err = $hs->open_index(3, 'database1', 'table1', 'PRIMARY', + 'f1,f2'); + die $hs->get_error() if $res->[0] != 0; + +最初の引数は開く索引に付ける番号です。付けた番号は同一の +Net::HandlerSocketオブジェクトについてのみ有効です。第4引数は開く +索引の名前で、「PRIMARY」が指定され場合はプライマリキーが開かれま +す。第5引数は「,」で区切られた列名のリストです。 + +----------------------------------------------------------------- +テーブルから索引を使って行を取得するには、execute_singleメソッド +を呼びます。 + + my $res = $hs->execute_single(3, '=', [ 'foo' ], 1, 0); + die $hs->get_error() if $res->[0] != 0; + shift(@$res); + +最初の引数は索引の番号で、同じNet::HandlerSocketオブジェクトへ +open_indexで付けたものでなければなりません。第2引数には操作を指定 +します。現在のバージョンでは、「=」、「>=」、「<=」、「>」、「<」 +の操作が利用可能です。第3引数は配列への参照で、これは探すべき行の +キー値を指定します。配列の長さは索引のキーの個数と同じか少ない数 +でなければなりません。第4引数と第5引数はそれぞれ、取得する最大行 +数、取得前に読み飛ばす行数を指定します。取得される列は対応する +open_index呼び出しの第5引数で指定されたものになります。 + +execute_singleメソッドは常に配列への参照を返します。最初の要素は +エラーコードで、これが0ならば成功を表します。残りの要素は列の値で +す。もし取得されたデータが複数行の場合は、それが一つの配列へ連結 +された形で格納されています。例えば、5行3列のデータの場合、次のよ +うなコードによってその内容を取得できます。 + + die $hs->get_error() if $res->[0] != 0; + shift(@$res); + for (my $row = 0; $row < 5; ++$row) { + for (my $col = 0; $col < 3; ++$col) { + my $value = $res->[$row * 5 + $col]; + # ... + } + } + +----------------------------------------------------------------- +行を更新または削除するには、更に多くの引数を指定して +execute_singleメソッドを呼び出します。書き込み処理をするには、 +対象のNet::HandlerSocketオブジェクトは更新用handlersocketワーカ(既 +定ではポート9999)へ接続されたものでなくてはなりません。 +(安全のため、ポート9998は参照処理だけを受け付け、ポート9999は更新 +処理も受け付けるようになっています。ポート9999は参照処理も受け付 +けますが、レコードロック等の影響で遅くなります。ポート番号は +mysqldの「handlersocket_port」と「handlersocket_port_wr」の設定項 +目で変更できます。) + + my $args = { host => 'localhost', port => 9999 }; + my $hs = new Net::HandlerSocket($args); + + my $res = $hs->execute_single(3, '=', [ 'bar' ], 1, 0, 'U', + [ 'fubar', 'hoge' ]); + die $hs->get_error() if $res->[0] != 0; + my $num_updated_rows = $res->[1]; + + my $res = $hs->execute_single(3, '=', [ 'baz' ], 1, 0, 'D'); + die $hs->get_error() if $res->[0] != 0; + my $num_deleted_rows = $res->[1]; + +execute_singleの第6引数は変更処理の種類を指定します。現在のバー +ジョンでは「U」と「D」が利用可能です。「U」については、第7引数で +新しい値を指定します。更新される列は、対応するopen_index呼び出し +の第5引数で指定されたものになります。「D」については第7引数は省 +略できます。 + +----------------------------------------------------------------- +execute_singleメソッドは列の挿入にも使用できます。 + + my $res = $hs->execute_single(3, '+', [ 'foo', 'bar', 'baz' ]); + die $hs->get_error() if $res->[0] != 0; + +第3引数は、対応するopen_index呼び出しの第5引数の列リストと同じだ +けの長さの配列への参照でなければなりません。open_index呼び出しの +第5引数に指定されていない列については、その列の既定値がセットされ +ます。 + +----------------------------------------------------------------- +execute_multiメソッドを使えば、複数のリクエストを一つの呼び出しで +実行することができます。これはリクエストを個別に実行するより高速 +です。 + + my $rarr = $hs->execute_multi([ + [ 0, '>=', [ 'foo' ], 5, 0 ], + [ 2, '=', [ 'bar' ], 1, 0 ], + [ 4, '<', [ 'baz' ], 10, 5 ], + ]); + for my $res (@$rarr) { + die $hs->get_error() if $res->[0] != 0; + shift(@$res); + # ... + } + +----------------------------------------------------------------- +もしhandlersocketが接続を認証するように設定されている +(handlersocket_plain_secret又はhandlersocket_plain_secret_wrがセッ +トされている)ならば、クライアントは他のメソッド呼び出しの前にauth +メソッドを呼び出す必要があります。 + + my $res = $hs->auth('password'); + die $hs->get_error() if $res->[0] != 0; + +----------------------------------------------------------------- +エラーが起こると返値の配列参照の最初の要素が0以外になります。負の +数の場合はI/Oエラーが起こったことを示し、その場合はその +Net::HandlerSocketオブジェクトは破棄するべきです。正の値の場合は +接続は維持されているため、そのオブジェクトはそれ以後も再利用でき +ます。 + diff --git a/plugin/handler_socket/docs-ja/protocol.ja.txt b/plugin/handler_socket/docs-ja/protocol.ja.txt new file mode 100644 index 00000000..46cc9932 --- /dev/null +++ b/plugin/handler_socket/docs-ja/protocol.ja.txt @@ -0,0 +1,180 @@ + +---------------------------------------------------------------------------- +handlersocketの通信プロトコル + +---------------------------------------------------------------------------- +基本的な構文 + +・HandlerSocketのプロトコルは行ベース。各行は改行文字(0x0a)で終わる。 +・各行は複数のトークンからなり、トークン間はTAB文字(0x09)で区切られる。 +・トークンはNULLトークンか、文字列トークンのいずれか。 +・NULLトークンは単一のNUL文字(0x00)であらわされる。 +・文字列トークンは、0バイト以上の文字列であらわされる。ただし0x10未満の文字 + については0x01を前置し、0x40を加えたコードであらわされる。それ以外の文字は + その文字自身のコードであらわされる。 + +---------------------------------------------------------------------------- +リクエストとレスポンス + +・HandlerSocketのプロトコルは単純なリクエスト・レスポンスプロトコルになって + いる。接続が確立した後は、まずクライアントがリクエストを送る。 +・サーバは、クライアントが送ったリクエストと丁度同じ数の行(レスポンス)を返 + す。 +・リクエストはパイプライン化してよい。つまりクライアントは前に送ったリクエス + トに対する返事(レスポンス)を待たずに次のリクエストを送ってもよい。 + +---------------------------------------------------------------------------- +インデックスを開く + +open_index命令は次のような構文を持つ。 + + P <indexid> <dbname> <tablename> <indexname> <columns> [<fcolumns>] + +- <indexid>は数字で、同一接続上で後に実行する命令の、対象索引を指定するため + に使われる。 +- <dbname>, <tablename>, <indexname>は文字列で、それぞれDB名、テーブル名、 + 索引の名前を指定する。<indexname>として「PRIMARY」を指定するとプライマリ + キーが開かれる。 +- <columns>はカンマ区切りの列名のリスト。 +- <fcolumns>はカンマ区切りの列名のリスト。これは省略することができる。 + +このopen_index命令が実行されると、HandlerSocketプラグインは指定されたDB、 +テーブル、索引を開く。開かれた索引は接続が閉じられるまで開かれたままになる。 +開かれた索引は<indexid>の数字で識別される。もし既に<indexid>に指定された番号 +の索引が既に開かれている場合は古いほうが閉じられる。この<indexid>はなるべく +小さな数字を使ったほうが効率が良い。 + +---------------------------------------------------------------------------- +データ取得 + +find命令は次のような構文を持つ。 + + <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] + +LIMは次のようなパラメータの並び + + <limit> <offset> + +INは次のようなパラメータの並び + + @ <icol> <ivlen> <iv1> ... <ivn> + +FILTERは次のようなパラメータの並び + + <ftyp> <fop> <fcol> <fval> + +- <indexid>は数字で、これは同じ接続上で過去に実行したopen_index命令に指定さ + れた数字でなければならない。 +- <op>は比較演算子で、現在のバージョンでは '=', '>', '>=', '<', '<=' をサ + ポートしている。 +- <vlen>は後に続くパラメータ<v1> ... <vn>の長さ。この値は対応するopen_index + 命令の<indexname>パラメータで指定された索引のキー列の数と同じか小さいもの + でなければならない。 +- <v1> ... <vn>は取得するべきキーの値を指定するパラメータ。 +- LIMは省略できる。<limit>と<offset>は数字で、これはSQLのLIMITと同じように + はたらく。省略した場合は1と0を指定した場合と同じ動作をする。FILTERによっ + て読み飛ばされたレコードは<limit>と<offset>にカウントされない。 +- INは省略できる。指定されると、これはSQLの WHERE ... IN のように動作する。 + <icol>は対応するopen_index命令の<indexname>パラメータで指定された索引の + キー列の数より小さいものでなければならない。INが指定されたときは、find命 + 令の<v1> ... <vn>のうち<icol>番目の値は無視される。 +- FILTERは省略できる。これは行取得の際のフィルタを指定する。<ftyp>は + 'F'(filter)か'W'(while)のいずれかでなければならない。<fop>は比較演算子。 + <fcol>は数字で、これは対応するopen_index命令の<fcolumns>で指定された列の + 数より小さいものでなければならない。複数のフィルタを指定することもでき、 + その場合は各フィルタのANDと解釈される。'F'と'W'の違いは、条件にあてはま + らない行があったときに'F'は単にそれをスキップするが、'W'はその時点でルー + プを抜けるという点。 + +---------------------------------------------------------------------------- +更新と削除 + +find_modify命令は次のような構文を持つ。 + + <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] MOD + +MODは次のようなパラメータの並び + + <mop> <m1> ... <mk> + +- <mop>は'U', '+', '-', 'D', 'U?', '+?', '-?', 'D?'のいずれか。'?'が付いた + ものは付いていないものとほぼ同じ動作をするが、付いていないものがレスポン + スとして更新された行の数を返すのに対し、付いているものは更新される前の行 + の内容を返す点のみが異なる。'U'は更新、'D'は削除、'+'はインクリメント、 + '-'はデクリメントを実行する。 +- <m1> ... <mk>はセットされる各列の値。<m1> ... <mk>の長さは対応する + open_index命令の<columns>の長さと等しいか小さくなければならない。<mop>が + 'D'のときはこれらのパラメータは無視される。<mop>が'+'か'-'のときは、これら + の値は数値でなければならない。<mop>が'-'で、それが負数から正数、または正数 + から負数へ列の値を変更するようなものであった場合は、値は変更されない。 + +---------------------------------------------------------------------------- +行の挿入 + +insert命令は次のような構文を持つ。 + + <indexid> + <vlen> <v1> ... <vn> + +- <vlen>は後に続くパラメータ<v1> ... <vn>の長さ。これは対応するopen_indexの + <columns>の長さに等しいか小さくなければならない。 +- <v1> ... <vn>はセットされる各列の値。指定されないかった列についてはその列 + のデフォルト値がセットされる。 + +---------------------------------------------------------------------------- +認証 + +auth命令は次のような構文を持つ。 + + A <atyp> <akey> + +- <atyp>は現在のバージョンでは'1'のみが有効。 +- 指定された<akey>が、サーバの設定の'handlersocket_plain_secret'や + 'handlersocket_plain_secret_wr'に指定された文字列と一致した場合にのみ認証 + は成功する。 +- HandlerSocketの認証が有効になっているときは、この'auth'が成功しない限りそ + れ以外の命令は全て失敗する。 + +---------------------------------------------------------------------------- +open_indexに対するレスポンス + +open_index命令が成功したとき、レスポンスは次の構文を持つ。 + + 0 1 + +---------------------------------------------------------------------------- +findに対するレスポンス + +find命令が成功したとき、レスポンスは次の構文を持つ。 + + 0 <numcolumns> <r1> ... <rn> + +- <numcolumns>はfind命令の対応するopen_index命令に指定した<columns>の長さに + 一致する。 +- <r1> ... <rn>は結果セット。もしN行がfind命令で見つかったなら、<r1> ... + <rn>の長さは ( <numcolumns> * N )になる。 + +---------------------------------------------------------------------------- +find_modifyに対するレスポンス + +find_modify命令が成功したとき、レスポンスは次の構文を持つ。 + + 0 1 <nummod> + +- <nummod>は変更された行の数。 +- 例外として、<mop>が'?'の付いたものであった場合には、find命令に対するレスポ + ンスと同じ構文のレスポンスを返す。 + +---------------------------------------------------------------------------- +insertに対するレスポンス + +insert命令が成功したとき、レスポンスは次の構文を持つ。 + + 0 1 + +---------------------------------------------------------------------------- +authに対するレスポンス + +auth命令が成功したとき、レスポンスは次の構文を持つ。 + + 0 1 + diff --git a/plugin/handler_socket/handlersocket/COPYRIGHT.txt b/plugin/handler_socket/handlersocket/COPYRIGHT.txt new file mode 100644 index 00000000..41dda127 --- /dev/null +++ b/plugin/handler_socket/handlersocket/COPYRIGHT.txt @@ -0,0 +1,27 @@ + + Copyright (c) 2010 DeNA Co.,Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of DeNA Co.,Ltd. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY DeNA Co.,Ltd. "AS IS" AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + EVENT SHALL DeNA Co.,Ltd. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/plugin/handler_socket/handlersocket/Makefile.am b/plugin/handler_socket/handlersocket/Makefile.am new file mode 100644 index 00000000..7e47209b --- /dev/null +++ b/plugin/handler_socket/handlersocket/Makefile.am @@ -0,0 +1,8 @@ +pkgplugindir = $(PLUGIN_DIR) +CXXFLAGS += -fimplicit-templates +noinst_HEADERS = database.hpp hstcpsvr.hpp hstcpsvr_worker.hpp mysql_incl.hpp +pkgplugin_LTLIBRARIES = handlersocket.la +handlersocket_la_LDFLAGS = -module ../libhsclient/libhsclient.la -L$(top_builddir)/libservices -lmysqlservices +handlersocket_la_CXXFLAGS = $(MYSQL_INC) $(MYSQL_CFLAGS) $(AM_CXXFLAGS) -I$(srcdir)/../libhsclient +handlersocket_la_SOURCES = database.cpp handlersocket.cpp \ + hstcpsvr_worker.cpp hstcpsvr.cpp diff --git a/plugin/handler_socket/handlersocket/Makefile.plain.template b/plugin/handler_socket/handlersocket/Makefile.plain.template new file mode 100644 index 00000000..4d5f8c10 --- /dev/null +++ b/plugin/handler_socket/handlersocket/Makefile.plain.template @@ -0,0 +1,31 @@ + +MYSQL_INC = HANDLERSOCKET_MYSQL_INC +MYSQL_LIB = HANDLERSOCKET_MYSQL_LIB + +CXX = g++ -Wall -g -fno-rtti -fno-exceptions -fPIC -DPIC +LIBS = $(MYSQL_LIB) -lhsclient -lpthread -lz +CXXFLAGS = -I/usr/include/handlersocket $(MYSQL_INC) +LDFLAGS = + +CXXFLAGS += -O3 -DNDEBUG + +HANDLERSOCKET_OBJS = database.o hstcpsvr.o hstcpsvr_worker.o + +all: handlersocket.so + +handlersocket.so: $(HANDLERSOCKET_OBJS) handlersocket.cpp + $(CXX) $(CXXFLAGS) -fno-strict-aliasing -shared $^ -o $@ $(LDFLAGS) \ + -Wl,-soname -Wl,$@ $(LIBS) +clean: + rm -f *.a *.so *.o + +LIBDIR = $(shell \ + if [ -e /usr/lib64/mysql ]; then echo /usr/lib64; else echo /usr/lib; fi) + +install: handlersocket.so + sudo sh -c 'ulimit -c unlimited ; /etc/init.d/mysql stop ; \ + cp handlersocket.so handlersocket.so.cpy && \ + mv handlersocket.so.cpy \ + $(LIBDIR)/mysql/plugin/handlersocket.so && \ + /etc/init.d/mysql start' + diff --git a/plugin/handler_socket/handlersocket/database.cpp b/plugin/handler_socket/handlersocket/database.cpp new file mode 100644 index 00000000..937b1177 --- /dev/null +++ b/plugin/handler_socket/handlersocket/database.cpp @@ -0,0 +1,1180 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <my_global.h> +#include <string.h> + +#include "database.hpp" +#include "string_util.hpp" +#include "escape.hpp" +#include "mysql_incl.hpp" + +#define DBG_KEY(x) +#define DBG_SHUT(x) +#define DBG_LOCK(x) +#define DBG_THR(x) +#define DBG_CMP(x) +#define DBG_FLD(x) +#define DBG_FILTER(x) +#define DBG_REFCNT(x) +#define DBG_KEYLEN(x) +#define DBG_DELETED + +/* status variables */ +unsigned long long int open_tables_count; +unsigned long long int close_tables_count; +unsigned long long int lock_tables_count; +unsigned long long int unlock_tables_count; +unsigned long long int index_exec_count; + +namespace dena { + +prep_stmt::prep_stmt() + : dbctx(0), table_id(static_cast<size_t>(-1)), + idxnum(static_cast<size_t>(-1)) +{ +} +prep_stmt::prep_stmt(dbcontext_i *c, size_t tbl, size_t idx, + const fields_type& rf, const fields_type& ff) + : dbctx(c), table_id(tbl), idxnum(idx), ret_fields(rf), filter_fields(ff) +{ + if (dbctx) { + dbctx->table_addref(table_id); + } +} +prep_stmt::~prep_stmt() +{ + if (dbctx) { + dbctx->table_release(table_id); + } +} + +prep_stmt::prep_stmt(const prep_stmt& x) + : dbctx(x.dbctx), table_id(x.table_id), idxnum(x.idxnum), + ret_fields(x.ret_fields), filter_fields(x.filter_fields) +{ + if (dbctx) { + dbctx->table_addref(table_id); + } +} + +prep_stmt& +prep_stmt::operator =(const prep_stmt& x) +{ + if (this != &x) { + if (dbctx) { + dbctx->table_release(table_id); + } + dbctx = x.dbctx; + table_id = x.table_id; + idxnum = x.idxnum; + ret_fields = x.ret_fields; + filter_fields = x.filter_fields; + if (dbctx) { + dbctx->table_addref(table_id); + } + } + return *this; +} + +struct database : public database_i, private noncopyable { + database(const config& c); + virtual ~database(); + virtual dbcontext_ptr create_context(bool for_write) volatile; + virtual void stop() volatile; + virtual const config& get_conf() const volatile; + public: + int child_running; + private: + config conf; +}; + +struct tablevec_entry { + TABLE *table; + size_t refcount; + bool modified; + tablevec_entry() : table(0), refcount(0), modified(false) { } +}; + +struct expr_user_lock : private noncopyable { + expr_user_lock(THD *thd, int timeout) + : lck_key(thd, "handlersocket_wr", 16, &my_charset_latin1), + lck_timeout(thd, timeout), + lck_func_get_lock(thd, &lck_key, &lck_timeout), + lck_func_release_lock(thd, &lck_key) + { + lck_key.fix_fields(thd, 0); + lck_timeout.fix_fields(thd, 0); + lck_func_get_lock.fix_fields(thd, 0); + lck_func_release_lock.fix_fields(thd, 0); + } + long long get_lock() { + return lck_func_get_lock.val_int(); + } + long long release_lock() { + return lck_func_release_lock.val_int(); + } + private: + Item_string lck_key; + Item_int lck_timeout; + Item_func_get_lock lck_func_get_lock; + Item_func_release_lock lck_func_release_lock; +}; + +struct dbcontext : public dbcontext_i, private noncopyable { + dbcontext(volatile database *d, bool for_write); + virtual ~dbcontext(); + virtual void init_thread(const void *stack_botton, + volatile int& shutdown_flag); + virtual void term_thread(); + virtual bool check_alive(); + virtual void lock_tables_if(); + virtual void unlock_tables_if(); + virtual bool get_commit_error(); + virtual void clear_error(); + virtual void close_tables_if(); + virtual void table_addref(size_t tbl_id); + virtual void table_release(size_t tbl_id); + virtual void cmd_open(dbcallback_i& cb, const cmd_open_args& args); + virtual void cmd_exec(dbcallback_i& cb, const cmd_exec_args& args); + virtual void set_statistics(size_t num_conns, size_t num_active); + private: + int set_thread_message(const char *fmt, ...) + __attribute__((format (printf, 2, 3))); + bool parse_fields(TABLE *const table, const char *str, + prep_stmt::fields_type& flds); + void cmd_insert_internal(dbcallback_i& cb, const prep_stmt& pst, + const string_ref *fvals, size_t fvalslen); + void cmd_sql_internal(dbcallback_i& cb, const prep_stmt& pst, + const string_ref *fvals, size_t fvalslen); + void cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst, + ha_rkey_function find_flag, const cmd_exec_args& args); + size_t calc_filter_buf_size(TABLE *table, const prep_stmt& pst, + const record_filter *filters); + bool fill_filter_buf(TABLE *table, const prep_stmt& pst, + const record_filter *filters, uchar *filter_buf, size_t len); + int check_filter(dbcallback_i& cb, TABLE *table, const prep_stmt& pst, + const record_filter *filters, const uchar *filter_buf); + void resp_record(dbcallback_i& cb, TABLE *const table, const prep_stmt& pst); + void dump_record(dbcallback_i& cb, TABLE *const table, const prep_stmt& pst); + int modify_record(dbcallback_i& cb, TABLE *const table, + const prep_stmt& pst, const cmd_exec_args& args, char mod_op, + size_t& modified_count); + private: + typedef std::vector<tablevec_entry> table_vec_type; + typedef std::pair<std::string, std::string> table_name_type; + typedef std::map<table_name_type, size_t> table_map_type; + private: + volatile database *const dbref; + bool for_write_flag; + THD *thd; + MYSQL_LOCK *lock; + bool lock_failed; + std::auto_ptr<expr_user_lock> user_lock; + int user_level_lock_timeout; + bool user_level_lock_locked; + bool commit_error; + std::vector<char> info_message_buf; + table_vec_type table_vec; + table_map_type table_map; +}; + +database::database(const config& c) + : child_running(1), conf(c) +{ +} + +database::~database() +{ +} + +dbcontext_ptr +database::create_context(bool for_write) volatile +{ + return dbcontext_ptr(new dbcontext(this, for_write)); +} + +void +database::stop() volatile +{ + child_running = false; +} + +const config& +database::get_conf() const volatile +{ + return const_cast<const config&>(conf); +} + +database_ptr +database_i::create(const config& conf) +{ + return database_ptr(new database(conf)); +} + +dbcontext::dbcontext(volatile database *d, bool for_write) + : dbref(d), for_write_flag(for_write), thd(0), lock(0), lock_failed(false), + user_level_lock_timeout(0), user_level_lock_locked(false), + commit_error(false) +{ + info_message_buf.resize(8192); + user_level_lock_timeout = d->get_conf().get_int("wrlock_timeout", 12); +} + +dbcontext::~dbcontext() +{ +} + +namespace { + +int +wait_server_to_start(THD *thd, volatile int& shutdown_flag) +{ + int r = 0; + DBG_SHUT(fprintf(stderr, "HNDSOCK wsts\n")); + pthread_mutex_lock(&LOCK_server_started); + while (!mysqld_server_started) { + timespec abstime; + set_timespec(abstime, 1); + pthread_cond_timedwait(&COND_server_started, &LOCK_server_started, + &abstime); + pthread_mutex_unlock(&LOCK_server_started); + pthread_mutex_lock(&thd->mysys_var->mutex); + killed_state st = thd->killed; + pthread_mutex_unlock(&thd->mysys_var->mutex); + DBG_SHUT(fprintf(stderr, "HNDSOCK wsts kst %d\n", (int)st)); + pthread_mutex_lock(&LOCK_server_started); + if (st != NOT_KILLED) { + DBG_SHUT(fprintf(stderr, "HNDSOCK wsts kst %d break\n", (int)st)); + r = -1; + break; + } + if (shutdown_flag) { + DBG_SHUT(fprintf(stderr, "HNDSOCK wsts kst shut break\n")); + r = -1; + break; + } + } + pthread_mutex_unlock(&LOCK_server_started); + DBG_SHUT(fprintf(stderr, "HNDSOCK wsts done\n")); + return r; +} + +}; // namespace + +#define DENA_THR_OFFSETOF(fld) ((char *)(&thd->fld) - (char *)thd) + +void +dbcontext::init_thread(const void *stack_bottom, volatile int& shutdown_flag) +{ + DBG_THR(fprintf(stderr, "HNDSOCK init thread\n")); + { + my_thread_init(); + thd = new THD(0); + thd->thread_stack = (char *)stack_bottom; + DBG_THR(fprintf(stderr, + "thread_stack = %p sizeof(THD)=%zu sizeof(mtx)=%zu " + "O: %zu %zu %zu %zu %zu %zu %zu\n", + thd->thread_stack, sizeof(THD), sizeof(mysql_mutex_t), + DENA_THR_OFFSETOF(mdl_context), + DENA_THR_OFFSETOF(net), + DENA_THR_OFFSETOF(LOCK_thd_data), + DENA_THR_OFFSETOF(mysys_var), + DENA_THR_OFFSETOF(stmt_arena), + DENA_THR_OFFSETOF(limit_found_rows), + DENA_THR_OFFSETOF(locked_tables_list))); + thd->store_globals(); + thd->system_thread = static_cast<enum_thread_type>(1<<30UL); + memset(&thd->net, 0, sizeof(thd->net)); + if (for_write_flag) { + #if MYSQL_VERSION_ID >= 50505 + thd->variables.option_bits |= OPTION_BIN_LOG; + #else + thd->options |= OPTION_BIN_LOG; + #endif + safeFree((char*) thd->db.str); + thd->db.str= my_strdup(PSI_NOT_INSTRUMENTED, "handlersocket", MYF(0)); + thd->db.length= sizeof("handlersocket")-1; + } + thd->variables.option_bits |= OPTION_TABLE_LOCK; + set_current_thd(thd); + DBG_THR(fprintf(stderr, "HNDSOCK x0 %p\n", thd)); + } + { + thd->thread_id = next_thread_id(); + server_threads.insert(thd); + } + + DBG_THR(fprintf(stderr, "HNDSOCK init thread wsts\n")); + wait_server_to_start(thd, shutdown_flag); + DBG_THR(fprintf(stderr, "HNDSOCK init thread done\n")); + + thd_proc_info(thd, &info_message_buf[0]); + set_thread_message("hs:listening"); + DBG_THR(fprintf(stderr, "HNDSOCK x1 %p\n", thd)); + + lex_start(thd); + + user_lock.reset(new expr_user_lock(thd, user_level_lock_timeout)); +} + +int +dbcontext::set_thread_message(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + const int n = vsnprintf(&info_message_buf[0], info_message_buf.size(), + fmt, ap); + va_end(ap); + return n; +} + +void +dbcontext::term_thread() +{ + DBG_THR(fprintf(stderr, "HNDSOCK thread end %p\n", thd)); + close_tables_if(); + set_current_thd(nullptr); + { + delete thd; + thd = 0; + my_thread_end(); + } +} + +bool +dbcontext::check_alive() +{ + pthread_mutex_lock(&thd->mysys_var->mutex); + killed_state st = thd->killed; + pthread_mutex_unlock(&thd->mysys_var->mutex); + DBG_SHUT(fprintf(stderr, "chk HNDSOCK kst %p %p %d %zu\n", thd, &thd->killed, + (int)st, sizeof(*thd))); + if (st != NOT_KILLED) { + DBG_SHUT(fprintf(stderr, "chk HNDSOCK kst %d break\n", (int)st)); + return false; + } + return true; +} + +void +dbcontext::lock_tables_if() +{ + if (lock_failed) { + return; + } + if (for_write_flag && !user_level_lock_locked) { + if (user_lock->get_lock()) { + user_level_lock_locked = true; + } else { + lock_failed = true; + return; + } + } + if (lock == 0) { + const size_t num_max = table_vec.size(); + TABLE **const tables = DENA_ALLOCA_ALLOCATE(TABLE *, num_max + 1); + size_t num_open = 0; + for (size_t i = 0; i < num_max; ++i) { + if (table_vec[i].refcount > 0) { + tables[num_open++] = table_vec[i].table; + } + table_vec[i].modified = false; + } + #if MYSQL_VERSION_ID >= 50505 + lock = thd->lock = mysql_lock_tables(thd, &tables[0], num_open, 0); + #else + bool need_reopen= false; + lock = thd->lock = mysql_lock_tables(thd, &tables[0], num_open, + MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN, &need_reopen); + #endif + statistic_increment(lock_tables_count, &LOCK_status); + thd_proc_info(thd, &info_message_buf[0]); + DENA_VERBOSE(100, fprintf(stderr, "HNDSOCK lock tables %p %p %zu %zu\n", + thd, lock, num_max, num_open)); + if (lock == 0) { + lock_failed = true; + DENA_VERBOSE(10, fprintf(stderr, "HNDSOCK failed to lock tables %p\n", + thd)); + } + if (for_write_flag) { + #if MYSQL_VERSION_ID >= 50505 + thd->set_current_stmt_binlog_format_row(); + #else + thd->current_stmt_binlog_row_based = 1; + #endif + } + DENA_ALLOCA_FREE(tables); + } + DBG_LOCK(fprintf(stderr, "HNDSOCK tblnum=%d\n", (int)tblnum)); +} + +void +dbcontext::unlock_tables_if() +{ + if (lock != 0) { + DENA_VERBOSE(100, fprintf(stderr, "HNDSOCK unlock tables %p %p\n", + thd, thd->lock)); + if (for_write_flag) { + for (size_t i = 0; i < table_vec.size(); ++i) { + if (table_vec[i].modified) { + query_cache_invalidate3(thd, table_vec[i].table, 1); + table_vec[i].table->file->ha_release_auto_increment(); + } + } + } + { + bool suc = true; + #if MYSQL_VERSION_ID >= 50505 + suc = (trans_commit_stmt(thd) == 0); + #else + suc = (ha_autocommit_or_rollback(thd, 0) == 0); + #endif + if (!suc) { + commit_error = true; + DENA_VERBOSE(10, fprintf(stderr, + "HNDSOCK unlock tables: commit failed\n")); + } + } + mysql_unlock_tables(thd, lock); + lock = thd->lock = 0; + statistic_increment(unlock_tables_count, &LOCK_status); + } + if (user_level_lock_locked) { + if (user_lock->release_lock()) { + user_level_lock_locked = false; + } + } +} + +bool +dbcontext::get_commit_error() +{ + return commit_error; +} + +void +dbcontext::clear_error() +{ + lock_failed = false; + commit_error = false; +} + +void +dbcontext::close_tables_if() +{ + unlock_tables_if(); + DENA_VERBOSE(100, fprintf(stderr, "HNDSOCK close tables\n")); + close_thread_tables(thd); + thd->mdl_context.release_transactional_locks(thd); + if (!table_vec.empty()) { + statistic_increment(close_tables_count, &LOCK_status); + table_vec.clear(); + table_map.clear(); + } +} + +void +dbcontext::table_addref(size_t tbl_id) +{ + table_vec[tbl_id].refcount += 1; + DBG_REFCNT(fprintf(stderr, "%p %zu %zu addref\n", this, tbl_id, + table_vec[tbl_id].refcount)); +} + +void +dbcontext::table_release(size_t tbl_id) +{ + table_vec[tbl_id].refcount -= 1; + DBG_REFCNT(fprintf(stderr, "%p %zu %zu release\n", this, tbl_id, + table_vec[tbl_id].refcount)); +} + +void +dbcontext::resp_record(dbcallback_i& cb, TABLE *const table, + const prep_stmt& pst) +{ + char rwpstr_buf[64]; + String rwpstr(rwpstr_buf, sizeof(rwpstr_buf), &my_charset_bin); + const prep_stmt::fields_type& rf = pst.get_ret_fields(); + const size_t n = rf.size(); + for (size_t i = 0; i < n; ++i) { + uint32_t fn = rf[i]; + Field *const fld = table->field[fn]; + DBG_FLD(fprintf(stderr, "fld=%p %zu\n", fld, fn)); + if (fld->is_null()) { + /* null */ + cb.dbcb_resp_entry(0, 0); + } else { + fld->val_str(&rwpstr, &rwpstr); + const size_t len = rwpstr.length(); + if (len != 0) { + /* non-empty */ + cb.dbcb_resp_entry(rwpstr.ptr(), rwpstr.length()); + } else { + /* empty */ + static const char empty_str[] = ""; + cb.dbcb_resp_entry(empty_str, 0); + } + } + } +} + +void +dbcontext::dump_record(dbcallback_i& cb, TABLE *const table, + const prep_stmt& pst) +{ + char rwpstr_buf[64]; + String rwpstr(rwpstr_buf, sizeof(rwpstr_buf), &my_charset_bin); + const prep_stmt::fields_type& rf = pst.get_ret_fields(); + const size_t n = rf.size(); + for (size_t i = 0; i < n; ++i) { + uint32_t fn = rf[i]; + Field *const fld = table->field[fn]; + if (fld->is_null()) { + /* null */ + fprintf(stderr, "NULL"); + } else { + fld->val_str(&rwpstr, &rwpstr); + const std::string s(rwpstr.ptr(), rwpstr.length()); + fprintf(stderr, "[%s]", s.c_str()); + } + } + fprintf(stderr, "\n"); +} + +int +dbcontext::modify_record(dbcallback_i& cb, TABLE *const table, + const prep_stmt& pst, const cmd_exec_args& args, char mod_op, + size_t& modified_count) +{ + if (mod_op == 'U') { + /* update */ + handler *const hnd = table->file; + uchar *const buf = table->record[0]; + store_record(table, record[1]); + const prep_stmt::fields_type& rf = pst.get_ret_fields(); + const size_t n = rf.size(); + for (size_t i = 0; i < n; ++i) { + const string_ref& nv = args.uvals[i]; + uint32_t fn = rf[i]; + Field *const fld = table->field[fn]; + if (nv.begin() == 0) { + fld->set_null(); + } else { + fld->set_notnull(); + fld->store(nv.begin(), nv.size(), &my_charset_bin); + } + } + table_vec[pst.get_table_id()].modified = true; + const int r = hnd->ha_update_row(table->record[1], buf); + if (r != 0 && r != HA_ERR_RECORD_IS_THE_SAME) { + return r; + } + ++modified_count; /* TODO: HA_ERR_RECORD_IS_THE_SAME? */ + } else if (mod_op == 'D') { + /* delete */ + handler *const hnd = table->file; + table_vec[pst.get_table_id()].modified = true; + const int r = hnd->ha_delete_row(table->record[0]); + if (r != 0) { + return r; + } + ++modified_count; + } else if (mod_op == '+' || mod_op == '-') { + /* increment/decrement */ + handler *const hnd = table->file; + uchar *const buf = table->record[0]; + store_record(table, record[1]); + const prep_stmt::fields_type& rf = pst.get_ret_fields(); + const size_t n = rf.size(); + size_t i = 0; + for (i = 0; i < n; ++i) { + const string_ref& nv = args.uvals[i]; + uint32_t fn = rf[i]; + Field *const fld = table->field[fn]; + if (fld->is_null() || nv.begin() == 0) { + continue; + } + const long long pval = fld->val_int(); + const long long llv = atoll_nocheck(nv.begin(), nv.end()); + /* TODO: llv == 0? */ + long long nval = 0; + if (mod_op == '+') { + /* increment */ + nval = pval + llv; + } else { + /* decrement */ + nval = pval - llv; + if ((pval < 0 && nval > 0) || (pval > 0 && nval < 0)) { + break; /* don't modify */ + } + } + fld->store(nval, false); + } + if (i == n) { + /* modify */ + table_vec[pst.get_table_id()].modified = true; + const int r = hnd->ha_update_row(table->record[1], buf); + if (r != 0 && r != HA_ERR_RECORD_IS_THE_SAME) { + return r; + } + ++modified_count; + } + } + return 0; +} + +void +dbcontext::cmd_insert_internal(dbcallback_i& cb, const prep_stmt& pst, + const string_ref *fvals, size_t fvalslen) +{ + if (!for_write_flag) { + return cb.dbcb_resp_short(2, "readonly"); + } + lock_tables_if(); + if (lock == 0) { + return cb.dbcb_resp_short(1, "lock_tables"); + } + if (pst.get_table_id() >= table_vec.size()) { + return cb.dbcb_resp_short(2, "tblnum"); + } + TABLE *const table = table_vec[pst.get_table_id()].table; + handler *const hnd = table->file; + uchar *const buf = table->record[0]; + empty_record(table); + memset(buf, 0, table->s->null_bytes); /* clear null flags */ + const prep_stmt::fields_type& rf = pst.get_ret_fields(); + const size_t n = std::min(rf.size(), fvalslen); + for (size_t i = 0; i < n; ++i) { + uint32_t fn = rf[i]; + Field *const fld = table->field[fn]; + if (fvals[i].begin() == 0) { + fld->set_null(); + } else { + fld->store(fvals[i].begin(), fvals[i].size(), &my_charset_bin); + } + } + table->next_number_field = table->found_next_number_field; + /* FIXME: test */ + const int r = hnd->ha_write_row(buf); + const ulonglong insert_id = table->file->insert_id_for_cur_row; + table->next_number_field = 0; + table_vec[pst.get_table_id()].modified = true; + if (r == 0 && table->found_next_number_field != 0) { + return cb.dbcb_resp_short_num64(0, insert_id); + } + if (r != 0) { + return cb.dbcb_resp_short_num(1, r); + } + return cb.dbcb_resp_short(0, ""); +} + +void +dbcontext::cmd_sql_internal(dbcallback_i& cb, const prep_stmt& pst, + const string_ref *fvals, size_t fvalslen) +{ + if (fvalslen < 1) { + return cb.dbcb_resp_short(2, "syntax"); + } + return cb.dbcb_resp_short(2, "notimpl"); +} + +static size_t +prepare_keybuf(const cmd_exec_args& args, uchar *key_buf, TABLE *table, + KEY& kinfo, size_t invalues_index) +{ + size_t kplen_sum = 0; + DBG_KEY(fprintf(stderr, "SLOW\n")); + for (size_t i = 0; i < args.kvalslen; ++i) { + const KEY_PART_INFO & kpt = kinfo.key_part[i]; + string_ref kval = args.kvals[i]; + if (args.invalues_keypart >= 0 && + static_cast<size_t>(args.invalues_keypart) == i) { + kval = args.invalues[invalues_index]; + } + if (kval.begin() == 0) { + kpt.field->set_null(); + } else { + kpt.field->set_notnull(); + } + kpt.field->store(kval.begin(), kval.size(), &my_charset_bin); + kplen_sum += kpt.store_length; + DBG_KEYLEN(fprintf(stderr, "l=%u sl=%zu\n", kpt.length, + kpt.store_length)); + } + key_copy(key_buf, table->record[0], &kinfo, kplen_sum); + DBG_KEYLEN(fprintf(stderr, "sum=%zu flen=%u\n", kplen_sum, + kinfo.key_length)); + return kplen_sum; +} + +void +dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst, + ha_rkey_function find_flag, const cmd_exec_args& args) +{ + const bool debug_out = (verbose_level >= 100); + bool need_resp_record = true; + char mod_op = 0; + const string_ref& mod_op_str = args.mod_op; + if (mod_op_str.size() != 0) { + if (!for_write_flag) { + return cb.dbcb_resp_short(2, "readonly"); + } + mod_op = mod_op_str.begin()[0]; + need_resp_record = mod_op_str.size() > 1 && mod_op_str.begin()[1] == '?'; + switch (mod_op) { + case 'U': /* update */ + case 'D': /* delete */ + case '+': /* increment */ + case '-': /* decrement */ + break; + default: + if (debug_out) { + fprintf(stderr, "unknown modop: %c\n", mod_op); + } + return cb.dbcb_resp_short(2, "modop"); + } + } + lock_tables_if(); + if (lock == 0) { + return cb.dbcb_resp_short(1, "lock_tables"); + } + if (pst.get_table_id() >= table_vec.size()) { + return cb.dbcb_resp_short(2, "tblnum"); + } + TABLE *const table = table_vec[pst.get_table_id()].table; + /* keys */ + if (pst.get_idxnum() >= table->s->keys) { + return cb.dbcb_resp_short(2, "idxnum"); + } + KEY& kinfo = table->key_info[pst.get_idxnum()]; + if (args.kvalslen > kinfo.user_defined_key_parts) { + return cb.dbcb_resp_short(2, "kpnum"); + } + uchar *const key_buf = DENA_ALLOCA_ALLOCATE(uchar, kinfo.key_length); + size_t invalues_idx = 0; + size_t kplen_sum = prepare_keybuf(args, key_buf, table, kinfo, invalues_idx); + /* filters */ + uchar *filter_buf = 0; + if (args.filters != 0) { + const size_t filter_buf_len = calc_filter_buf_size(table, pst, + args.filters); + filter_buf = DENA_ALLOCA_ALLOCATE(uchar, filter_buf_len); + if (!fill_filter_buf(table, pst, args.filters, filter_buf, + filter_buf_len)) { + return cb.dbcb_resp_short(2, "filterblob"); + } + } + /* handler */ + table->read_set = &table->s->all_set; + handler *const hnd = table->file; + if (!for_write_flag) { + hnd->init_table_handle_for_HANDLER(); + } + hnd->ha_index_or_rnd_end(); + hnd->ha_index_init(pst.get_idxnum(), 1); + if (need_resp_record) { + cb.dbcb_resp_begin(pst.get_ret_fields().size()); + } + const uint32_t limit = args.limit ? args.limit : 1; + uint32_t skip = args.skip; + size_t modified_count = 0; + int r = 0; + bool is_first = true; + for (uint32_t cnt = 0; cnt < limit + skip;) { + if (is_first) { + is_first = false; + const key_part_map kpm = (1U << args.kvalslen) - 1; + r = hnd->ha_index_read_map(table->record[0], key_buf, kpm, find_flag); + } else if (args.invalues_keypart >= 0) { + if (++invalues_idx >= args.invalueslen) { + break; + } + kplen_sum = prepare_keybuf(args, key_buf, table, kinfo, invalues_idx); + const key_part_map kpm = (1U << args.kvalslen) - 1; + r = hnd->ha_index_read_map(table->record[0], key_buf, kpm, find_flag); + } else { + switch (find_flag) { + case HA_READ_BEFORE_KEY: + case HA_READ_KEY_OR_PREV: + r = hnd->ha_index_prev(table->record[0]); + break; + case HA_READ_AFTER_KEY: + case HA_READ_KEY_OR_NEXT: + r = hnd->ha_index_next(table->record[0]); + break; + case HA_READ_KEY_EXACT: + r = hnd->ha_index_next_same(table->record[0], key_buf, kplen_sum); + break; + default: + r = HA_ERR_END_OF_FILE; /* to finish the loop */ + break; + } + } + if (debug_out) { + fprintf(stderr, "r=%d\n", r); + if (r == 0 || r == HA_ERR_RECORD_DELETED) { + dump_record(cb, table, pst); + } + } + int filter_res = 0; + if (r != 0) { + /* no-count */ + } else if (args.filters != 0 && (filter_res = check_filter(cb, table, + pst, args.filters, filter_buf)) != 0) { + if (filter_res < 0) { + break; + } + } else if (skip > 0) { + --skip; + } else { + /* hit */ + if (need_resp_record) { + resp_record(cb, table, pst); + } + if (mod_op != 0) { + r = modify_record(cb, table, pst, args, mod_op, modified_count); + } + ++cnt; + } + if (args.invalues_keypart >= 0 && r == HA_ERR_KEY_NOT_FOUND) { + continue; + } + if (r != 0 && r != HA_ERR_RECORD_DELETED) { + break; + } + } + hnd->ha_index_or_rnd_end(); + if (r != 0 && r != HA_ERR_RECORD_DELETED && r != HA_ERR_KEY_NOT_FOUND && + r != HA_ERR_END_OF_FILE) { + /* failed */ + if (need_resp_record) { + /* revert dbcb_resp_begin() and dbcb_resp_entry() */ + cb.dbcb_resp_cancel(); + } + cb.dbcb_resp_short_num(1, r); + } else { + /* succeeded */ + if (need_resp_record) { + cb.dbcb_resp_end(); + } else { + cb.dbcb_resp_short_num(0, modified_count); + } + } + DENA_ALLOCA_FREE(filter_buf); + DENA_ALLOCA_FREE(key_buf); +} + +size_t +dbcontext::calc_filter_buf_size(TABLE *table, const prep_stmt& pst, + const record_filter *filters) +{ + size_t filter_buf_len = 0; + for (const record_filter *f = filters; f->op.begin() != 0; ++f) { + if (f->val.begin() == 0) { + continue; + } + const uint32_t fn = pst.get_filter_fields()[f->ff_offset]; + filter_buf_len += table->field[fn]->pack_length(); + } + ++filter_buf_len; + /* Field_medium::cmp() calls uint3korr(), which may read 4 bytes. + Allocate 1 more byte for safety. */ + return filter_buf_len; +} + +bool +dbcontext::fill_filter_buf(TABLE *table, const prep_stmt& pst, + const record_filter *filters, uchar *filter_buf, size_t len) +{ + memset(filter_buf, 0, len); + size_t pos = 0; + for (const record_filter *f = filters; f->op.begin() != 0; ++f) { + if (f->val.begin() == 0) { + continue; + } + const uint32_t fn = pst.get_filter_fields()[f->ff_offset]; + Field *const fld = table->field[fn]; + if ((fld->flags & BLOB_FLAG) != 0) { + return false; + } + fld->store(f->val.begin(), f->val.size(), &my_charset_bin); + const size_t packlen = fld->pack_length(); + memcpy(filter_buf + pos, fld->ptr, packlen); + pos += packlen; + } + return true; +} + +int +dbcontext::check_filter(dbcallback_i& cb, TABLE *table, const prep_stmt& pst, + const record_filter *filters, const uchar *filter_buf) +{ + DBG_FILTER(fprintf(stderr, "check_filter\n")); + size_t pos = 0; + for (const record_filter *f = filters; f->op.begin() != 0; ++f) { + const string_ref& op = f->op; + const string_ref& val = f->val; + const uint32_t fn = pst.get_filter_fields()[f->ff_offset]; + Field *const fld = table->field[fn]; + const size_t packlen = fld->pack_length(); + const uchar *const bval = filter_buf + pos; + int cv = 0; + if (fld->is_null()) { + cv = (val.begin() == 0) ? 0 : -1; + } else { + cv = (val.begin() == 0) ? 1 : fld->cmp(bval); + } + DBG_FILTER(fprintf(stderr, "check_filter cv=%d\n", cv)); + bool cond = true; + if (op.size() == 1) { + switch (op.begin()[0]) { + case '>': + DBG_FILTER(fprintf(stderr, "check_filter op: >\n")); + cond = (cv > 0); + break; + case '<': + DBG_FILTER(fprintf(stderr, "check_filter op: <\n")); + cond = (cv < 0); + break; + case '=': + DBG_FILTER(fprintf(stderr, "check_filter op: =\n")); + cond = (cv == 0); + break; + default: + DBG_FILTER(fprintf(stderr, "check_filter op: unknown\n")); + cond = false; /* FIXME: error */ + break; + } + } else if (op.size() == 2 && op.begin()[1] == '=') { + switch (op.begin()[0]) { + case '>': + DBG_FILTER(fprintf(stderr, "check_filter op: >=\n")); + cond = (cv >= 0); + break; + case '<': + DBG_FILTER(fprintf(stderr, "check_filter op: <=\n")); + cond = (cv <= 0); + break; + case '!': + DBG_FILTER(fprintf(stderr, "check_filter op: !=\n")); + cond = (cv != 0); + break; + default: + DBG_FILTER(fprintf(stderr, "check_filter op: unknown\n")); + cond = false; /* FIXME: error */ + break; + } + } + DBG_FILTER(fprintf(stderr, "check_filter cond: %d\n", (int)cond)); + if (!cond) { + return (f->filter_type == record_filter_type_skip) ? 1 : -1; + } + if (val.begin() != 0) { + pos += packlen; + } + } + return 0; +} + +void +dbcontext::cmd_open(dbcallback_i& cb, const cmd_open_args& arg) +{ + unlock_tables_if(); + const table_name_type k = std::make_pair(std::string(arg.dbn), + std::string(arg.tbl)); + const table_map_type::const_iterator iter = table_map.find(k); + uint32_t tblnum = 0; + if (iter != table_map.end()) { + tblnum = iter->second; + DBG_CMP(fprintf(stderr, "HNDSOCK k=%s tblnum=%d\n", k.c_str(), + (int)tblnum)); + } else { + TABLE_LIST tables; + TABLE *table = 0; + bool refresh = true; + const thr_lock_type lock_type = for_write_flag ? TL_WRITE : TL_READ; + #if MYSQL_VERSION_ID >= 50505 + LEX_CSTRING db_name= { arg.dbn, strlen(arg.dbn) }; + LEX_CSTRING tbl_name= { arg.tbl, strlen(arg.tbl) }; + tables.init_one_table(&db_name, &tbl_name, 0, lock_type); + MDL_REQUEST_INIT(&tables.mdl_request, MDL_key::TABLE, arg.dbn, arg.tbl, + for_write_flag ? MDL_SHARED_WRITE : MDL_SHARED_READ, MDL_TRANSACTION); + Open_table_context ot_act(thd, 0); + if (!open_table(thd, &tables, &ot_act)) { + table = tables.table; + } + #else + tables.init_one_table(arg.dbn, arg.tbl, lock_type); + table = open_table(thd, &tables, thd->mem_root, &refresh, + OPEN_VIEW_NO_PARSE); + #endif + if (table == 0) { + DENA_VERBOSE(20, fprintf(stderr, + "HNDSOCK failed to open %p [%s] [%s] [%d]\n", + thd, arg.dbn, arg.tbl, static_cast<int>(refresh))); + return cb.dbcb_resp_short(1, "open_table"); + } + statistic_increment(open_tables_count, &LOCK_status); + table->reginfo.lock_type = lock_type; + table->use_all_columns(); + tblnum = table_vec.size(); + tablevec_entry e; + e.table = table; + table_vec.push_back(e); + table_map[k] = tblnum; + } + size_t idxnum = static_cast<size_t>(-1); + if (arg.idx[0] >= '0' && arg.idx[0] <= '9') { + /* numeric */ + TABLE *const table = table_vec[tblnum].table; + idxnum = atoi(arg.idx); + if (idxnum >= table->s->keys) { + return cb.dbcb_resp_short(2, "idxnum"); + } + } else { + const char *const idx_name_to_open = + arg.idx[0] == '\0' ? "PRIMARY" : arg.idx; + TABLE *const table = table_vec[tblnum].table; + for (uint i = 0; i < table->s->keys; ++i) { + KEY& kinfo = table->key_info[i]; + if (strcmp(kinfo.name.str, idx_name_to_open) == 0) { + idxnum = i; + break; + } + } + } + if (idxnum == size_t(-1)) { + return cb.dbcb_resp_short(2, "idxnum"); + } + prep_stmt::fields_type rf; + prep_stmt::fields_type ff; + if (!parse_fields(table_vec[tblnum].table, arg.retflds, rf)) { + return cb.dbcb_resp_short(2, "fld"); + } + if (!parse_fields(table_vec[tblnum].table, arg.filflds, ff)) { + return cb.dbcb_resp_short(2, "fld"); + } + prep_stmt p(this, tblnum, idxnum, rf, ff); + cb.dbcb_set_prep_stmt(arg.pst_id, p); + return cb.dbcb_resp_short(0, ""); +} + +bool +dbcontext::parse_fields(TABLE *const table, const char *str, + prep_stmt::fields_type& flds) +{ + string_ref flds_sr(str, strlen(str)); + std::vector<string_ref> fldnms; + if (flds_sr.size() != 0) { + split(',', flds_sr, fldnms); + } + for (size_t i = 0; i < fldnms.size(); ++i) { + Field **fld = 0; + size_t j = 0; + for (fld = table->field; *fld; ++fld, ++j) { + DBG_FLD(fprintf(stderr, "f %s\n", (*fld)->field_name.str)); + string_ref fn((*fld)->field_name.str, (*fld)->field_name.length); + if (fn == fldnms[i]) { + break; + } + } + if (*fld == 0) { + DBG_FLD(fprintf(stderr, "UNKNOWN FLD %s [%s]\n", retflds, + std::string(fldnms[i].begin(), fldnms[i].size()).c_str())); + return false; + } + DBG_FLD(fprintf(stderr, "FLD %s %zu\n", (*fld)->field_name.str, j)); + flds.push_back(j); + } + return true; +} + +enum db_write_op { + db_write_op_none = 0, + db_write_op_insert = 1, + db_write_op_sql = 2, +}; + +void +dbcontext::cmd_exec(dbcallback_i& cb, const cmd_exec_args& args) +{ + const prep_stmt& p = *args.pst; + if (p.get_table_id() == static_cast<size_t>(-1)) { + return cb.dbcb_resp_short(2, "stmtnum"); + } + ha_rkey_function find_flag = HA_READ_KEY_EXACT; + db_write_op wrop = db_write_op_none; + if (args.op.size() == 1) { + switch (args.op.begin()[0]) { + case '=': + find_flag = HA_READ_KEY_EXACT; + break; + case '>': + find_flag = HA_READ_AFTER_KEY; + break; + case '<': + find_flag = HA_READ_BEFORE_KEY; + break; + case '+': + wrop = db_write_op_insert; + break; + case 'S': + wrop = db_write_op_sql; + break; + default: + return cb.dbcb_resp_short(2, "op"); + } + } else if (args.op.size() == 2 && args.op.begin()[1] == '=') { + switch (args.op.begin()[0]) { + case '>': + find_flag = HA_READ_KEY_OR_NEXT; + break; + case '<': + find_flag = HA_READ_KEY_OR_PREV; + break; + default: + return cb.dbcb_resp_short(2, "op"); + } + } else { + return cb.dbcb_resp_short(2, "op"); + } + if (args.kvalslen <= 0) { + return cb.dbcb_resp_short(2, "klen"); + } + switch (wrop) { + case db_write_op_none: + return cmd_find_internal(cb, p, find_flag, args); + case db_write_op_insert: + return cmd_insert_internal(cb, p, args.kvals, args.kvalslen); + case db_write_op_sql: + return cmd_sql_internal(cb, p, args.kvals, args.kvalslen); + } +} + +void +dbcontext::set_statistics(size_t num_conns, size_t num_active) +{ + if (for_write_flag) { + set_thread_message("handlersocket: mode=wr, %zu conns, %zu active", + num_conns, num_active); + } else { + set_thread_message("handlersocket: mode=rd, %zu conns, %zu active", + num_conns, num_active); + } + /* + Don't set message buf if it's already in use. This saves slow call to + thd_proc_info() (if profiling is enabled) + */ + if (thd->proc_info != &info_message_buf[0]) + thd_proc_info(thd, &info_message_buf[0]); +} + +}; + diff --git a/plugin/handler_socket/handlersocket/database.hpp b/plugin/handler_socket/handlersocket/database.hpp new file mode 100644 index 00000000..a4aee087 --- /dev/null +++ b/plugin/handler_socket/handlersocket/database.hpp @@ -0,0 +1,142 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_DATABASE_HPP +#define DENA_DATABASE_HPP + +#include <string> +#include <memory> +#include <vector> +#include <stdint.h> + +#include "string_buffer.hpp" +#include "string_ref.hpp" +#include "config.hpp" + +namespace dena { + +struct database_i; +typedef std::auto_ptr<volatile database_i> database_ptr; + +struct dbcontext_i; +typedef std::auto_ptr<dbcontext_i> dbcontext_ptr; + +struct database_i { + virtual ~database_i() { } + virtual dbcontext_ptr create_context(bool for_write) volatile = 0; + virtual void stop() volatile = 0; + virtual const config& get_conf() const volatile = 0; + static database_ptr create(const config& conf); +}; + +struct prep_stmt { + typedef std::vector<uint32_t> fields_type; + private: + dbcontext_i *dbctx; /* must be valid while *this is alive */ + size_t table_id; /* a prep_stmt object holds a refcount of the table */ + size_t idxnum; + fields_type ret_fields; + fields_type filter_fields; + public: + prep_stmt(); + prep_stmt(dbcontext_i *c, size_t tbl, size_t idx, const fields_type& rf, + const fields_type& ff); + ~prep_stmt(); + prep_stmt(const prep_stmt& x); + prep_stmt& operator =(const prep_stmt& x); + public: + size_t get_table_id() const { return table_id; } + size_t get_idxnum() const { return idxnum; } + const fields_type& get_ret_fields() const { return ret_fields; } + const fields_type& get_filter_fields() const { return filter_fields; } +}; + +struct dbcallback_i { + virtual ~dbcallback_i () { } + virtual void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v) = 0; + virtual const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const = 0; + virtual void dbcb_resp_short(uint32_t code, const char *msg) = 0; + virtual void dbcb_resp_short_num(uint32_t code, uint32_t value) = 0; + virtual void dbcb_resp_short_num64(uint32_t code, uint64_t value) = 0; + virtual void dbcb_resp_begin(size_t num_flds) = 0; + virtual void dbcb_resp_entry(const char *fld, size_t fldlen) = 0; + virtual void dbcb_resp_end() = 0; + virtual void dbcb_resp_cancel() = 0; +}; + +enum record_filter_type { + record_filter_type_skip = 0, + record_filter_type_break = 1, +}; + +struct record_filter { + record_filter_type filter_type; + string_ref op; + uint32_t ff_offset; /* offset in filter_fields */ + string_ref val; + record_filter() : filter_type(record_filter_type_skip), ff_offset(0) { } +}; + +struct cmd_open_args { + size_t pst_id; + const char *dbn; + const char *tbl; + const char *idx; + const char *retflds; + const char *filflds; + cmd_open_args() : pst_id(0), dbn(0), tbl(0), idx(0), retflds(0), + filflds(0) { } +}; + +struct cmd_exec_args { + const prep_stmt *pst; + string_ref op; + const string_ref *kvals; + size_t kvalslen; + uint32_t limit; + uint32_t skip; + string_ref mod_op; + const string_ref *uvals; /* size must be pst->retfieelds.size() */ + const record_filter *filters; + int invalues_keypart; + const string_ref *invalues; + size_t invalueslen; + cmd_exec_args() : pst(0), kvals(0), kvalslen(0), limit(0), skip(0), + uvals(0), filters(0), invalues_keypart(-1), invalues(0), invalueslen(0) { } +}; + +struct dbcontext_i { + virtual ~dbcontext_i() { } + virtual void init_thread(const void *stack_bottom, + volatile int& shutdown_flag) = 0; + virtual void term_thread() = 0; + virtual bool check_alive() = 0; + virtual void lock_tables_if() = 0; + virtual void unlock_tables_if() = 0; + virtual bool get_commit_error() = 0; + virtual void clear_error() = 0; + virtual void close_tables_if() = 0; + virtual void table_addref(size_t tbl_id) = 0; /* TODO: hide */ + virtual void table_release(size_t tbl_id) = 0; /* TODO: hide */ + virtual void cmd_open(dbcallback_i& cb, const cmd_open_args& args) = 0; + virtual void cmd_exec(dbcallback_i& cb, const cmd_exec_args& args) = 0; + virtual void set_statistics(size_t num_conns, size_t num_active) = 0; +}; + +}; + +extern unsigned long long int open_tables_count; +extern unsigned long long int close_tables_count; +extern unsigned long long int lock_tables_count; +extern unsigned long long int unlock_tables_count; +#if 0 +extern unsigned long long int index_exec_count; +#endif + +#endif + diff --git a/plugin/handler_socket/handlersocket/handlersocket.cpp b/plugin/handler_socket/handlersocket/handlersocket.cpp new file mode 100644 index 00000000..81334970 --- /dev/null +++ b/plugin/handler_socket/handlersocket/handlersocket.cpp @@ -0,0 +1,217 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <my_global.h> +#include <memory> +#include <string> +#include <stdio.h> + +#include "config.hpp" +#include "hstcpsvr.hpp" +#include "string_util.hpp" +#include "mysql_incl.hpp" + +#define DBG_LOG \ + if (dena::verbose_level >= 100) { \ + fprintf(stderr, "%s %p\n", __PRETTY_FUNCTION__, this); \ + } +#define DBG_DO(x) if (dena::verbose_level >= 100) { x; } + +#define DBG_DIR(x) + +using namespace dena; + +static char *handlersocket_address = 0; +static char *handlersocket_port = 0; +static char *handlersocket_port_wr = 0; +static unsigned int handlersocket_epoll = 1; +static unsigned int handlersocket_threads = 32; +static unsigned int handlersocket_threads_wr = 1; +static unsigned int handlersocket_timeout = 30; +static unsigned int handlersocket_backlog = 32768; +static unsigned int handlersocket_sndbuf = 0; +static unsigned int handlersocket_rcvbuf = 0; +static unsigned int handlersocket_readsize = 0; +static unsigned int handlersocket_accept_balance = 0; +static unsigned int handlersocket_wrlock_timeout = 0; +static char *handlersocket_plain_secret = 0; +static char *handlersocket_plain_secret_wr = 0; + +struct daemon_handlersocket_data { + hstcpsvr_ptr hssvr_rd; + hstcpsvr_ptr hssvr_wr; +}; + +static int +daemon_handlersocket_init(void *p) +{ + DENA_VERBOSE(10, fprintf(stderr, "handlersocket: initialized\n")); + config conf; + conf["use_epoll"] = handlersocket_epoll ? "1" : "0"; + if (handlersocket_address) { + conf["host"] = handlersocket_address; + } + if (handlersocket_port) { + conf["port"] = handlersocket_port; + } + /* + * unix domain socket + * conf["host"] = "/"; + * conf["port"] = "/tmp/handlersocket"; + */ + if (handlersocket_threads > 0) { + conf["num_threads"] = to_stdstring(handlersocket_threads); + } else { + conf["num_threads"] = "1"; + } + conf["timeout"] = to_stdstring(handlersocket_timeout); + conf["listen_backlog"] = to_stdstring(handlersocket_backlog); + conf["sndbuf"] = to_stdstring(handlersocket_sndbuf); + conf["rcvbuf"] = to_stdstring(handlersocket_rcvbuf); + conf["readsize"] = to_stdstring(handlersocket_readsize); + conf["accept_balance"] = to_stdstring(handlersocket_accept_balance); + conf["wrlock_timeout"] = to_stdstring(handlersocket_wrlock_timeout); + std::auto_ptr<daemon_handlersocket_data> ap(new daemon_handlersocket_data); + if (handlersocket_port != 0 && handlersocket_port_wr != handlersocket_port) { + conf["port"] = handlersocket_port; + if (handlersocket_plain_secret) { + conf["plain_secret"] = handlersocket_plain_secret; + } + ap->hssvr_rd = hstcpsvr_i::create(conf); + ap->hssvr_rd->start_listen(); + } + if (handlersocket_port_wr != 0) { + if (handlersocket_threads_wr > 0) { + conf["num_threads"] = to_stdstring(handlersocket_threads_wr); + } + conf["port"] = handlersocket_port_wr; + conf["for_write"] = "1"; + conf["plain_secret"] = ""; + if (handlersocket_plain_secret_wr) { + conf["plain_secret"] = handlersocket_plain_secret_wr; + } + ap->hssvr_wr = hstcpsvr_i::create(conf); + ap->hssvr_wr->start_listen(); + } + st_plugin_int *const plugin = static_cast<st_plugin_int *>(p); + plugin->data = ap.release(); + return 0; +} + +static int +daemon_handlersocket_deinit(void *p) +{ + DENA_VERBOSE(10, fprintf(stderr, "handlersocket: terminated\n")); + st_plugin_int *const plugin = static_cast<st_plugin_int *>(p); + daemon_handlersocket_data *ptr = + static_cast<daemon_handlersocket_data *>(plugin->data); + delete ptr; + return 0; +} + +static struct st_mysql_daemon daemon_handlersocket_plugin = { + MYSQL_DAEMON_INTERFACE_VERSION +}; + +static MYSQL_SYSVAR_UINT(verbose, dena::verbose_level, 0, + "0..10000", 0, 0, 10 /* default */, 0, 10000, 0); +static MYSQL_SYSVAR_UINT(epoll, handlersocket_epoll, PLUGIN_VAR_READONLY, + "0..1", 0, 0, 1 /* default */, 0, 1, 0); +static MYSQL_SYSVAR_STR(address, handlersocket_address, + PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC, "", NULL, NULL, NULL); +static MYSQL_SYSVAR_STR(port, handlersocket_port, + PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC, "", NULL, NULL, NULL); +static MYSQL_SYSVAR_STR(port_wr, handlersocket_port_wr, + PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC, "", NULL, NULL, NULL); +static MYSQL_SYSVAR_UINT(threads, handlersocket_threads, PLUGIN_VAR_READONLY, + "1..3000", 0, 0, 16 /* default */, 1, 3000, 0); +static MYSQL_SYSVAR_UINT(threads_wr, handlersocket_threads_wr, + PLUGIN_VAR_READONLY, "1..3000", 0, 0, 1 /* default */, 1, 3000, 0); +static MYSQL_SYSVAR_UINT(timeout, handlersocket_timeout, PLUGIN_VAR_READONLY, + "30..3600", 0, 0, 300 /* default */, 30, 3600, 0); +static MYSQL_SYSVAR_UINT(backlog, handlersocket_backlog, PLUGIN_VAR_READONLY, + "5..1000000", 0, 0, 32768 /* default */, 5, 1000000, 0); +static MYSQL_SYSVAR_UINT(sndbuf, handlersocket_sndbuf, PLUGIN_VAR_READONLY, + "0..16777216", 0, 0, 0 /* default */, 0, 16777216, 0); +static MYSQL_SYSVAR_UINT(rcvbuf, handlersocket_rcvbuf, PLUGIN_VAR_READONLY, + "0..16777216", 0, 0, 0 /* default */, 0, 16777216, 0); +static MYSQL_SYSVAR_UINT(readsize, handlersocket_readsize, PLUGIN_VAR_READONLY, + "0..16777216", 0, 0, 0 /* default */, 0, 16777216, 0); +static MYSQL_SYSVAR_UINT(accept_balance, handlersocket_accept_balance, + PLUGIN_VAR_READONLY, "0..10000", 0, 0, 0 /* default */, 0, 10000, 0); +static MYSQL_SYSVAR_UINT(wrlock_timeout, handlersocket_wrlock_timeout, + PLUGIN_VAR_READONLY, "0..3600", 0, 0, 12 /* default */, 0, 3600, 0); +static MYSQL_SYSVAR_STR(plain_secret, handlersocket_plain_secret, + PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC, "", NULL, NULL, NULL); +static MYSQL_SYSVAR_STR(plain_secret_wr, handlersocket_plain_secret_wr, + PLUGIN_VAR_READONLY | PLUGIN_VAR_MEMALLOC, "", NULL, NULL, NULL); + + +/* warning: type-punning to incomplete type might break strict-aliasing + * rules */ +static struct st_mysql_sys_var *daemon_handlersocket_system_variables[] = { + MYSQL_SYSVAR(verbose), + MYSQL_SYSVAR(address), + MYSQL_SYSVAR(port), + MYSQL_SYSVAR(port_wr), + MYSQL_SYSVAR(epoll), + MYSQL_SYSVAR(threads), + MYSQL_SYSVAR(threads_wr), + MYSQL_SYSVAR(timeout), + MYSQL_SYSVAR(backlog), + MYSQL_SYSVAR(sndbuf), + MYSQL_SYSVAR(rcvbuf), + MYSQL_SYSVAR(readsize), + MYSQL_SYSVAR(accept_balance), + MYSQL_SYSVAR(wrlock_timeout), + MYSQL_SYSVAR(plain_secret), + MYSQL_SYSVAR(plain_secret_wr), + 0 +}; + +static SHOW_VAR hs_status_variables[] = { + {"table_open", (char*) &open_tables_count, SHOW_LONGLONG}, + {"table_close", (char*) &close_tables_count, SHOW_LONGLONG}, + {"table_lock", (char*) &lock_tables_count, SHOW_LONGLONG}, + {"table_unlock", (char*) &unlock_tables_count, SHOW_LONGLONG}, + #if 0 + {"index_exec", (char*) &index_exec_count, SHOW_LONGLONG}, + #endif + {NullS, NullS, SHOW_LONG} +}; + +static int show_hs_vars(THD *thd, SHOW_VAR *var, char *buff) +{ + var->type= SHOW_ARRAY; + var->value= (char *) &hs_status_variables; + return 0; +} + +static SHOW_VAR daemon_handlersocket_status_variables[] = { + {"Hs", (char*) show_hs_vars, SHOW_FUNC}, + {NullS, NullS, SHOW_LONG} +}; + + +maria_declare_plugin(handlersocket) +{ + MYSQL_DAEMON_PLUGIN, + &daemon_handlersocket_plugin, + "handlersocket", + "higuchi dot akira at dena dot jp", + "Direct access into InnoDB", + PLUGIN_LICENSE_BSD, + daemon_handlersocket_init, + daemon_handlersocket_deinit, + 0x0100 /* 1.0 */, + daemon_handlersocket_status_variables, + daemon_handlersocket_system_variables, + "1.0", + MariaDB_PLUGIN_MATURITY_BETA +} +maria_declare_plugin_end; diff --git a/plugin/handler_socket/handlersocket/handlersocket.spec.template b/plugin/handler_socket/handlersocket/handlersocket.spec.template new file mode 100644 index 00000000..0ce8c0cb --- /dev/null +++ b/plugin/handler_socket/handlersocket/handlersocket.spec.template @@ -0,0 +1,29 @@ +Summary: handlersocket plugin for mysql +Name: handlersocket +Version: HANDLERSOCKET_VERSION +Release: 1%{?dist} +Group: System Environment/Libraries +License: BSD +Source: handlersocket.tar.gz +Packager: Akira Higuchi <higuchi dot akira at dena dot jp> +BuildRoot: /var/tmp/%{name}-%{version}-root + +%description + +%prep +%setup -n %{name} + +%define _use_internal_dependency_generator 0 + +%build +make -f Makefile.plain + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/%{_libdir}/mysql/plugin +install -m 755 handlersocket.so $RPM_BUILD_ROOT/%{_libdir}/mysql/plugin/ + +%files +%defattr(-, root, root) +%{_libdir}/mysql/plugin/*.so + diff --git a/plugin/handler_socket/handlersocket/hstcpsvr.cpp b/plugin/handler_socket/handlersocket/hstcpsvr.cpp new file mode 100644 index 00000000..250ef2c7 --- /dev/null +++ b/plugin/handler_socket/handlersocket/hstcpsvr.cpp @@ -0,0 +1,147 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <my_global.h> +#include <vector> +#include <sys/socket.h> +#include <netinet/in.h> +#include <unistd.h> +#include <sys/resource.h> + +#include "hstcpsvr.hpp" +#include "hstcpsvr_worker.hpp" +#include "thread.hpp" +#include "fatal.hpp" +#include "auto_ptrcontainer.hpp" + +#define DBG(x) + +namespace dena { + +struct worker_throbj { + worker_throbj(const hstcpsvr_worker_arg& arg) + : worker(hstcpsvr_worker_i::create(arg)) { } + void operator ()() { + worker->run(); + } + hstcpsvr_worker_ptr worker; +}; + +struct hstcpsvr : public hstcpsvr_i, private noncopyable { + hstcpsvr(const config& c); + ~hstcpsvr(); + virtual std::string start_listen(); + private: + hstcpsvr_shared_c cshared; + volatile hstcpsvr_shared_v vshared; + typedef thread<worker_throbj> worker_thread_type; + typedef auto_ptrcontainer< std::vector<worker_thread_type *> > threads_type; + threads_type threads; + std::vector<unsigned int> thread_num_conns_vec; + private: + void stop_workers(); +}; + +namespace { + +void +check_nfile(size_t nfile) +{ + struct rlimit rl; + const int r = getrlimit(RLIMIT_NOFILE, &rl); + if (r != 0) { + fatal_abort("check_nfile: getrlimit failed"); + } + if (rl.rlim_cur < static_cast<rlim_t>(nfile + 1000)) { + fprintf(stderr, + "[Warning] handlersocket: open_files_limit is too small.\n"); + } +} + +}; + +hstcpsvr::hstcpsvr(const config& c) + : cshared(), vshared() +{ + vshared.shutdown = 0; + cshared.conf = c; /* copy */ + if (cshared.conf["port"] == "") { + cshared.conf["port"] = "9999"; + } + cshared.num_threads = cshared.conf.get_int("num_threads", 32); + cshared.sockargs.nonblocking = cshared.conf.get_int("nonblocking", 1); + cshared.sockargs.use_epoll = cshared.conf.get_int("use_epoll", 1); + if (cshared.sockargs.use_epoll) { + cshared.sockargs.nonblocking = 1; + } + cshared.readsize = cshared.conf.get_int("readsize", 1); + cshared.nb_conn_per_thread = cshared.conf.get_int("conn_per_thread", 1024); + cshared.for_write_flag = cshared.conf.get_int("for_write", 0); + cshared.plain_secret = cshared.conf.get_str("plain_secret", ""); + cshared.require_auth = !cshared.plain_secret.empty(); + cshared.sockargs.set(cshared.conf); + cshared.dbptr = database_i::create(c); + check_nfile(cshared.num_threads * cshared.nb_conn_per_thread); + thread_num_conns_vec.resize(cshared.num_threads); + cshared.thread_num_conns = thread_num_conns_vec.empty() + ? 0 : &thread_num_conns_vec[0]; +} + +hstcpsvr::~hstcpsvr() +{ + stop_workers(); +} + +std::string +hstcpsvr::start_listen() +{ + std::string err; + if (threads.size() != 0) { + return "start_listen: already running"; + } + if (socket_bind(cshared.listen_fd, cshared.sockargs, err) != 0) { + return "bind: " + err; + } + DENA_VERBOSE(20, fprintf(stderr, "bind done\n")); + const size_t stack_size = std::max( + cshared.conf.get_int("stack_size", 1 * 1024LL * 1024), 8 * 1024LL * 1024); + for (long i = 0; i < cshared.num_threads; ++i) { + hstcpsvr_worker_arg arg; + arg.cshared = &cshared; + arg.vshared = &vshared; + arg.worker_id = i; + std::auto_ptr< thread<worker_throbj> > thr( + new thread<worker_throbj>(arg, stack_size)); + threads.push_back_ptr(thr); + } + DENA_VERBOSE(20, fprintf(stderr, "threads created\n")); + for (size_t i = 0; i < threads.size(); ++i) { + threads[i]->start(); + } + DENA_VERBOSE(20, fprintf(stderr, "threads started\n")); + return std::string(); +} + +void +hstcpsvr::stop_workers() +{ + vshared.shutdown = 1; + for (size_t i = 0; i < threads.size(); ++i) { + threads[i]->join(); + } + threads.clear(); +} + +hstcpsvr_ptr +hstcpsvr_i::create(const config& conf) +{ + return hstcpsvr_ptr(new hstcpsvr(conf)); +} + +}; + diff --git a/plugin/handler_socket/handlersocket/hstcpsvr.hpp b/plugin/handler_socket/handlersocket/hstcpsvr.hpp new file mode 100644 index 00000000..811bfa25 --- /dev/null +++ b/plugin/handler_socket/handlersocket/hstcpsvr.hpp @@ -0,0 +1,58 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_HSTCPSVR_HPP +#define DENA_HSTCPSVR_HPP + +#include <memory> +#include <string> +#include <map> + +#include "mutex.hpp" +#include "auto_file.hpp" +#include "database.hpp" +#include "config.hpp" +#include "socket.hpp" + +namespace dena { + +struct hstcpsvr_shared_c { + config conf; + long num_threads; + long nb_conn_per_thread; + bool for_write_flag; + bool require_auth; + std::string plain_secret; + int readsize; + socket_args sockargs; + auto_file listen_fd; + database_ptr dbptr; + volatile unsigned int *thread_num_conns; /* 0 .. num_threads-1 */ + hstcpsvr_shared_c() : num_threads(0), nb_conn_per_thread(100), + for_write_flag(false), require_auth(false), readsize(0), + thread_num_conns(0) { } +}; + +struct hstcpsvr_shared_v : public mutex { + int shutdown; + hstcpsvr_shared_v() : shutdown(0) { } +}; + +struct hstcpsvr_i; +typedef std::auto_ptr<hstcpsvr_i> hstcpsvr_ptr; + +struct hstcpsvr_i { + virtual ~hstcpsvr_i() { } + virtual std::string start_listen() = 0; + static hstcpsvr_ptr create(const config& conf); +}; + +}; + +#endif + diff --git a/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp b/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp new file mode 100644 index 00000000..9863602a --- /dev/null +++ b/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp @@ -0,0 +1,957 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <my_global.h> +#include <netinet/in.h> +#include <errno.h> +#include <poll.h> +#include <unistd.h> +#include <stdexcept> +#include <signal.h> +#include <list> +#if __linux__ +#include <sys/epoll.h> +#endif +#ifdef HAVE_ALLOCA_H +#include <alloca.h> +#endif + +#include "hstcpsvr_worker.hpp" +#include "string_buffer.hpp" +#include "auto_ptrcontainer.hpp" +#include "string_util.hpp" +#include "escape.hpp" + +#define DBG_FD(x) +#define DBG_TR(x) +#define DBG_EP(x) +#define DBG_MULTI(x) + +/* TODO */ +#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(MSG_NOSIGNAL) +#define MSG_NOSIGNAL 0 +#endif + +namespace dena { + +struct dbconnstate { + string_buffer readbuf; + string_buffer writebuf; + std::vector<prep_stmt> prep_stmts; + size_t resp_begin_pos; + size_t find_nl_pos; + void reset() { + readbuf.clear(); + writebuf.clear(); + prep_stmts.clear(); + resp_begin_pos = 0; + find_nl_pos = 0; + } + dbconnstate() : resp_begin_pos(0), find_nl_pos(0) { } +}; + +struct hstcpsvr_conn; +typedef auto_ptrcontainer< std::list<hstcpsvr_conn *> > hstcpsvr_conns_type; + +struct hstcpsvr_conn : public dbcallback_i { + public: + auto_file fd; + sockaddr_storage addr; + size_socket addr_len; + dbconnstate cstate; + std::string err; + size_t readsize; + bool nonblocking; + bool read_finished; + bool write_finished; + time_t nb_last_io; + hstcpsvr_conns_type::iterator conns_iter; + bool authorized; + public: + bool closed() const; + bool ok_to_close() const; + void reset(); + int accept(const hstcpsvr_shared_c& cshared); + bool write_more(bool *more_r = 0); + bool read_more(bool *more_r = 0); + public: + virtual void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v); + virtual const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const; + virtual void dbcb_resp_short(uint32_t code, const char *msg); + virtual void dbcb_resp_short_num(uint32_t code, uint32_t value); + virtual void dbcb_resp_short_num64(uint32_t code, uint64_t value); + virtual void dbcb_resp_begin(size_t num_flds); + virtual void dbcb_resp_entry(const char *fld, size_t fldlen); + virtual void dbcb_resp_end(); + virtual void dbcb_resp_cancel(); + public: + hstcpsvr_conn() : addr_len(sizeof(addr)), readsize(4096), + nonblocking(false), read_finished(false), write_finished(false), + nb_last_io(0), authorized(false) { } +}; + +bool +hstcpsvr_conn::closed() const +{ + return fd.get() < 0; +} + +bool +hstcpsvr_conn::ok_to_close() const +{ + return write_finished || (read_finished && cstate.writebuf.size() == 0); +} + +void +hstcpsvr_conn::reset() +{ + addr = sockaddr_storage(); + addr_len = sizeof(addr); + cstate.reset(); + fd.reset(); + read_finished = false; + write_finished = false; +} + +int +hstcpsvr_conn::accept(const hstcpsvr_shared_c& cshared) +{ + reset(); + return socket_accept(cshared.listen_fd.get(), fd, cshared.sockargs, addr, + addr_len, err); +} + +bool +hstcpsvr_conn::write_more(bool *more_r) +{ + if (write_finished || cstate.writebuf.size() == 0) { + return false; + } + const size_t wlen = cstate.writebuf.size(); + ssize_t len = send(fd.get(), cstate.writebuf.begin(), wlen, MSG_NOSIGNAL); + if (len <= 0) { + if (len == 0 || !nonblocking || errno != EWOULDBLOCK) { + cstate.writebuf.clear(); + write_finished = true; + } + return false; + } + cstate.writebuf.erase_front(len); + /* FIXME: reallocate memory if too large */ + if (more_r) { + *more_r = (static_cast<size_t>(len) == wlen); + } + return true; +} + +bool +hstcpsvr_conn::read_more(bool *more_r) +{ + if (read_finished) { + return false; + } + const size_t block_size = readsize > 4096 ? readsize : 4096; + char *wp = cstate.readbuf.make_space(block_size); + const ssize_t len = read(fd.get(), wp, block_size); + if (len <= 0) { + if (len == 0 || !nonblocking || errno != EWOULDBLOCK) { + read_finished = true; + } + return false; + } + cstate.readbuf.space_wrote(len); + if (more_r) { + *more_r = (static_cast<size_t>(len) == block_size); + } + return true; +} + +void +hstcpsvr_conn::dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v) +{ + if (cstate.prep_stmts.size() <= pst_id) { + cstate.prep_stmts.resize(pst_id + 1); + } + cstate.prep_stmts[pst_id] = v; +} + +const prep_stmt * +hstcpsvr_conn::dbcb_get_prep_stmt(size_t pst_id) const +{ + if (cstate.prep_stmts.size() <= pst_id) { + return 0; + } + return &cstate.prep_stmts[pst_id]; +} + +void +hstcpsvr_conn::dbcb_resp_short(uint32_t code, const char *msg) +{ + write_ui32(cstate.writebuf, code); + const size_t msglen = strlen(msg); + if (msglen != 0) { + cstate.writebuf.append_literal("\t1\t"); + cstate.writebuf.append(msg, msg + msglen); + } else { + cstate.writebuf.append_literal("\t1"); + } + cstate.writebuf.append_literal("\n"); +} + +void +hstcpsvr_conn::dbcb_resp_short_num(uint32_t code, uint32_t value) +{ + write_ui32(cstate.writebuf, code); + cstate.writebuf.append_literal("\t1\t"); + write_ui32(cstate.writebuf, value); + cstate.writebuf.append_literal("\n"); +} + +void +hstcpsvr_conn::dbcb_resp_short_num64(uint32_t code, uint64_t value) +{ + write_ui32(cstate.writebuf, code); + cstate.writebuf.append_literal("\t1\t"); + write_ui64(cstate.writebuf, value); + cstate.writebuf.append_literal("\n"); +} + +void +hstcpsvr_conn::dbcb_resp_begin(size_t num_flds) +{ + cstate.resp_begin_pos = cstate.writebuf.size(); + cstate.writebuf.append_literal("0\t"); + write_ui32(cstate.writebuf, num_flds); +} + +void +hstcpsvr_conn::dbcb_resp_entry(const char *fld, size_t fldlen) +{ + if (fld != 0) { + cstate.writebuf.append_literal("\t"); + escape_string(cstate.writebuf, fld, fld + fldlen); + } else { + static const char t[] = "\t\0"; + cstate.writebuf.append(t, t + 2); + } +} + +void +hstcpsvr_conn::dbcb_resp_end() +{ + cstate.writebuf.append_literal("\n"); + cstate.resp_begin_pos = 0; +} + +void +hstcpsvr_conn::dbcb_resp_cancel() +{ + cstate.writebuf.resize(cstate.resp_begin_pos); + cstate.resp_begin_pos = 0; +} + +struct hstcpsvr_worker : public hstcpsvr_worker_i, private noncopyable { + hstcpsvr_worker(const hstcpsvr_worker_arg& arg); + virtual void run(); + private: + const hstcpsvr_shared_c& cshared; + volatile hstcpsvr_shared_v& vshared; + long worker_id; + dbcontext_ptr dbctx; + hstcpsvr_conns_type conns; /* conns refs dbctx */ + time_t last_check_time; + std::vector<pollfd> pfds; + #ifdef __linux__ + std::vector<epoll_event> events_vec; + auto_file epoll_fd; + #endif + bool accept_enabled; + int accept_balance; + std::vector<string_ref> invalues_work; + std::vector<record_filter> filters_work; + private: + int run_one_nb(); + int run_one_ep(); + void execute_lines(hstcpsvr_conn& conn); + void execute_line(char *start, char *finish, hstcpsvr_conn& conn); + void do_open_index(char *start, char *finish, hstcpsvr_conn& conn); + void do_exec_on_index(char *cmd_begin, char *cmd_end, char *start, + char *finish, hstcpsvr_conn& conn); + void do_authorization(char *start, char *finish, hstcpsvr_conn& conn); +}; + +hstcpsvr_worker::hstcpsvr_worker(const hstcpsvr_worker_arg& arg) + : cshared(*arg.cshared), vshared(*arg.vshared), worker_id(arg.worker_id), + dbctx(cshared.dbptr->create_context(cshared.for_write_flag)), + last_check_time(time(0)), accept_enabled(true), accept_balance(0) +{ + #ifdef __linux__ + if (cshared.sockargs.use_epoll) { + epoll_fd.reset(epoll_create(10)); + if (epoll_fd.get() < 0) { + fatal_abort("epoll_create"); + } + epoll_event ev; + memset(&ev, 0, sizeof(ev)); + ev.events = EPOLLIN; + ev.data.ptr = 0; + if (epoll_ctl(epoll_fd.get(), EPOLL_CTL_ADD, cshared.listen_fd.get(), &ev) + != 0) { + fatal_abort("epoll_ctl EPOLL_CTL_ADD"); + } + events_vec.resize(10240); + } + #endif + accept_balance = cshared.conf.get_int("accept_balance", 0); +} + +namespace { + +struct thr_init { + thr_init(const dbcontext_ptr& dc, volatile int& shutdown_flag) : dbctx(dc) { + dbctx->init_thread(this, shutdown_flag); + } + ~thr_init() { + dbctx->term_thread(); + } + const dbcontext_ptr& dbctx; +}; + +}; // namespace + +void +hstcpsvr_worker::run() +{ + thr_init initobj(dbctx, vshared.shutdown); + + #ifdef __linux__ + if (cshared.sockargs.use_epoll) { + while (!vshared.shutdown && dbctx->check_alive()) { + run_one_ep(); + } + } else if (cshared.sockargs.nonblocking) { + while (!vshared.shutdown && dbctx->check_alive()) { + run_one_nb(); + } + } else { + /* UNUSED */ + fatal_abort("run_one"); + } + #else + while (!vshared.shutdown && dbctx->check_alive()) { + run_one_nb(); + } + #endif +} + +int +hstcpsvr_worker::run_one_nb() +{ + size_t nfds = 0; + /* CLIENT SOCKETS */ + for (hstcpsvr_conns_type::const_iterator i = conns.begin(); + i != conns.end(); ++i) { + if (pfds.size() <= nfds) { + pfds.resize(nfds + 1); + } + pollfd& pfd = pfds[nfds++]; + pfd.fd = (*i)->fd.get(); + short ev = 0; + if ((*i)->cstate.writebuf.size() != 0) { + ev = POLLOUT; + } else { + ev = POLLIN; + } + pfd.events = pfd.revents = ev; + } + /* LISTENER */ + { + const size_t cpt = cshared.nb_conn_per_thread; + const short ev = (cpt > nfds) ? POLLIN : 0; + if (pfds.size() <= nfds) { + pfds.resize(nfds + 1); + } + pollfd& pfd = pfds[nfds++]; + pfd.fd = cshared.listen_fd.get(); + pfd.events = pfd.revents = ev; + } + /* POLL */ + const int npollev = poll(&pfds[0], nfds, 1 * 1000); + dbctx->set_statistics(conns.size(), npollev); + const time_t now = time(0); + size_t j = 0; + const short mask_in = ~POLLOUT; + const short mask_out = POLLOUT | POLLERR | POLLHUP | POLLNVAL; + /* READ */ + for (hstcpsvr_conns_type::iterator i = conns.begin(); i != conns.end(); + ++i, ++j) { + pollfd& pfd = pfds[j]; + if ((pfd.revents & mask_in) == 0) { + continue; + } + hstcpsvr_conn& conn = **i; + if (conn.read_more()) { + if (conn.cstate.readbuf.size() > 0) { + const char ch = conn.cstate.readbuf.begin()[0]; + if (ch == 'Q') { + vshared.shutdown = 1; + } else if (ch == '/') { + conn.cstate.readbuf.clear(); + conn.cstate.find_nl_pos = 0; + conn.cstate.writebuf.clear(); + conn.read_finished = true; + conn.write_finished = true; + } + } + conn.nb_last_io = now; + } + } + /* EXECUTE */ + j = 0; + for (hstcpsvr_conns_type::iterator i = conns.begin(); i != conns.end(); + ++i, ++j) { + pollfd& pfd = pfds[j]; + if ((pfd.revents & mask_in) == 0 || (*i)->cstate.readbuf.size() == 0) { + continue; + } + execute_lines(**i); + } + /* COMMIT */ + dbctx->unlock_tables_if(); + const bool commit_error = dbctx->get_commit_error(); + dbctx->clear_error(); + /* WRITE/CLOSE */ + j = 0; + for (hstcpsvr_conns_type::iterator i = conns.begin(); i != conns.end(); + ++j) { + pollfd& pfd = pfds[j]; + hstcpsvr_conn& conn = **i; + hstcpsvr_conns_type::iterator icur = i; + ++i; + if (commit_error) { + conn.reset(); + continue; + } + if ((pfd.revents & (mask_out | mask_in)) != 0) { + if (conn.write_more()) { + conn.nb_last_io = now; + } + } + if (cshared.sockargs.timeout != 0 && + conn.nb_last_io + cshared.sockargs.timeout < now) { + conn.reset(); + } + if (conn.closed() || conn.ok_to_close()) { + conns.erase_ptr(icur); + } + } + /* ACCEPT */ + { + pollfd& pfd = pfds[nfds - 1]; + if ((pfd.revents & mask_in) != 0) { + std::auto_ptr<hstcpsvr_conn> c(new hstcpsvr_conn()); + c->nonblocking = true; + c->readsize = cshared.readsize; + c->accept(cshared); + if (c->fd.get() >= 0) { + if (fcntl(c->fd.get(), F_SETFL, O_NONBLOCK) != 0) { + fatal_abort("F_SETFL O_NONBLOCK"); + } + c->nb_last_io = now; + conns.push_back_ptr(c); + } else { + /* errno == 11 (EAGAIN) is not a fatal error. */ + DENA_VERBOSE(100, fprintf(stderr, + "accept failed: errno=%d (not fatal)\n", errno)); + } + } + } + DENA_VERBOSE(30, fprintf(stderr, "nb: %p nfds=%zu cns=%zu\n", this, nfds, + conns.size())); + if (conns.empty()) { + dbctx->close_tables_if(); + } + dbctx->set_statistics(conns.size(), 0); + return 0; +} + +#ifdef __linux__ +int +hstcpsvr_worker::run_one_ep() +{ + epoll_event *const events = &events_vec[0]; + const size_t num_events = events_vec.size(); + const time_t now = time(0); + size_t in_count = 0, out_count = 0, accept_count = 0; + int nfds = epoll_wait(epoll_fd.get(), events, num_events, 1000); + /* READ/ACCEPT */ + dbctx->set_statistics(conns.size(), nfds); + for (int i = 0; i < nfds; ++i) { + epoll_event& ev = events[i]; + if ((ev.events & EPOLLIN) == 0) { + continue; + } + hstcpsvr_conn *const conn = static_cast<hstcpsvr_conn *>(ev.data.ptr); + if (conn == 0) { + /* listener */ + ++accept_count; + DBG_EP(fprintf(stderr, "IN listener\n")); + std::auto_ptr<hstcpsvr_conn> c(new hstcpsvr_conn()); + c->nonblocking = true; + c->readsize = cshared.readsize; + c->accept(cshared); + if (c->fd.get() >= 0) { + if (fcntl(c->fd.get(), F_SETFL, O_NONBLOCK) != 0) { + fatal_abort("F_SETFL O_NONBLOCK"); + } + epoll_event cev; + memset(&cev, 0, sizeof(cev)); + cev.events = EPOLLIN | EPOLLOUT | EPOLLET; + cev.data.ptr = c.get(); + c->nb_last_io = now; + const int fd = c->fd.get(); + conns.push_back_ptr(c); + conns.back()->conns_iter = --conns.end(); + if (epoll_ctl(epoll_fd.get(), EPOLL_CTL_ADD, fd, &cev) != 0) { + fatal_abort("epoll_ctl EPOLL_CTL_ADD"); + } + } else { + DENA_VERBOSE(100, fprintf(stderr, + "accept failed: errno=%d (not fatal)\n", errno)); + } + } else { + /* client connection */ + ++in_count; + DBG_EP(fprintf(stderr, "IN client\n")); + bool more_data = false; + while (conn->read_more(&more_data)) { + DBG_EP(fprintf(stderr, "IN client read_more\n")); + conn->nb_last_io = now; + if (!more_data) { + break; + } + } + } + } + /* EXECUTE */ + for (int i = 0; i < nfds; ++i) { + epoll_event& ev = events[i]; + hstcpsvr_conn *const conn = static_cast<hstcpsvr_conn *>(ev.data.ptr); + if ((ev.events & EPOLLIN) == 0 || conn == 0 || + conn->cstate.readbuf.size() == 0) { + continue; + } + const char ch = conn->cstate.readbuf.begin()[0]; + if (ch == 'Q') { + vshared.shutdown = 1; + } else if (ch == '/') { + conn->cstate.readbuf.clear(); + conn->cstate.find_nl_pos = 0; + conn->cstate.writebuf.clear(); + conn->read_finished = true; + conn->write_finished = true; + } else { + execute_lines(*conn); + } + } + /* COMMIT */ + dbctx->unlock_tables_if(); + const bool commit_error = dbctx->get_commit_error(); + dbctx->clear_error(); + /* WRITE */ + for (int i = 0; i < nfds; ++i) { + epoll_event& ev = events[i]; + hstcpsvr_conn *const conn = static_cast<hstcpsvr_conn *>(ev.data.ptr); + if (commit_error && conn != 0) { + conn->reset(); + continue; + } + if ((ev.events & EPOLLOUT) == 0) { + continue; + } + ++out_count; + if (conn == 0) { + /* listener */ + DBG_EP(fprintf(stderr, "OUT listener\n")); + } else { + /* client connection */ + DBG_EP(fprintf(stderr, "OUT client\n")); + bool more_data = false; + while (conn->write_more(&more_data)) { + DBG_EP(fprintf(stderr, "OUT client write_more\n")); + conn->nb_last_io = now; + if (!more_data) { + break; + } + } + } + } + /* CLOSE */ + for (int i = 0; i < nfds; ++i) { + epoll_event& ev = events[i]; + hstcpsvr_conn *const conn = static_cast<hstcpsvr_conn *>(ev.data.ptr); + if (conn != 0 && conn->ok_to_close()) { + DBG_EP(fprintf(stderr, "CLOSE close\n")); + conns.erase_ptr(conn->conns_iter); + } + } + /* TIMEOUT & cleanup */ + if (last_check_time + 10 < now) { + for (hstcpsvr_conns_type::iterator i = conns.begin(); + i != conns.end(); ) { + hstcpsvr_conns_type::iterator icur = i; + ++i; + if (cshared.sockargs.timeout != 0 && + (*icur)->nb_last_io + cshared.sockargs.timeout < now) { + conns.erase_ptr((*icur)->conns_iter); + } + } + last_check_time = now; + DENA_VERBOSE(20, fprintf(stderr, "ep: %p nfds=%d cns=%zu\n", this, nfds, + conns.size())); + } + DENA_VERBOSE(30, fprintf(stderr, "%p in=%zu out=%zu ac=%zu, cns=%zu\n", + this, in_count, out_count, accept_count, conns.size())); + if (conns.empty()) { + dbctx->close_tables_if(); + } + /* STATISTICS */ + const size_t num_conns = conns.size(); + dbctx->set_statistics(num_conns, 0); + /* ENABLE/DISABLE ACCEPT */ + if (accept_balance != 0) { + cshared.thread_num_conns[worker_id] = num_conns; + size_t total_num_conns = 0; + for (long i = 0; i < cshared.num_threads; ++i) { + total_num_conns += cshared.thread_num_conns[i]; + } + bool e_acc = false; + if (num_conns < 10 || + total_num_conns * 2 > num_conns * cshared.num_threads) { + e_acc = true; + } + epoll_event ev; + memset(&ev, 0, sizeof(ev)); + ev.events = EPOLLIN; + ev.data.ptr = 0; + if (e_acc == accept_enabled) { + } else if (e_acc) { + if (epoll_ctl(epoll_fd.get(), EPOLL_CTL_ADD, cshared.listen_fd.get(), &ev) + != 0) { + fatal_abort("epoll_ctl EPOLL_CTL_ADD"); + } + } else { + if (epoll_ctl(epoll_fd.get(), EPOLL_CTL_DEL, cshared.listen_fd.get(), &ev) + != 0) { + fatal_abort("epoll_ctl EPOLL_CTL_ADD"); + } + } + accept_enabled = e_acc; + } + return 0; +} +#endif + +void +hstcpsvr_worker::execute_lines(hstcpsvr_conn& conn) +{ + DBG_MULTI(int cnt = 0); + dbconnstate& cstate = conn.cstate; + char *buf_end = cstate.readbuf.end(); + char *line_begin = cstate.readbuf.begin(); + char *find_pos = line_begin + cstate.find_nl_pos; + while (true) { + char *const nl = memchr_char(find_pos, '\n', buf_end - find_pos); + if (nl == 0) { + break; + } + char *const lf = (line_begin != nl && nl[-1] == '\r') ? nl - 1 : nl; + DBG_MULTI(cnt++); + execute_line(line_begin, lf, conn); + find_pos = line_begin = nl + 1; + } + cstate.readbuf.erase_front(line_begin - cstate.readbuf.begin()); + cstate.find_nl_pos = cstate.readbuf.size(); + DBG_MULTI(fprintf(stderr, "cnt=%d\n", cnt)); +} + +void +hstcpsvr_worker::execute_line(char *start, char *finish, hstcpsvr_conn& conn) +{ + /* safe to modify, safe to dereference 'finish' */ + char *const cmd_begin = start; + read_token(start, finish); + char *const cmd_end = start; + skip_one(start, finish); + if (cmd_begin == cmd_end) { + return conn.dbcb_resp_short(2, "cmd"); + } + if (cmd_begin + 1 == cmd_end) { + if (cmd_begin[0] == 'P') { + if (cshared.require_auth && !conn.authorized) { + return conn.dbcb_resp_short(3, "unauth"); + } + return do_open_index(start, finish, conn); + } + if (cmd_begin[0] == 'A') { + return do_authorization(start, finish, conn); + } + } + if (cmd_begin[0] >= '0' && cmd_begin[0] <= '9') { + if (cshared.require_auth && !conn.authorized) { + return conn.dbcb_resp_short(3, "unauth"); + } + return do_exec_on_index(cmd_begin, cmd_end, start, finish, conn); + } + return conn.dbcb_resp_short(2, "cmd"); +} + +void +hstcpsvr_worker::do_open_index(char *start, char *finish, hstcpsvr_conn& conn) +{ + const size_t pst_id = read_ui32(start, finish); + skip_one(start, finish); + /* dbname */ + char *const dbname_begin = start; + read_token(start, finish); + char *const dbname_end = start; + skip_one(start, finish); + /* tblname */ + char *const tblname_begin = start; + read_token(start, finish); + char *const tblname_end = start; + skip_one(start, finish); + /* idxname */ + char *const idxname_begin = start; + read_token(start, finish); + char *const idxname_end = start; + skip_one(start, finish); + /* retfields */ + char *const retflds_begin = start; + read_token(start, finish); + char *const retflds_end = start; + skip_one(start, finish); + /* filfields */ + char *const filflds_begin = start; + read_token(start, finish); + char *const filflds_end = start; + dbname_end[0] = 0; + tblname_end[0] = 0; + idxname_end[0] = 0; + retflds_end[0] = 0; + filflds_end[0] = 0; + cmd_open_args args; + args.pst_id = pst_id; + args.dbn = dbname_begin; + args.tbl = tblname_begin; + args.idx = idxname_begin; + args.retflds = retflds_begin; + args.filflds = filflds_begin; + return dbctx->cmd_open(conn, args); +} + +void +hstcpsvr_worker::do_exec_on_index(char *cmd_begin, char *cmd_end, char *start, + char *finish, hstcpsvr_conn& conn) +{ + cmd_exec_args args; + const size_t pst_id = read_ui32(cmd_begin, cmd_end); + if (pst_id >= conn.cstate.prep_stmts.size()) { + return conn.dbcb_resp_short(2, "stmtnum"); + } + args.pst = &conn.cstate.prep_stmts[pst_id]; + char *const op_begin = start; + read_token(start, finish); + char *const op_end = start; + args.op = string_ref(op_begin, op_end); + skip_one(start, finish); + const uint32_t fldnum = read_ui32(start, finish); + string_ref *const flds = DENA_ALLOCA_ALLOCATE(string_ref, fldnum); + auto_alloca_free<string_ref> flds_autofree(flds); + args.kvals = flds; + args.kvalslen = fldnum; + for (size_t i = 0; i < fldnum; ++i) { + skip_one(start, finish); + char *const f_begin = start; + read_token(start, finish); + char *const f_end = start; + if (is_null_expression(f_begin, f_end)) { + /* null */ + flds[i] = string_ref(); + } else { + /* non-null */ + char *wp = f_begin; + unescape_string(wp, f_begin, f_end); + flds[i] = string_ref(f_begin, wp - f_begin); + } + } + skip_one(start, finish); + args.limit = read_ui32(start, finish); + skip_one(start, finish); + args.skip = read_ui32(start, finish); + if (start == finish) { + /* simple query */ + return dbctx->cmd_exec(conn, args); + } + /* has more options */ + skip_one(start, finish); + /* in-clause */ + if (start[0] == '@') { + read_token(start, finish); /* '@' */ + skip_one(start, finish); + args.invalues_keypart = read_ui32(start, finish); + skip_one(start, finish); + args.invalueslen = read_ui32(start, finish); + if (args.invalueslen <= 0) { + return conn.dbcb_resp_short(2, "invalueslen"); + } + if (invalues_work.size() < args.invalueslen) { + invalues_work.resize(args.invalueslen); + } + args.invalues = &invalues_work[0]; + for (uint32_t i = 0; i < args.invalueslen; ++i) { + skip_one(start, finish); + char *const invalue_begin = start; + read_token(start, finish); + char *const invalue_end = start; + char *wp = invalue_begin; + unescape_string(wp, invalue_begin, invalue_end); + invalues_work[i] = string_ref(invalue_begin, wp - invalue_begin); + } + skip_one(start, finish); + } + if (start == finish) { + /* no more options */ + return dbctx->cmd_exec(conn, args); + } + /* filters */ + size_t filters_count = 0; + while (start != finish && (start[0] == 'W' || start[0] == 'F')) { + char *const filter_type_begin = start; + read_token(start, finish); + char *const filter_type_end = start; + skip_one(start, finish); + char *const filter_op_begin = start; + read_token(start, finish); + char *const filter_op_end = start; + skip_one(start, finish); + const uint32_t ff_offset = read_ui32(start, finish); + skip_one(start, finish); + char *const filter_val_begin = start; + read_token(start, finish); + char *const filter_val_end = start; + skip_one(start, finish); + if (filters_work.size() <= filters_count) { + filters_work.resize(filters_count + 1); + } + record_filter& fi = filters_work[filters_count]; + if (filter_type_end != filter_type_begin + 1) { + return conn.dbcb_resp_short(2, "filtertype"); + } + fi.filter_type = (filter_type_begin[0] == 'W') + ? record_filter_type_break : record_filter_type_skip; + const uint32_t num_filflds = args.pst->get_filter_fields().size(); + if (ff_offset >= num_filflds) { + return conn.dbcb_resp_short(2, "filterfld"); + } + fi.op = string_ref(filter_op_begin, filter_op_end); + fi.ff_offset = ff_offset; + if (is_null_expression(filter_val_begin, filter_val_end)) { + /* null */ + fi.val = string_ref(); + } else { + /* non-null */ + char *wp = filter_val_begin; + unescape_string(wp, filter_val_begin, filter_val_end); + fi.val = string_ref(filter_val_begin, wp - filter_val_begin); + } + ++filters_count; + } + if (filters_count > 0) { + if (filters_work.size() <= filters_count) { + filters_work.resize(filters_count + 1); + } + filters_work[filters_count].op = string_ref(); /* sentinel */ + args.filters = &filters_work[0]; + } else { + args.filters = 0; + } + if (start == finish) { + /* no modops */ + return dbctx->cmd_exec(conn, args); + } + /* has modops */ + char *const mod_op_begin = start; + read_token(start, finish); + char *const mod_op_end = start; + args.mod_op = string_ref(mod_op_begin, mod_op_end); + const size_t num_uvals = args.pst->get_ret_fields().size(); + string_ref *const uflds = DENA_ALLOCA_ALLOCATE(string_ref, num_uvals); + auto_alloca_free<string_ref> uflds_autofree(uflds); + for (size_t i = 0; i < num_uvals; ++i) { + skip_one(start, finish); + char *const f_begin = start; + read_token(start, finish); + char *const f_end = start; + if (is_null_expression(f_begin, f_end)) { + /* null */ + uflds[i] = string_ref(); + } else { + /* non-null */ + char *wp = f_begin; + unescape_string(wp, f_begin, f_end); + uflds[i] = string_ref(f_begin, wp - f_begin); + } + } + args.uvals = uflds; + return dbctx->cmd_exec(conn, args); +} + +void +hstcpsvr_worker::do_authorization(char *start, char *finish, + hstcpsvr_conn& conn) +{ + /* auth type */ + char *const authtype_begin = start; + read_token(start, finish); + char *const authtype_end = start; + const size_t authtype_len = authtype_end - authtype_begin; + skip_one(start, finish); + /* key */ + char *const key_begin = start; + read_token(start, finish); + char *const key_end = start; + const size_t key_len = key_end - key_begin; + authtype_end[0] = 0; + key_end[0] = 0; + char *wp = key_begin; + unescape_string(wp, key_begin, key_end); + if (authtype_len != 1 || authtype_begin[0] != '1') { + return conn.dbcb_resp_short(3, "authtype"); + } + if (cshared.plain_secret.size() == key_len && + memcmp(cshared.plain_secret.data(), key_begin, key_len) == 0) { + conn.authorized = true; + } else { + conn.authorized = false; + } + if (!conn.authorized) { + return conn.dbcb_resp_short(3, "unauth"); + } else { + return conn.dbcb_resp_short(0, ""); + } +} + +hstcpsvr_worker_ptr +hstcpsvr_worker_i::create(const hstcpsvr_worker_arg& arg) +{ + return hstcpsvr_worker_ptr(new hstcpsvr_worker(arg)); +} + +}; + diff --git a/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp b/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp new file mode 100644 index 00000000..497581c2 --- /dev/null +++ b/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp @@ -0,0 +1,35 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_HSTCPSVR_WORKER_HPP +#define DENA_HSTCPSVR_WORKER_HPP + +#include "hstcpsvr.hpp" + +namespace dena { + +struct hstcpsvr_worker_i; +typedef std::auto_ptr<hstcpsvr_worker_i> hstcpsvr_worker_ptr; + +struct hstcpsvr_worker_arg { + const hstcpsvr_shared_c *cshared; + volatile hstcpsvr_shared_v *vshared; + long worker_id; + hstcpsvr_worker_arg() : cshared(0), vshared(0), worker_id(0) { } +}; + +struct hstcpsvr_worker_i { + virtual ~hstcpsvr_worker_i() { } + virtual void run() = 0; + static hstcpsvr_worker_ptr create(const hstcpsvr_worker_arg& arg); +}; + +}; + +#endif + diff --git a/plugin/handler_socket/handlersocket/mysql_incl.hpp b/plugin/handler_socket/handlersocket/mysql_incl.hpp new file mode 100644 index 00000000..0d056a7e --- /dev/null +++ b/plugin/handler_socket/handlersocket/mysql_incl.hpp @@ -0,0 +1,55 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_MYSQL_INCL_HPP +#define DENA_MYSQL_INCL_HPP + +#ifndef HAVE_CONFIG_H +#define HAVE_CONFIG_H +#endif + +#ifndef MYSQL_DYNAMIC_PLUGIN +#define MYSQL_DYNAMIC_PLUGIN +#endif + +#define MYSQL_SERVER 1 + +#include <my_global.h> +#include <mysql_version.h> + +#if MYSQL_VERSION_ID >= 50505 +#include <my_pthread.h> +#include <sql_priv.h> +#include "sql_class.h" +#include "unireg.h" +#include "lock.h" +#include "key.h" // key_copy() +#include <my_global.h> +#include <mysql/plugin.h> +#include <transaction.h> +#include <sql_base.h> +// FIXME FIXME FIXME +#define safeFree(X) my_free(X) +#undef pthread_cond_timedwait +#undef pthread_mutex_lock +#undef pthread_mutex_unlock +#define pthread_cond_timedwait mysql_cond_timedwait +#define pthread_mutex_lock mysql_mutex_lock +#define pthread_mutex_unlock mysql_mutex_unlock +#define current_stmt_binlog_row_based is_current_stmt_binlog_format_row +#define clear_current_stmt_binlog_row_based clear_current_stmt_binlog_format_row + +#else +#include "mysql_priv.h" +#endif + +#undef min +#undef max + +#endif + diff --git a/plugin/handler_socket/libhsclient/COPYRIGHT.txt b/plugin/handler_socket/libhsclient/COPYRIGHT.txt new file mode 100644 index 00000000..41dda127 --- /dev/null +++ b/plugin/handler_socket/libhsclient/COPYRIGHT.txt @@ -0,0 +1,27 @@ + + Copyright (c) 2010 DeNA Co.,Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of DeNA Co.,Ltd. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY DeNA Co.,Ltd. "AS IS" AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + EVENT SHALL DeNA Co.,Ltd. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/plugin/handler_socket/libhsclient/Makefile.am b/plugin/handler_socket/libhsclient/Makefile.am new file mode 100644 index 00000000..343b4186 --- /dev/null +++ b/plugin/handler_socket/libhsclient/Makefile.am @@ -0,0 +1,12 @@ +CXXFLAGS += -fimplicit-templates +instdir = $(includedir)/handlersocket +# TODO: these headers should be in dena/ +inst_HEADERS = allocator.hpp config.hpp mutex.hpp string_util.hpp \ + auto_addrinfo.hpp escape.hpp socket.hpp thread.hpp auto_file.hpp \ + fatal.hpp string_buffer.hpp util.hpp auto_ptrcontainer.hpp \ + hstcpcli.hpp string_ref.hpp +lib_LTLIBRARIES = libhsclient.la +libhsclient_la_SOURCES = config.cpp escape.cpp fatal.cpp hstcpcli.cpp \ + socket.cpp string_util.cpp +libhsclient_la_CFLAGS = $(AM_CFLAGS) +libhsclient_la_CXXFLAGS = $(AM_CXXFLAGS) diff --git a/plugin/handler_socket/libhsclient/Makefile.plain b/plugin/handler_socket/libhsclient/Makefile.plain new file mode 100644 index 00000000..9e6277b6 --- /dev/null +++ b/plugin/handler_socket/libhsclient/Makefile.plain @@ -0,0 +1,27 @@ + +CXX = g++ -Wall -g -fno-rtti -fno-exceptions -fPIC -DPIC +LDFLAGS = + +CXXFLAGS += -O3 -DNDEBUG + +COMMON_OBJS = config.o fatal.o socket.o string_util.o escape.o +HSCLIENT_OBJS = $(COMMON_OBJS) hstcpcli.o + +all: libhsclient.a + +libhsclient.a: $(HSCLIENT_OBJS) + $(AR) rc $@ $^ + $(AR) s $@ + +clean: + rm -f *.a *.so *.o + +LIBDIR = $(shell \ + if [ -e /usr/lib64/mysql ]; then echo /usr/lib64; else echo /usr/lib; fi) + +install: libhsclient.a + sudo sh -c 'cp libhsclient.a libhsclient.a.cpy && \ + mv libhsclient.a.cpy $(LIBDIR)/libhsclient.a && \ + mkdir -p /usr/include/handlersocket && \ + cp -a *.hpp /usr/include/handlersocket/' + diff --git a/plugin/handler_socket/libhsclient/allocator.hpp b/plugin/handler_socket/libhsclient/allocator.hpp new file mode 100644 index 00000000..dd3a28ba --- /dev/null +++ b/plugin/handler_socket/libhsclient/allocator.hpp @@ -0,0 +1,64 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_ALLOCATOR_HPP +#define DENA_ALLOCATOR_HPP + +#include <stdlib.h> +#include <string.h> + +#if 0 +extern "C" { +#include <tlsf.h> +}; +#define DENA_MALLOC(x) tlsf_malloc(x) +#define DENA_REALLOC(x, y) tlsf_realloc(x, y) +#define DENA_FREE(x) tlsf_free(x) +#define DENA_NEWCHAR(x) static_cast<char *>(tlsf_malloc(x)) +#define DENA_DELETE(x) tlsf_free(x) +typedef std::allocator<int> allocator_type; +#endif + +#if 1 +#define DENA_MALLOC(x) malloc(x) +#define DENA_REALLOC(x, y) realloc(x, y) +#define DENA_FREE(x) free(x) +#define DENA_NEWCHAR(x) (new char[x]) +#define DENA_DELETE(x) (delete [] x) +typedef std::allocator<int> allocator_type; +#endif + +#if 1 +#define DENA_ALLOCA_ALLOCATE(typ, len) \ + (typ *) alloca((len) * sizeof(typ)) +#define DENA_ALLOCA_FREE(x) +#else +#define DENA_ALLOCA_ALLOCATE(typ, len) \ + static_cast<typ *>(malloc((len) * sizeof(typ))) +#define DENA_ALLOCA_FREE(x) free(x) +#endif + +namespace dena { + +template <typename T> struct auto_alloca_free { + auto_alloca_free(T *value) : value(value) { } + ~auto_alloca_free() { + /* no-op if alloca() is used */ + DENA_ALLOCA_FREE(value); + } + private: + auto_alloca_free(const auto_alloca_free&); + auto_alloca_free& operator =(const auto_alloca_free&); + private: + T *value; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/auto_addrinfo.hpp b/plugin/handler_socket/libhsclient/auto_addrinfo.hpp new file mode 100644 index 00000000..f9db70fe --- /dev/null +++ b/plugin/handler_socket/libhsclient/auto_addrinfo.hpp @@ -0,0 +1,52 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_AUTO_ADDRINFO_HPP +#define DENA_AUTO_ADDRINFO_HPP + +#include <my_global.h> +#include <sys/socket.h> +#include <netdb.h> +#include <string.h> +#include "util.hpp" + +typedef SOCKET_SIZE_TYPE size_socket; + +namespace dena { + +struct auto_addrinfo : private noncopyable { + auto_addrinfo() : addr(0) { } + ~auto_addrinfo() { + reset(); + } + void reset(addrinfo *a = 0) { + if (addr != 0) { + freeaddrinfo(addr); + } + addr = a; + } + const addrinfo *get() const { return addr; } + int resolve(const char *node, const char *service, int flags = 0, + int family = AF_UNSPEC, int socktype = SOCK_STREAM, int protocol = 0) { + addrinfo hints; + reset(); + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = flags; + hints.ai_family = family; + hints.ai_socktype = socktype; + hints.ai_protocol = protocol; + return getaddrinfo(node, service, &hints, &addr); + } + private: + addrinfo *addr; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/auto_file.hpp b/plugin/handler_socket/libhsclient/auto_file.hpp new file mode 100644 index 00000000..03c357f4 --- /dev/null +++ b/plugin/handler_socket/libhsclient/auto_file.hpp @@ -0,0 +1,69 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_AUTO_FILE_HPP +#define DENA_AUTO_FILE_HPP + +/* Workaround for _LARGE_FILES and _LARGE_FILE_API incompatibility on AIX */ +#if defined(_AIX) && defined(_LARGE_FILE_API) +#undef _LARGE_FILE_API +#endif + +#include <unistd.h> +#include <sys/types.h> +#include <dirent.h> +#include <stdio.h> + +#include "util.hpp" + +namespace dena { + +struct auto_file : private noncopyable { + auto_file() : fd(-1) { } + ~auto_file() { + reset(); + } + int get() const { return fd; } + int close() { + if (fd < 0) { + return 0; + } + const int r = ::close(fd); + fd = -1; + return r; + } + void reset(int x = -1) { + if (fd >= 0) { + this->close(); + } + fd = x; + } + private: + int fd; +}; + +struct auto_dir : private noncopyable { + auto_dir() : dp(0) { } + ~auto_dir() { + reset(); + } + DIR *get() const { return dp; } + void reset(DIR *d = 0) { + if (dp != 0) { + closedir(dp); + } + dp = d; + } + private: + DIR *dp; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/auto_ptrcontainer.hpp b/plugin/handler_socket/libhsclient/auto_ptrcontainer.hpp new file mode 100644 index 00000000..314bc151 --- /dev/null +++ b/plugin/handler_socket/libhsclient/auto_ptrcontainer.hpp @@ -0,0 +1,67 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_AUTO_PTRCONTAINER_HPP +#define DENA_AUTO_PTRCONTAINER_HPP + +namespace dena { + +template <typename Tcnt> +struct auto_ptrcontainer { + typedef Tcnt container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::pointer pointer; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + typedef typename container_type::difference_type difference_type; + typedef typename container_type::iterator iterator; + typedef typename container_type::const_iterator const_iterator; + typedef typename container_type::reverse_iterator reverse_iterator; + typedef typename container_type::const_reverse_iterator + const_reverse_iterator; + iterator begin() { return cnt.begin(); } + const_iterator begin() const { return cnt.begin(); } + iterator end() { return cnt.end(); } + const_iterator end() const { return cnt.end(); } + reverse_iterator rbegin() { return cnt.rbegin(); } + reverse_iterator rend() { return cnt.rend(); } + const_reverse_iterator rbegin() const { return cnt.rbegin(); } + const_reverse_iterator rend() const { return cnt.rend(); } + size_type size() const { return cnt.size(); } + size_type max_size() const { return cnt.max_size(); } + bool empty() const { return cnt.empty(); } + reference front() { return cnt.front(); } + const_reference front() const { cnt.front(); } + reference back() { return cnt.back(); } + const_reference back() const { cnt.back(); } + void swap(auto_ptrcontainer& x) { cnt.swap(x.cnt); } + ~auto_ptrcontainer() { + for (iterator i = begin(); i != end(); ++i) { + delete *i; + } + } + template <typename Tap> void push_back_ptr(Tap& ap) { + cnt.push_back(ap.get()); + ap.release(); + } + void erase_ptr(iterator i) { + delete *i; + cnt.erase(i); + } + reference operator [](size_type n) { return cnt[n]; } + const_reference operator [](size_type n) const { return cnt[n]; } + void clear() { cnt.clear(); } + private: + Tcnt cnt; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/config.cpp b/plugin/handler_socket/libhsclient/config.cpp new file mode 100644 index 00000000..3c90b36d --- /dev/null +++ b/plugin/handler_socket/libhsclient/config.cpp @@ -0,0 +1,67 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "config.hpp" + +namespace dena { + +unsigned int verbose_level = 0; + +std::string +config::get_str(const std::string& key, const std::string& def) const +{ + const_iterator iter = this->find(key); + if (iter == this->end()) { + DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s(default)\n", key.c_str(), + def.c_str())); + return def; + } + DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s\n", key.c_str(), + iter->second.c_str())); + return iter->second; +} + +long long +config::get_int(const std::string& key, long long def) const +{ + const_iterator iter = this->find(key); + if (iter == this->end()) { + DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld(default)\n", key.c_str(), + def)); + return def; + } + const long long r = atoll(iter->second.c_str()); + DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld\n", key.c_str(), r)); + return r; +} + +void +parse_args(int argc, char **argv, config& conf) +{ + for (int i = 1; i < argc; ++i) { + const char *const arg = argv[i]; + const char *const eq = strchr(arg, '='); + if (eq == 0) { + continue; + } + const std::string key(arg, eq - arg); + const std::string val(eq + 1); + conf[key] = val; + } + config::const_iterator iter = conf.find("verbose"); + if (iter != conf.end()) { + verbose_level = atoi(iter->second.c_str()); + } +} + +}; + diff --git a/plugin/handler_socket/libhsclient/config.hpp b/plugin/handler_socket/libhsclient/config.hpp new file mode 100644 index 00000000..c9f16c76 --- /dev/null +++ b/plugin/handler_socket/libhsclient/config.hpp @@ -0,0 +1,32 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_CONFIG_HPP +#define DENA_CONFIG_HPP + +#include <string> +#include <map> + +#define DENA_VERBOSE(lv, x) if (dena::verbose_level >= (lv)) { (x); } + +namespace dena { + +struct config : public std::map<std::string, std::string> { + std::string get_str(const std::string& key, const std::string& def = "") + const; + long long get_int(const std::string& key, long long def = 0) const; +}; + +void parse_args(int argc, char **argv, config& conf); + +extern unsigned int verbose_level; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/escape.cpp b/plugin/handler_socket/libhsclient/escape.cpp new file mode 100644 index 00000000..d4df8ae8 --- /dev/null +++ b/plugin/handler_socket/libhsclient/escape.cpp @@ -0,0 +1,127 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <stdio.h> + +#include "escape.hpp" +#include "string_buffer.hpp" +#include "fatal.hpp" +#include "string_util.hpp" + +#define DBG_OP(x) +#define DBG_BUF(x) + +namespace dena { + +enum special_char_t { + special_char_escape_prefix = 0x01, /* SOH */ + special_char_noescape_min = 0x10, /* DLE */ + special_char_escape_shift = 0x40, /* '@' */ +}; + +void +escape_string(char *& wp, const char *start, const char *finish) +{ + while (start != finish) { + const unsigned char c = *start; + if (c >= special_char_noescape_min) { + wp[0] = c; /* no need to escape */ + } else { + wp[0] = special_char_escape_prefix; + ++wp; + wp[0] = c + special_char_escape_shift; + } + ++start; + ++wp; + } +} + +void +escape_string(string_buffer& ar, const char *start, const char *finish) +{ + const size_t buflen = (finish - start) * 2; + char *const wp_begin = ar.make_space(buflen); + char *wp = wp_begin; + escape_string(wp, start, finish); + ar.space_wrote(wp - wp_begin); +} + +bool +unescape_string(char *& wp, const char *start, const char *finish) +{ + /* works even if wp == start */ + while (start != finish) { + const unsigned char c = *start; + if (c != special_char_escape_prefix) { + wp[0] = c; + } else if (start + 1 != finish) { + ++start; + const unsigned char cn = *start; + if (cn < special_char_escape_shift) { + return false; + } + wp[0] = cn - special_char_escape_shift; + } else { + return false; + } + ++start; + ++wp; + } + return true; +} + +bool +unescape_string(string_buffer& ar, const char *start, const char *finish) +{ + const size_t buflen = finish - start; + char *const wp_begin = ar.make_space(buflen); + char *wp = wp_begin; + const bool r = unescape_string(wp, start, finish); + ar.space_wrote(wp - wp_begin); + return r; +} + +uint32_t +read_ui32(char *& start, char *finish) +{ + char *const n_begin = start; + read_token(start, finish); + char *const n_end = start; + uint32_t v = 0; + for (char *p = n_begin; p != n_end; ++p) { + const char ch = p[0]; + if (ch >= '0' && ch <= '9') { + v *= 10; + v += (ch - '0'); + } + } + return v; +} + +void +write_ui32(string_buffer& buf, uint32_t v) +{ + char *wp = buf.make_space(12); + int len = snprintf(wp, 12, "%u", v); + if (len > 0) { + buf.space_wrote(len); + } +} + +void +write_ui64(string_buffer& buf, uint64_t v) +{ + char *wp = buf.make_space(22); + int len = snprintf(wp, 22, "%llu", static_cast<unsigned long long>(v)); + if (len > 0) { + buf.space_wrote(len); + } +} + +}; + diff --git a/plugin/handler_socket/libhsclient/escape.hpp b/plugin/handler_socket/libhsclient/escape.hpp new file mode 100644 index 00000000..b928defe --- /dev/null +++ b/plugin/handler_socket/libhsclient/escape.hpp @@ -0,0 +1,66 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <stdint.h> + +#include "string_buffer.hpp" +#include "string_ref.hpp" +#include "string_util.hpp" + +#ifndef DENA_ESCAPE_HPP +#define DENA_ESCAPE_HPP + +namespace dena { + +void escape_string(char *& wp, const char *start, const char *finish); +void escape_string(string_buffer& ar, const char *start, const char *finish); +bool unescape_string(char *& wp, const char *start, const char *finish); + /* unescaped_string() works even if wp == start */ +bool unescape_string(string_buffer& ar, const char *start, const char *finish); + +uint32_t read_ui32(char *& start, char *finish); +void write_ui32(string_buffer& buf, uint32_t v); +void write_ui64(string_buffer& buf, uint64_t v); + +inline bool +is_null_expression(const char *start, const char *finish) +{ + return (finish == start + 1 && start[0] == 0); +} + +inline void +read_token(char *& start, char *finish) +{ + char *const p = memchr_char(start, '\t', finish - start); + if (p == 0) { + start = finish; + } else { + start = p; + } +} + +inline void +skip_token_delim_fold(char *& start, char *finish) +{ + while (start != finish && start[0] == '\t') { + ++start; + } +} + +inline void +skip_one(char *& start, char *finish) +{ + if (start != finish) { + ++start; + } +} + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/fatal.cpp b/plugin/handler_socket/libhsclient/fatal.cpp new file mode 100644 index 00000000..8e109cf1 --- /dev/null +++ b/plugin/handler_socket/libhsclient/fatal.cpp @@ -0,0 +1,29 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <syslog.h> +#include <unistd.h> + +#include "fatal.hpp" + +namespace dena { + +const int opt_syslog = LOG_ERR | LOG_PID | LOG_CONS; + +void +fatal_abort(const std::string& message) +{ + fprintf(stderr, "FATAL_COREDUMP: %s\n", message.c_str()); + syslog(opt_syslog, "FATAL_COREDUMP: %s", message.c_str()); + abort(); +} + +}; + diff --git a/plugin/handler_socket/libhsclient/fatal.hpp b/plugin/handler_socket/libhsclient/fatal.hpp new file mode 100644 index 00000000..5eaa3db8 --- /dev/null +++ b/plugin/handler_socket/libhsclient/fatal.hpp @@ -0,0 +1,21 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_FATAL_HPP +#define DENA_FATAL_HPP + +#include <string> + +namespace dena { + +void fatal_abort(const std::string& message); + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/hstcpcli.cpp b/plugin/handler_socket/libhsclient/hstcpcli.cpp new file mode 100644 index 00000000..461bed3f --- /dev/null +++ b/plugin/handler_socket/libhsclient/hstcpcli.cpp @@ -0,0 +1,442 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <my_global.h> +#include <stdexcept> + +#include "hstcpcli.hpp" +#include "auto_file.hpp" +#include "string_util.hpp" +#include "auto_addrinfo.hpp" +#include "escape.hpp" +#include "util.hpp" + +/* TODO */ +#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(MSG_NOSIGNAL) +#define MSG_NOSIGNAL 0 +#endif + +#define DBG(x) + +namespace dena { + +struct hstcpcli : public hstcpcli_i, private noncopyable { + hstcpcli(const socket_args& args); + virtual void close(); + virtual int reconnect(); + virtual bool stable_point(); + virtual void request_buf_open_index(size_t pst_id, const char *dbn, + const char *tbl, const char *idx, const char *retflds, const char *filflds); + virtual void request_buf_auth(const char *secret, const char *typ); + virtual void request_buf_exec_generic(size_t pst_id, const string_ref& op, + const string_ref *kvs, size_t kvslen, uint32_t limit, uint32_t skip, + const string_ref& mod_op, const string_ref *mvs, size_t mvslen, + const hstcpcli_filter *fils, size_t filslen, int invalues_keypart, + const string_ref *invalues, size_t invalueslen); + virtual int request_send(); + virtual int response_recv(size_t& num_flds_r); + virtual const string_ref *get_next_row(); + virtual void response_buf_remove(); + virtual int get_error_code(); + virtual std::string get_error(); + private: + int read_more(); + void clear_error(); + int set_error(int code, const std::string& str); + private: + auto_file fd; + socket_args sargs; + string_buffer readbuf; + string_buffer writebuf; + size_t response_end_offset; /* incl newline */ + size_t cur_row_offset; + size_t num_flds; + size_t num_req_bufd; /* buffered but not yet sent */ + size_t num_req_sent; /* sent but not yet received */ + size_t num_req_rcvd; /* received but not yet removed */ + int error_code; + std::string error_str; + std::vector<string_ref> flds; +}; + +hstcpcli::hstcpcli(const socket_args& args) + : sargs(args), response_end_offset(0), cur_row_offset(0), num_flds(0), + num_req_bufd(0), num_req_sent(0), num_req_rcvd(0), error_code(0) +{ + std::string err; + if (socket_connect(fd, sargs, err) != 0) { + set_error(-1, err); + } +} + +void +hstcpcli::close() +{ + fd.close(); + readbuf.clear(); + writebuf.clear(); + flds.clear(); + response_end_offset = 0; + cur_row_offset = 0; + num_flds = 0; + num_req_bufd = 0; + num_req_sent = 0; + num_req_rcvd = 0; +} + +int +hstcpcli::reconnect() +{ + clear_error(); + close(); + std::string err; + if (socket_connect(fd, sargs, err) != 0) { + set_error(-1, err); + } + return error_code; +} + +bool +hstcpcli::stable_point() +{ + /* returns true if cli can send a new request */ + return fd.get() >= 0 && num_req_bufd == 0 && num_req_sent == 0 && + num_req_rcvd == 0 && response_end_offset == 0; +} + +int +hstcpcli::get_error_code() +{ + return error_code; +} + +std::string +hstcpcli::get_error() +{ + return error_str; +} + +int +hstcpcli::read_more() +{ + const size_t block_size = 4096; // FIXME + char *const wp = readbuf.make_space(block_size); + const ssize_t rlen = read(fd.get(), wp, block_size); + if (rlen <= 0) { + if (rlen < 0) { + error_str = "read: failed"; + } else { + error_str = "read: eof"; + } + return rlen; + } + readbuf.space_wrote(rlen); + return rlen; +} + +void +hstcpcli::clear_error() +{ + DBG(fprintf(stderr, "CLEAR_ERROR: %d\n", error_code)); + error_code = 0; + error_str.clear(); +} + +int +hstcpcli::set_error(int code, const std::string& str) +{ + DBG(fprintf(stderr, "SET_ERROR: %d\n", code)); + error_code = code; + error_str = str; + return error_code; +} + +void +hstcpcli::request_buf_open_index(size_t pst_id, const char *dbn, + const char *tbl, const char *idx, const char *retflds, const char *filflds) +{ + if (num_req_sent > 0 || num_req_rcvd > 0) { + close(); + set_error(-1, "request_buf_open_index: protocol out of sync"); + return; + } + const string_ref dbn_ref(dbn, strlen(dbn)); + const string_ref tbl_ref(tbl, strlen(tbl)); + const string_ref idx_ref(idx, strlen(idx)); + const string_ref rfs_ref(retflds, strlen(retflds)); + writebuf.append_literal("P\t"); + append_uint32(writebuf, pst_id); // FIXME size_t ? + writebuf.append_literal("\t"); + writebuf.append(dbn_ref.begin(), dbn_ref.end()); + writebuf.append_literal("\t"); + writebuf.append(tbl_ref.begin(), tbl_ref.end()); + writebuf.append_literal("\t"); + writebuf.append(idx_ref.begin(), idx_ref.end()); + writebuf.append_literal("\t"); + writebuf.append(rfs_ref.begin(), rfs_ref.end()); + if (filflds != 0) { + const string_ref fls_ref(filflds, strlen(filflds)); + writebuf.append_literal("\t"); + writebuf.append(fls_ref.begin(), fls_ref.end()); + } + writebuf.append_literal("\n"); + ++num_req_bufd; +} + +void +hstcpcli::request_buf_auth(const char *secret, const char *typ) +{ + if (num_req_sent > 0 || num_req_rcvd > 0) { + close(); + set_error(-1, "request_buf_auth: protocol out of sync"); + return; + } + if (typ == 0) { + typ = "1"; + } + const string_ref typ_ref(typ, strlen(typ)); + const string_ref secret_ref(secret, strlen(secret)); + writebuf.append_literal("A\t"); + writebuf.append(typ_ref.begin(), typ_ref.end()); + writebuf.append_literal("\t"); + writebuf.append(secret_ref.begin(), secret_ref.end()); + writebuf.append_literal("\n"); + ++num_req_bufd; +} + +namespace { + +void +append_delim_value(string_buffer& buf, const char *start, const char *finish) +{ + if (start == 0) { + /* null */ + const char t[] = "\t\0"; + buf.append(t, t + 2); + } else { + /* non-null */ + buf.append_literal("\t"); + escape_string(buf, start, finish); + } +} + +}; + +void +hstcpcli::request_buf_exec_generic(size_t pst_id, const string_ref& op, + const string_ref *kvs, size_t kvslen, uint32_t limit, uint32_t skip, + const string_ref& mod_op, const string_ref *mvs, size_t mvslen, + const hstcpcli_filter *fils, size_t filslen, int invalues_keypart, + const string_ref *invalues, size_t invalueslen) +{ + if (num_req_sent > 0 || num_req_rcvd > 0) { + close(); + set_error(-1, "request_buf_exec_generic: protocol out of sync"); + return; + } + append_uint32(writebuf, pst_id); // FIXME size_t ? + writebuf.append_literal("\t"); + writebuf.append(op.begin(), op.end()); + writebuf.append_literal("\t"); + append_uint32(writebuf, kvslen); // FIXME size_t ? + for (size_t i = 0; i < kvslen; ++i) { + const string_ref& kv = kvs[i]; + append_delim_value(writebuf, kv.begin(), kv.end()); + } + if (limit != 0 || skip != 0 || invalues_keypart >= 0 || + mod_op.size() != 0 || filslen != 0) { + /* has more option */ + writebuf.append_literal("\t"); + append_uint32(writebuf, limit); // FIXME size_t ? + if (skip != 0 || invalues_keypart >= 0 || + mod_op.size() != 0 || filslen != 0) { + writebuf.append_literal("\t"); + append_uint32(writebuf, skip); // FIXME size_t ? + } + if (invalues_keypart >= 0) { + writebuf.append_literal("\t@\t"); + append_uint32(writebuf, invalues_keypart); + writebuf.append_literal("\t"); + append_uint32(writebuf, invalueslen); + for (size_t i = 0; i < invalueslen; ++i) { + const string_ref& s = invalues[i]; + append_delim_value(writebuf, s.begin(), s.end()); + } + } + for (size_t i = 0; i < filslen; ++i) { + const hstcpcli_filter& f = fils[i]; + writebuf.append_literal("\t"); + writebuf.append(f.filter_type.begin(), f.filter_type.end()); + writebuf.append_literal("\t"); + writebuf.append(f.op.begin(), f.op.end()); + writebuf.append_literal("\t"); + append_uint32(writebuf, f.ff_offset); + append_delim_value(writebuf, f.val.begin(), f.val.end()); + } + if (mod_op.size() != 0) { + writebuf.append_literal("\t"); + writebuf.append(mod_op.begin(), mod_op.end()); + for (size_t i = 0; i < mvslen; ++i) { + const string_ref& mv = mvs[i]; + append_delim_value(writebuf, mv.begin(), mv.end()); + } + } + } + writebuf.append_literal("\n"); + ++num_req_bufd; +} + +int +hstcpcli::request_send() +{ + if (error_code < 0) { + return error_code; + } + clear_error(); + if (fd.get() < 0) { + close(); + return set_error(-1, "write: closed"); + } + if (num_req_bufd == 0 || num_req_sent > 0 || num_req_rcvd > 0) { + close(); + return set_error(-1, "request_send: protocol out of sync"); + } + const size_t wrlen = writebuf.size(); + const ssize_t r = send(fd.get(), writebuf.begin(), wrlen, MSG_NOSIGNAL); + if (r <= 0) { + close(); + return set_error(-1, r < 0 ? "write: failed" : "write: eof"); + } + writebuf.erase_front(r); + if (static_cast<size_t>(r) != wrlen) { + close(); + return set_error(-1, "write: incomplete"); + } + num_req_sent = num_req_bufd; + num_req_bufd = 0; + DBG(fprintf(stderr, "REQSEND 0\n")); + return 0; +} + +int +hstcpcli::response_recv(size_t& num_flds_r) +{ + if (error_code < 0) { + return error_code; + } + clear_error(); + if (num_req_bufd > 0 || num_req_sent == 0 || num_req_rcvd > 0 || + response_end_offset != 0) { + close(); + return set_error(-1, "response_recv: protocol out of sync"); + } + cur_row_offset = 0; + num_flds_r = num_flds = 0; + if (fd.get() < 0) { + return set_error(-1, "read: closed"); + } + size_t offset = 0; + while (true) { + const char *const lbegin = readbuf.begin() + offset; + const char *const lend = readbuf.end(); + const char *const nl = memchr_char(lbegin, '\n', lend - lbegin); + if (nl != 0) { + offset = (nl + 1) - readbuf.begin(); + break; + } + if (read_more() <= 0) { + close(); + return set_error(-1, "read: eof"); + } + } + response_end_offset = offset; + --num_req_sent; + ++num_req_rcvd; + char *start = readbuf.begin(); + char *const finish = start + response_end_offset - 1; + const size_t resp_code = read_ui32(start, finish); + skip_one(start, finish); + num_flds_r = num_flds = read_ui32(start, finish); + if (resp_code != 0) { + skip_one(start, finish); + char *const err_begin = start; + read_token(start, finish); + char *const err_end = start; + std::string e = std::string(err_begin, err_end - err_begin); + if (e.empty()) { + e = "unknown_error"; + } + return set_error(resp_code, e); + } + cur_row_offset = start - readbuf.begin(); + DBG(fprintf(stderr, "[%s] ro=%zu eol=%zu\n", + std::string(readbuf.begin(), readbuf.begin() + response_end_offset) + .c_str(), + cur_row_offset, response_end_offset)); + DBG(fprintf(stderr, "RES 0\n")); + return 0; +} + +const string_ref * +hstcpcli::get_next_row() +{ + if (num_flds == 0) { + DBG(fprintf(stderr, "GNR NF 0\n")); + return 0; + } + if (flds.size() < num_flds) { + flds.resize(num_flds); + } + char *start = readbuf.begin() + cur_row_offset; + char *const finish = readbuf.begin() + response_end_offset - 1; + if (start >= finish) { /* start[0] == nl */ + DBG(fprintf(stderr, "GNR FIN 0 %p %p\n", start, finish)); + return 0; + } + for (size_t i = 0; i < num_flds; ++i) { + skip_one(start, finish); + char *const fld_begin = start; + read_token(start, finish); + char *const fld_end = start; + char *wp = fld_begin; + if (is_null_expression(fld_begin, fld_end)) { + /* null */ + flds[i] = string_ref(); + } else { + unescape_string(wp, fld_begin, fld_end); /* in-place */ + flds[i] = string_ref(fld_begin, wp); + } + } + cur_row_offset = start - readbuf.begin(); + return &flds[0]; +} + +void +hstcpcli::response_buf_remove() +{ + if (response_end_offset == 0) { + close(); + set_error(-1, "response_buf_remove: protocol out of sync"); + return; + } + readbuf.erase_front(response_end_offset); + response_end_offset = 0; + --num_req_rcvd; + cur_row_offset = 0; + num_flds = 0; + flds.clear(); +} + +hstcpcli_ptr +hstcpcli_i::create(const socket_args& args) +{ + return hstcpcli_ptr(new hstcpcli(args)); +} + +}; + diff --git a/plugin/handler_socket/libhsclient/hstcpcli.hpp b/plugin/handler_socket/libhsclient/hstcpcli.hpp new file mode 100644 index 00000000..11dec8eb --- /dev/null +++ b/plugin/handler_socket/libhsclient/hstcpcli.hpp @@ -0,0 +1,62 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_HSTCPCLI_HPP +#define DENA_HSTCPCLI_HPP + +#include <sys/types.h> +#include <sys/socket.h> +#include <string> +#include <memory> + +#include "config.hpp" +#include "socket.hpp" +#include "string_ref.hpp" +#include "string_buffer.hpp" + +namespace dena { + +struct hstcpcli_filter { + string_ref filter_type; + string_ref op; + size_t ff_offset; + string_ref val; + hstcpcli_filter() : ff_offset(0) { } +}; + +struct hstcpcli_i; +typedef std::auto_ptr<hstcpcli_i> hstcpcli_ptr; + +struct hstcpcli_i { + virtual ~hstcpcli_i() { } + virtual void close() = 0; + virtual int reconnect() = 0; + virtual bool stable_point() = 0; + virtual void request_buf_auth(const char *secret, const char *typ) = 0; + virtual void request_buf_open_index(size_t pst_id, const char *dbn, + const char *tbl, const char *idx, const char *retflds, + const char *filflds = 0) = 0; + virtual void request_buf_exec_generic(size_t pst_id, const string_ref& op, + const string_ref *kvs, size_t kvslen, uint32_t limit, uint32_t skip, + const string_ref& mod_op, const string_ref *mvs, size_t mvslen, + const hstcpcli_filter *fils = 0, size_t filslen = 0, + int invalues_keypart = -1, const string_ref *invalues = 0, + size_t invalueslen = 0) = 0; // FIXME: too long + virtual int request_send() = 0; + virtual int response_recv(size_t& num_flds_r) = 0; + virtual const string_ref *get_next_row() = 0; + virtual void response_buf_remove() = 0; + virtual int get_error_code() = 0; + virtual std::string get_error() = 0; + static hstcpcli_ptr create(const socket_args& args); +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/libhsclient.spec.template b/plugin/handler_socket/libhsclient/libhsclient.spec.template new file mode 100644 index 00000000..3e4dfe04 --- /dev/null +++ b/plugin/handler_socket/libhsclient/libhsclient.spec.template @@ -0,0 +1,39 @@ +Summary: handlersocket client library +Name: libhsclient +Version: HANDLERSOCKET_VERSION +Release: 1%{?dist} +Group: System Environment/Libraries +License: BSD +Source: libhsclient.tar.gz +Packager: Akira Higuchi <higuchi dot akira at dena dot jp> +BuildRoot: /var/tmp/%{name}-%{version}-root + +%description + +%prep +%setup -n %{name} + +%define _use_internal_dependency_generator 0 + +%build +make -f Makefile.plain + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/include/handlersocket +mkdir -p $RPM_BUILD_ROOT/%{_bindir} +mkdir -p $RPM_BUILD_ROOT/%{_libdir} +install -m 755 libhsclient.a $RPM_BUILD_ROOT/%{_libdir} +install -m 644 *.hpp $RPM_BUILD_ROOT/usr/include/handlersocket/ + +%post +/sbin/ldconfig + +%postun +/sbin/ldconfig + +%files +%defattr(-, root, root) +/usr/include/* +%{_libdir}/*.a + diff --git a/plugin/handler_socket/libhsclient/mutex.hpp b/plugin/handler_socket/libhsclient/mutex.hpp new file mode 100644 index 00000000..9cef2757 --- /dev/null +++ b/plugin/handler_socket/libhsclient/mutex.hpp @@ -0,0 +1,51 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_MUTEX_HPP +#define DENA_MUTEX_HPP + +#include <pthread.h> +#include <stdlib.h> + +#include "fatal.hpp" +#include "util.hpp" + +namespace dena { + +struct condition; + +struct mutex : private noncopyable { + friend struct condition; + mutex() { + if (pthread_mutex_init(&mtx, 0) != 0) { + fatal_abort("pthread_mutex_init"); + } + } + ~mutex() { + if (pthread_mutex_destroy(&mtx) != 0) { + fatal_abort("pthread_mutex_destroy"); + } + } + void lock() const { + if (pthread_mutex_lock(&mtx) != 0) { + fatal_abort("pthread_mutex_lock"); + } + } + void unlock() const { + if (pthread_mutex_unlock(&mtx) != 0) { + fatal_abort("pthread_mutex_unlock"); + } + } + private: + mutable pthread_mutex_t mtx; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/socket.cpp b/plugin/handler_socket/libhsclient/socket.cpp new file mode 100644 index 00000000..f1cdc9fb --- /dev/null +++ b/plugin/handler_socket/libhsclient/socket.cpp @@ -0,0 +1,185 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <my_global.h> + +#include <stdexcept> +#include <string.h> +#include <signal.h> +#include <sys/un.h> + +#include "socket.hpp" +#include "string_util.hpp" +#include "fatal.hpp" + +namespace dena { + +void +ignore_sigpipe() +{ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { + fatal_abort("SIGPIPE SIG_IGN"); + } +} + +void +socket_args::set(const config& conf) +{ + timeout = conf.get_int("timeout", 600); + listen_backlog = conf.get_int("listen_backlog", 256); + std::string node = conf.get_str("host", ""); + std::string port = conf.get_str("port", ""); + if (!node.empty() || !port.empty()) { + if (family == AF_UNIX || node == "/") { + set_unix_domain(port.c_str()); + } else { + const char *nd = node.empty() ? 0 : node.c_str(); + if (resolve(nd, port.c_str()) != 0) { + fatal_abort("getaddrinfo failed: " + node + ":" + port); + } + } + } + sndbuf = conf.get_int("sndbuf", 0); + rcvbuf = conf.get_int("rcvbuf", 0); +} + +void +socket_args::set_unix_domain(const char *path) +{ + family = AF_UNIX; + addr = sockaddr_storage(); + addrlen = sizeof(sockaddr_un); + sockaddr_un *const ap = reinterpret_cast<sockaddr_un *>(&addr); + ap->sun_family = AF_UNIX; + strncpy(ap->sun_path, path, sizeof(ap->sun_path) - 1); +} + +int +socket_args::resolve(const char *node, const char *service) +{ + const int flags = (node == 0) ? AI_PASSIVE : 0; + auto_addrinfo ai; + addr = sockaddr_storage(); + addrlen = 0; + const int r = ai.resolve(node, service, flags, family, socktype, protocol); + if (r != 0) { + return r; + } + memcpy(&addr, ai.get()->ai_addr, ai.get()->ai_addrlen); + addrlen = ai.get()->ai_addrlen; + return 0; +} + +int +socket_set_options(auto_file& fd, const socket_args& args, std::string& err_r) +{ + if (args.timeout != 0 && !args.nonblocking) { + struct timeval tv; + tv.tv_sec = args.timeout; + tv.tv_usec = 0; + if (setsockopt(fd.get(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) != 0) { + return errno_string("setsockopt SO_RCVTIMEO", errno, err_r); + } + tv.tv_sec = args.timeout; + tv.tv_usec = 0; + if (setsockopt(fd.get(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) != 0) { + return errno_string("setsockopt SO_RCVTIMEO", errno, err_r); + } + } + if (args.nonblocking && fcntl(fd.get(), F_SETFL, O_NONBLOCK) != 0) { + return errno_string("fcntl O_NONBLOCK", errno, err_r); + } + if (args.sndbuf != 0) { + const int v = args.sndbuf; + if (setsockopt(fd.get(), SOL_SOCKET, SO_SNDBUF, &v, sizeof(v)) != 0) { + return errno_string("setsockopt SO_SNDBUF", errno, err_r); + } + } + if (args.rcvbuf != 0) { + const int v = args.rcvbuf; + if (setsockopt(fd.get(), SOL_SOCKET, SO_RCVBUF, &v, sizeof(v)) != 0) { + return errno_string("setsockopt SO_RCVBUF", errno, err_r); + } + } + return 0; +} + +int +socket_open(auto_file& fd, const socket_args& args, std::string& err_r) +{ + fd.reset(socket(args.family, args.socktype, args.protocol)); + if (fd.get() < 0) { + return errno_string("socket", errno, err_r); + } + return socket_set_options(fd, args, err_r); +} + +int +socket_connect(auto_file& fd, const socket_args& args, std::string& err_r) +{ + int r = 0; + if ((r = socket_open(fd, args, err_r)) != 0) { + return r; + } + if (connect(fd.get(), reinterpret_cast<const sockaddr *>(&args.addr), + args.addrlen) != 0) { + if (!args.nonblocking || errno != EINPROGRESS) { + return errno_string("connect", errno, err_r); + } + } + return 0; +} + +int +socket_bind(auto_file& fd, const socket_args& args, std::string& err_r) +{ + fd.reset(socket(args.family, args.socktype, args.protocol)); + if (fd.get() < 0) { + return errno_string("socket", errno, err_r); + } + if (args.reuseaddr) { + if (args.family == AF_UNIX) { + const sockaddr_un *const ap = + reinterpret_cast<const sockaddr_un *>(&args.addr); + if (unlink(ap->sun_path) != 0 && errno != ENOENT) { + return errno_string("unlink uds", errno, err_r); + } + } else { + int v = 1; + if (setsockopt(fd.get(), SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v)) != 0) { + return errno_string("setsockopt SO_REUSEADDR", errno, err_r); + } + } + } + if (bind(fd.get(), reinterpret_cast<const sockaddr *>(&args.addr), + args.addrlen) != 0) { + return errno_string("bind", errno, err_r); + } + if (listen(fd.get(), args.listen_backlog) != 0) { + return errno_string("listen", errno, err_r); + } + if (args.nonblocking && fcntl(fd.get(), F_SETFL, O_NONBLOCK) != 0) { + return errno_string("fcntl O_NONBLOCK", errno, err_r); + } + return 0; +} + +int +socket_accept(int listen_fd, auto_file& fd, const socket_args& args, + sockaddr_storage& addr_r, size_socket& addrlen_r, std::string& err_r) +{ + fd.reset(accept(listen_fd, reinterpret_cast<sockaddr *>(&addr_r), + &addrlen_r)); + if (fd.get() < 0) { + return errno_string("accept", errno, err_r); + } + return socket_set_options(fd, args, err_r); +} + +}; + diff --git a/plugin/handler_socket/libhsclient/socket.hpp b/plugin/handler_socket/libhsclient/socket.hpp new file mode 100644 index 00000000..c6e638c9 --- /dev/null +++ b/plugin/handler_socket/libhsclient/socket.hpp @@ -0,0 +1,51 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_SOCKET_HPP +#define DENA_SOCKET_HPP + +#include <string> + +#include "auto_addrinfo.hpp" +#include "auto_file.hpp" +#include "config.hpp" + +namespace dena { + +struct socket_args { + sockaddr_storage addr; + size_socket addrlen; + int family; + int socktype; + int protocol; + int timeout; + int listen_backlog; + bool reuseaddr; + bool nonblocking; + bool use_epoll; + int sndbuf; + int rcvbuf; + socket_args() : addr(), addrlen(0), family(AF_INET), socktype(SOCK_STREAM), + protocol(0), timeout(600), listen_backlog(256), + reuseaddr(true), nonblocking(false), use_epoll(false), + sndbuf(0), rcvbuf(0) { } + void set(const config& conf); + void set_unix_domain(const char *path); + int resolve(const char *node, const char *service); +}; + +void ignore_sigpipe(); +int socket_bind(auto_file& fd, const socket_args& args, std::string& err_r); +int socket_connect(auto_file& fd, const socket_args& args, std::string& err_r); +int socket_accept(int listen_fd, auto_file& fd, const socket_args& args, + sockaddr_storage& addr_r, size_socket& addrlen_r, std::string& err_r); + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/string_buffer.hpp b/plugin/handler_socket/libhsclient/string_buffer.hpp new file mode 100644 index 00000000..708c0df3 --- /dev/null +++ b/plugin/handler_socket/libhsclient/string_buffer.hpp @@ -0,0 +1,118 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_STRING_BUFFER_HPP +#define DENA_STRING_BUFFER_HPP + +#include <vector> +#include <stdlib.h> +#include <string.h> + +#include "util.hpp" +#include "allocator.hpp" +#include "fatal.hpp" + +namespace dena { + +struct string_buffer : private noncopyable { + string_buffer() : buffer(0), begin_offset(0), end_offset(0), alloc_size(0) { } + ~string_buffer() { + DENA_FREE(buffer); + } + const char *begin() const { + return buffer + begin_offset; + } + const char *end() const { + return buffer + end_offset; + } + char *begin() { + return buffer + begin_offset; + } + char *end() { + return buffer + end_offset; + } + size_t size() const { + return end_offset - begin_offset; + } + void clear() { + begin_offset = end_offset = 0; + } + void resize(size_t len) { + if (size() < len) { + reserve(len); + memset(buffer + end_offset, 0, len - size()); + } + end_offset = begin_offset + len; + } + void reserve(size_t len) { + if (alloc_size >= begin_offset + len) { + return; + } + size_t asz = alloc_size; + while (asz < begin_offset + len) { + if (asz == 0) { + asz = 16; + } + const size_t asz_n = asz << 1; + if (asz_n < asz) { + fatal_abort("string_buffer::resize() overflow"); + } + asz = asz_n; + } + void *const p = DENA_REALLOC(buffer, asz); + if (p == 0) { + fatal_abort("string_buffer::resize() realloc"); + } + buffer = static_cast<char *>(p); + alloc_size = asz; + } + void erase_front(size_t len) { + if (len >= size()) { + clear(); + } else { + begin_offset += len; + } + } + char *make_space(size_t len) { + reserve(size() + len); + return buffer + end_offset; + } + void space_wrote(size_t len) { + len = std::min(len, alloc_size - end_offset); + end_offset += len; + } + template <size_t N> + void append_literal(const char (& str)[N]) { + append(str, str + N - 1); + } + void append(const char *start, const char *finish) { + const size_t len = finish - start; + reserve(size() + len); + memcpy(buffer + end_offset, start, len); + end_offset += len; + } + void append_2(const char *s1, const char *f1, const char *s2, + const char *f2) { + const size_t l1 = f1 - s1; + const size_t l2 = f2 - s2; + reserve(end_offset + l1 + l2); + memcpy(buffer + end_offset, s1, l1); + memcpy(buffer + end_offset + l1, s2, l2); + end_offset += l1 + l2; + } + private: + char *buffer; + size_t begin_offset; + size_t end_offset; + size_t alloc_size; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/string_ref.hpp b/plugin/handler_socket/libhsclient/string_ref.hpp new file mode 100644 index 00000000..c5f93065 --- /dev/null +++ b/plugin/handler_socket/libhsclient/string_ref.hpp @@ -0,0 +1,63 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_STRING_REF_HPP +#define DENA_STRING_REF_HPP + +#include <vector> +#include <string.h> + +namespace dena { + +struct string_wref { + typedef char value_type; + char *begin() const { return start; } + char *end() const { return start + length; } + size_t size() const { return length; } + private: + char *start; + size_t length; + public: + string_wref(char *s = 0, size_t len = 0) : start(s), length(len) { } +}; + +struct string_ref { + typedef const char value_type; + const char *begin() const { return start; } + const char *end() const { return start + length; } + size_t size() const { return length; } + private: + const char *start; + size_t length; + public: + string_ref(const char *s = 0, size_t len = 0) : start(s), length(len) { } + string_ref(const char *s, const char *f) : start(s), length(f - s) { } + string_ref(const string_wref& w) : start(w.begin()), length(w.size()) { } +}; + +template <size_t N> inline bool +operator ==(const string_ref& x, const char (& y)[N]) { + return (x.size() == N - 1) && (::memcmp(x.begin(), y, N - 1) == 0); +} + +inline bool +operator ==(const string_ref& x, const string_ref& y) { + return (x.size() == y.size()) && + (::memcmp(x.begin(), y.begin(), x.size()) == 0); +} + +inline bool +operator !=(const string_ref& x, const string_ref& y) { + return (x.size() != y.size()) || + (::memcmp(x.begin(), y.begin(), x.size()) != 0); +} + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/string_util.cpp b/plugin/handler_socket/libhsclient/string_util.cpp new file mode 100644 index 00000000..8ee6000f --- /dev/null +++ b/plugin/handler_socket/libhsclient/string_util.cpp @@ -0,0 +1,182 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#include <errno.h> +#include <stdio.h> + +#include "string_util.hpp" + +namespace dena { + +string_wref +get_token(char *& wp, char *wp_end, char delim) +{ + char *const wp_begin = wp; + char *const p = memchr_char(wp_begin, delim, wp_end - wp_begin); + if (p == 0) { + wp = wp_end; + return string_wref(wp_begin, wp_end - wp_begin); + } + wp = p + 1; + return string_wref(wp_begin, p - wp_begin); +} + +template <typename T> T +atoi_tmpl_nocheck(const char *start, const char *finish) +{ + T v = 0; + for (; start != finish; ++start) { + const char c = *start; + if (c < '0' || c > '9') { + break; + } + v *= 10; + v += static_cast<T>(c - '0'); + } + return v; +} + +template <typename T> T +atoi_signed_tmpl_nocheck(const char *start, const char *finish) +{ + T v = 0; + bool negative = false; + if (start != finish) { + if (start[0] == '-') { + ++start; + negative = true; + } else if (start[0] == '+') { + ++start; + } + } + for (; start != finish; ++start) { + const char c = *start; + if (c < '0' || c > '9') { + break; + } + v *= 10; + if (negative) { + v -= static_cast<T>(c - '0'); + } else { + v += static_cast<T>(c - '0'); + } + } + return v; +} + +uint32_t +atoi_uint32_nocheck(const char *start, const char *finish) +{ + return atoi_tmpl_nocheck<uint32_t>(start, finish); +} + +long long +atoll_nocheck(const char *start, const char *finish) +{ + return atoi_signed_tmpl_nocheck<long long>(start, finish); +} + +void +append_uint32(string_buffer& buf, uint32_t v) +{ + char *const wp = buf.make_space(64); + const int len = snprintf(wp, 64, "%lu", static_cast<unsigned long>(v)); + if (len > 0) { + buf.space_wrote(len); + } +} + +std::string +to_stdstring(uint32_t v) +{ + char buf[64]; + snprintf(buf, sizeof(buf), "%lu", static_cast<unsigned long>(v)); + return std::string(buf); +} + +int +errno_string(const char *s, int en, std::string& err_r) +{ + char buf[64]; + snprintf(buf, sizeof(buf), "%s: %d", s, en); + err_r = std::string(buf); + return en; +} + +template <typename T> size_t +split_tmpl_arr(char delim, const T& buf, T *parts, size_t parts_len) +{ + typedef typename T::value_type value_type; + size_t i = 0; + value_type *start = buf.begin(); + value_type *const finish = buf.end(); + for (i = 0; i < parts_len; ++i) { + value_type *const p = memchr_char(start, delim, finish - start); + if (p == 0) { + parts[i] = T(start, finish - start); + ++i; + break; + } + parts[i] = T(start, p - start); + start = p + 1; + } + const size_t r = i; + for (; i < parts_len; ++i) { + parts[i] = T(); + } + return r; +} + +size_t +split(char delim, const string_ref& buf, string_ref *parts, + size_t parts_len) +{ + return split_tmpl_arr(delim, buf, parts, parts_len); +} + +size_t +split(char delim, const string_wref& buf, string_wref *parts, + size_t parts_len) +{ + return split_tmpl_arr(delim, buf, parts, parts_len); +} + +template <typename T, typename V> size_t +split_tmpl_vec(char delim, const T& buf, V& parts) +{ + typedef typename T::value_type value_type; + size_t i = 0; + value_type *start = buf.begin(); + value_type *const finish = buf.end(); + while (true) { + value_type *const p = memchr_char(start, delim, finish - start); + if (p == 0) { + parts.push_back(T(start, finish - start)); + break; + } + parts.push_back(T(start, p - start)); + start = p + 1; + } + const size_t r = i; + return r; +} + +size_t +split(char delim, const string_ref& buf, std::vector<string_ref>& parts_r) +{ + return split_tmpl_vec(delim, buf, parts_r); +} + +size_t +split(char delim, const string_wref& buf, std::vector<string_wref>& parts_r) +{ + return split_tmpl_vec(delim, buf, parts_r); +} + +}; + diff --git a/plugin/handler_socket/libhsclient/string_util.hpp b/plugin/handler_socket/libhsclient/string_util.hpp new file mode 100644 index 00000000..45cc5b00 --- /dev/null +++ b/plugin/handler_socket/libhsclient/string_util.hpp @@ -0,0 +1,53 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_STRING_UTIL_HPP +#define DENA_STRING_UTIL_HPP + +#include <string> +#include <string.h> +#include <stdint.h> + +#include "string_buffer.hpp" +#include "string_ref.hpp" + +namespace dena { + +inline const char * +memchr_char(const char *s, int c, size_t n) +{ + return static_cast<const char *>(memchr(s, c, n)); +} + +inline char * +memchr_char(char *s, int c, size_t n) +{ + return static_cast<char *>(memchr(s, c, n)); +} + +string_wref get_token(char *& wp, char *wp_end, char delim); +uint32_t atoi_uint32_nocheck(const char *start, const char *finish); +std::string to_stdstring(uint32_t v); +void append_uint32(string_buffer& buf, uint32_t v); +long long atoll_nocheck(const char *start, const char *finish); + +int errno_string(const char *s, int en, std::string& err_r); + +size_t split(char delim, const string_ref& buf, string_ref *parts, + size_t parts_len); +size_t split(char delim, const string_wref& buf, string_wref *parts, + size_t parts_len); +size_t split(char delim, const string_ref& buf, + std::vector<string_ref>& parts_r); +size_t split(char delim, const string_wref& buf, + std::vector<string_wref>& parts_r); + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/thread.hpp b/plugin/handler_socket/libhsclient/thread.hpp new file mode 100644 index 00000000..8a436554 --- /dev/null +++ b/plugin/handler_socket/libhsclient/thread.hpp @@ -0,0 +1,84 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_THREAD_HPP +#define DENA_THREAD_HPP + +#include <stdexcept> +#include <pthread.h> + +#include "fatal.hpp" + +namespace dena { + +template <typename T> +struct thread : private noncopyable { + template <typename Ta> thread(const Ta& arg, size_t stack_sz = 256 * 1024) + : obj(arg), thr(0), need_join(false), stack_size(stack_sz) { } + template <typename Ta0, typename Ta1> thread(const Ta0& a0, + volatile Ta1& a1, size_t stack_sz = 256 * 1024) + : obj(a0, a1), thr(0), need_join(false), stack_size(stack_sz) { } + ~thread() { + join(); + } + void start() { + if (!start_nothrow()) { + fatal_abort("thread::start"); + } + } + bool start_nothrow() { + if (need_join) { + return need_join; /* true */ + } + void *const arg = this; + pthread_attr_t attr; + if (pthread_attr_init(&attr) != 0) { + fatal_abort("pthread_attr_init"); + } + if (pthread_attr_setstacksize(&attr, stack_size) != 0) { + fatal_abort("pthread_attr_setstacksize"); + } + const int r = pthread_create(&thr, &attr, thread_main, arg); + if (pthread_attr_destroy(&attr) != 0) { + fatal_abort("pthread_attr_destroy"); + } + if (r != 0) { + return need_join; /* false */ + } + need_join = true; + return need_join; /* true */ + } + void join() { + if (!need_join) { + return; + } + int e = 0; + if ((e = pthread_join(thr, 0)) != 0) { + fatal_abort("pthread_join"); + } + need_join = false; + } + T& operator *() { return obj; } + T *operator ->() { return &obj; } + private: + static void *thread_main(void *arg) { + thread *p = static_cast<thread *>(arg); + p->obj(); + return 0; + } + private: + T obj; + pthread_t thr; + bool need_join; + size_t stack_size; +}; + +}; + +#endif + diff --git a/plugin/handler_socket/libhsclient/util.hpp b/plugin/handler_socket/libhsclient/util.hpp new file mode 100644 index 00000000..93d78cc7 --- /dev/null +++ b/plugin/handler_socket/libhsclient/util.hpp @@ -0,0 +1,25 @@ + +// vim:sw=2:ai + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#ifndef DENA_UTIL_HPP +#define DENA_UTIL_HPP + +namespace dena { + +/* boost::noncopyable */ +struct noncopyable { + noncopyable() { } + private: + noncopyable(const noncopyable&); + noncopyable& operator =(const noncopyable&); +}; + +}; + +#endif + diff --git a/plugin/handler_socket/misc/microbench-hs.log b/plugin/handler_socket/misc/microbench-hs.log new file mode 100644 index 00000000..9fffe12e --- /dev/null +++ b/plugin/handler_socket/misc/microbench-hs.log @@ -0,0 +1,130 @@ +[a@c54hdd libhsclient]$ ./hstest_hs.sh host=192.168.100.104 key_mask=1000000 num_threads=100 num=10000000 timelimit=10 dbname=hstest +now: 1274127653 cntdiff: 265538 tdiff: 1.000996 rps: 265273.757409 +now: 1274127654 cntdiff: 265762 tdiff: 1.000995 rps: 265497.850684 +now: 1274127655 cntdiff: 265435 tdiff: 1.001010 rps: 265167.196749 +now: 1274127656 cntdiff: 265144 tdiff: 1.000994 rps: 264880.654203 +now: 1274127657 cntdiff: 265593 tdiff: 1.000995 rps: 265329.018659 +now: 1274127658 cntdiff: 264863 tdiff: 1.000996 rps: 264599.492138 +now: 1274127659 cntdiff: 265688 tdiff: 1.001008 rps: 265420.447231 +now: 1274127660 cntdiff: 265727 tdiff: 1.000999 rps: 265461.810594 +now: 1274127661 cntdiff: 265848 tdiff: 1.001010 rps: 265579.716809 +now: 1274127662 cntdiff: 265430 tdiff: 1.000992 rps: 265167.001723 +now: 1274127663 cntdiff: 266379 tdiff: 1.001008 rps: 266110.751381 +now: 1274127664 cntdiff: 266244 tdiff: 1.001003 rps: 265977.217679 +now: 1274127665 cntdiff: 265737 tdiff: 1.000996 rps: 265472.559379 +now: 1274127666 cntdiff: 265878 tdiff: 1.001003 rps: 265611.647683 +(1274127656.104648: 1328292, 1274127666.114649: 3985679), 265473.20173 qps + + +*************************** 1. row *************************** + Type: InnoDB + Name: +Status: +===================================== +100518 5:18:13 INNODB MONITOR OUTPUT +===================================== +Per second averages calculated from the last 5 seconds +---------- +BACKGROUND THREAD +---------- +srv_master_thread loops: 191 1_second, 190 sleeps, 18 10_second, 5 background, 5 flush +srv_master_thread log flush and writes: 190 +---------- +SEMAPHORES +---------- +OS WAIT ARRAY INFO: reservation count 53519, signal count 29547 +Mutex spin waits 3083488, rounds 5159906, OS waits 50700 +RW-shared spins 21, OS waits 16; RW-excl spins 1, OS waits 4 +Spin rounds per wait: 1.67 mutex, 30.00 RW-shared, 151.00 RW-excl +------------ +TRANSACTIONS +------------ +Trx id counter EDA36085 +Purge done for trx's n:o < EC1F94A7 undo n:o < 0 +History list length 20 +LIST OF TRANSACTIONS FOR EACH SESSION: +---TRANSACTION 0, not started, process no 4533, OS thread id 1079281984 +MySQL thread id 11, query id 16 localhost root +show engine innodb status +---TRANSACTION ED9D5959, not started, process no 4533, OS thread id 1089849664 +MySQL thread id 7, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION ED9D5956, not started, process no 4533, OS thread id 1238796608 +MySQL thread id 1, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION EDA36084, not started, process no 4533, OS thread id 1255582016 +mysql tables in use 1, locked 1 +MySQL thread id 3, query id 0 handlersocket: mode=rd, 12 conns, 7 active +---TRANSACTION EDA36080, not started, process no 4533, OS thread id 1247189312 +mysql tables in use 1, locked 1 +MySQL thread id 2, query id 0 handlersocket: mode=rd, 36 conns, 18 active +---TRANSACTION EDA36082, ACTIVE 0 sec, process no 4533, OS thread id 1263974720 committing +MySQL thread id 4, query id 0 handlersocket: mode=rd, 37 conns, 20 active +Trx read view will not see trx with id >= EDA36083, sees < EDA3607D +---TRANSACTION EDA3607D, ACTIVE 0 sec, process no 4533, OS thread id 1272367424, thread declared inside InnoDB 500 +mysql tables in use 1, locked 1 +MySQL thread id 5, query id 0 handlersocket: mode=rd, 15 conns, 9 active +Trx read view will not see trx with id >= EDA3607E, sees < EDA36079 +-------- +FILE I/O +-------- +I/O thread 0 state: waiting for i/o request (insert buffer thread) +I/O thread 1 state: waiting for i/o request (log thread) +I/O thread 2 state: waiting for i/o request (read thread) +I/O thread 3 state: waiting for i/o request (read thread) +I/O thread 4 state: waiting for i/o request (read thread) +I/O thread 5 state: waiting for i/o request (read thread) +I/O thread 6 state: waiting for i/o request (write thread) +I/O thread 7 state: waiting for i/o request (write thread) +I/O thread 8 state: waiting for i/o request (write thread) +I/O thread 9 state: waiting for i/o request (write thread) +Pending normal aio reads: 0, aio writes: 0, + ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 +Pending flushes (fsync) log: 0; buffer pool: 0 +71 OS file reads, 235 OS file writes, 235 OS fsyncs +0.00 reads/s, 0 avg bytes/read, 1.00 writes/s, 1.00 fsyncs/s +------------------------------------- +INSERT BUFFER AND ADAPTIVE HASH INDEX +------------------------------------- +Ibuf: size 1, free list len 0, seg size 2, +0 inserts, 0 merged recs, 0 merges +Hash table size 12750011, node heap has 2 buffer(s) +267203.76 hash searches/s, 0.00 non-hash searches/s +--- +LOG +--- +Log sequence number 147179727377 +Log flushed up to 147179726685 +Last checkpoint at 147179716475 +0 pending log writes, 0 pending chkp writes +194 log i/o's done, 1.00 log i/o's/second +---------------------- +BUFFER POOL AND MEMORY +---------------------- +Total memory allocated 6587154432; in additional pool allocated 0 +Dictionary memory allocated 33640 +Buffer pool size 393216 +Free buffers 393154 +Database pages 60 +Old database pages 0 +Modified db pages 1 +Pending reads 0 +Pending writes: LRU 0, flush list 0, single page 0 +Pages made young 0, not young 0 +0.00 youngs/s, 0.00 non-youngs/s +Pages read 60, created 0, written 23 +0.00 reads/s, 0.00 creates/s, 0.00 writes/s +Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000 +Pages read ahead 0.00/s, evicted without access 0.00/s +LRU len: 60, unzip_LRU len: 0 +I/O sum[0]:cur[0], unzip sum[0]:cur[0] +-------------- +ROW OPERATIONS +-------------- +2 queries inside InnoDB, 0 queries in queue +3 read views open inside InnoDB +Main thread process no. 4533, id 1230403904, state: sleeping +Number of rows inserted 0, updated 0, deleted 0, read 37653556 +0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 266608.28 reads/s +---------------------------- +END OF INNODB MONITOR OUTPUT +============================ + diff --git a/plugin/handler_socket/misc/microbench-my.log b/plugin/handler_socket/misc/microbench-my.log new file mode 100644 index 00000000..2477af8a --- /dev/null +++ b/plugin/handler_socket/misc/microbench-my.log @@ -0,0 +1,125 @@ + +[a@c54hdd libhsclient]$ ./hstest_my.sh host=192.168.100.104 key_mask=1000000 num_threads=100 num=10000000 timelimit=10 dbname=hstest +now: 1274128046 cntdiff: 63061 tdiff: 1.000999 rps: 62998.066579 +now: 1274128047 cntdiff: 61227 tdiff: 1.001013 rps: 61165.037337 +now: 1274128048 cntdiff: 61367 tdiff: 1.001029 rps: 61303.917375 +now: 1274128049 cntdiff: 61959 tdiff: 1.000962 rps: 61899.451554 +now: 1274128050 cntdiff: 62176 tdiff: 1.001006 rps: 62113.520756 +now: 1274128051 cntdiff: 61367 tdiff: 1.000998 rps: 61305.815559 +now: 1274128052 cntdiff: 61644 tdiff: 1.001015 rps: 61581.497988 +now: 1274128053 cntdiff: 60659 tdiff: 1.000984 rps: 60599.373036 +now: 1274128054 cntdiff: 59459 tdiff: 1.000996 rps: 59399.831067 +now: 1274128055 cntdiff: 62310 tdiff: 1.001011 rps: 62247.074757 +now: 1274128056 cntdiff: 61947 tdiff: 1.000991 rps: 61885.664744 +now: 1274128057 cntdiff: 60675 tdiff: 1.001006 rps: 60614.029076 +now: 1274128058 cntdiff: 60312 tdiff: 1.001001 rps: 60251.680861 +now: 1274128059 cntdiff: 60290 tdiff: 1.001004 rps: 60229.530717 +(1274128049.309634: 309654, 1274128059.319648: 920493), 61022.79143 qps + +*************************** 1. row *************************** + Type: InnoDB + Name: +Status: +===================================== +100518 5:24:51 INNODB MONITOR OUTPUT +===================================== +Per second averages calculated from the last 5 seconds +---------- +BACKGROUND THREAD +---------- +srv_master_thread loops: 220 1_second, 219 sleeps, 21 10_second, 6 background, 6 flush +srv_master_thread log flush and writes: 219 +---------- +SEMAPHORES +---------- +OS WAIT ARRAY INFO: reservation count 56193, signal count 30826 +Mutex spin waits 3415153, rounds 5618661, OS waits 53251 +RW-shared spins 24, OS waits 17; RW-excl spins 1, OS waits 5 +Spin rounds per wait: 1.65 mutex, 30.00 RW-shared, 181.00 RW-excl +------------ +TRANSACTIONS +------------ +Trx id counter EDB514D6 +Purge done for trx's n:o < EC1F94A7 undo n:o < 0 +History list length 20 +LIST OF TRANSACTIONS FOR EACH SESSION: +---TRANSACTION 0, not started, process no 4533, OS thread id 1306585408 +MySQL thread id 113, query id 920620 localhost root +show engine innodb status +---TRANSACTION EDA708BB, not started, process no 4533, OS thread id 1272367424 +MySQL thread id 5, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION ED9D5959, not started, process no 4533, OS thread id 1089849664 +MySQL thread id 7, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION ED9D5956, not started, process no 4533, OS thread id 1238796608 +MySQL thread id 1, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION EDA708BD, not started, process no 4533, OS thread id 1255582016 +MySQL thread id 3, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION EDA708BF, not started, process no 4533, OS thread id 1247189312 +MySQL thread id 2, query id 0 handlersocket: mode=rd, 0 conns, 0 active +---TRANSACTION EDA708BE, not started, process no 4533, OS thread id 1263974720 +MySQL thread id 4, query id 0 handlersocket: mode=rd, 0 conns, 0 active +-------- +FILE I/O +-------- +I/O thread 0 state: waiting for i/o request (insert buffer thread) +I/O thread 1 state: waiting for i/o request (log thread) +I/O thread 2 state: waiting for i/o request (read thread) +I/O thread 3 state: waiting for i/o request (read thread) +I/O thread 4 state: waiting for i/o request (read thread) +I/O thread 5 state: waiting for i/o request (read thread) +I/O thread 6 state: waiting for i/o request (write thread) +I/O thread 7 state: waiting for i/o request (write thread) +I/O thread 8 state: waiting for i/o request (write thread) +I/O thread 9 state: waiting for i/o request (write thread) +Pending normal aio reads: 0, aio writes: 0, + ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 +Pending flushes (fsync) log: 0; buffer pool: 0 +71 OS file reads, 269 OS file writes, 269 OS fsyncs +0.00 reads/s, 0 avg bytes/read, 2.40 writes/s, 2.40 fsyncs/s +------------------------------------- +INSERT BUFFER AND ADAPTIVE HASH INDEX +------------------------------------- +Ibuf: size 1, free list len 0, seg size 2, +0 inserts, 0 merged recs, 0 merges +Hash table size 12750011, node heap has 2 buffer(s) +65739.45 hash searches/s, 0.00 non-hash searches/s +--- +LOG +--- +Log sequence number 147179774153 +Log flushed up to 147179771813 +Last checkpoint at 147179761899 +0 pending log writes, 0 pending chkp writes +220 log i/o's done, 1.60 log i/o's/second +---------------------- +BUFFER POOL AND MEMORY +---------------------- +Total memory allocated 6587154432; in additional pool allocated 0 +Dictionary memory allocated 33640 +Buffer pool size 393216 +Free buffers 393154 +Database pages 60 +Old database pages 0 +Modified db pages 1 +Pending reads 0 +Pending writes: LRU 0, flush list 0, single page 0 +Pages made young 0, not young 0 +0.00 youngs/s, 0.00 non-youngs/s +Pages read 60, created 0, written 27 +0.00 reads/s, 0.00 creates/s, 0.40 writes/s +Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000 +Pages read ahead 0.00/s, evicted without access 0.00/s +LRU len: 60, unzip_LRU len: 0 +I/O sum[0]:cur[0], unzip sum[0]:cur[0] +-------------- +ROW OPERATIONS +-------------- +0 queries inside InnoDB, 0 queries in queue +1 read views open inside InnoDB +Main thread process no. 4533, id 1230403904, state: sleeping +Number of rows inserted 0, updated 0, deleted 0, read 40071920 +0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 66321.54 reads/s +---------------------------- +END OF INNODB MONITOR OUTPUT +============================ + diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/COPYRIGHT.txt b/plugin/handler_socket/perl-Net-HandlerSocket/COPYRIGHT.txt new file mode 100644 index 00000000..41dda127 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/COPYRIGHT.txt @@ -0,0 +1,27 @@ + + Copyright (c) 2010 DeNA Co.,Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of DeNA Co.,Ltd. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY DeNA Co.,Ltd. "AS IS" AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + EVENT SHALL DeNA Co.,Ltd. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/Changes b/plugin/handler_socket/perl-Net-HandlerSocket/Changes new file mode 100644 index 00000000..7ed1e019 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/Changes @@ -0,0 +1,6 @@ +Revision history for Perl extension HandlerSocket. + +0.01 Wed Mar 31 11:50:23 2010 + - original version; created by h2xs 1.23 with options + -A -n HandlerSocket + diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/HandlerSocket.xs b/plugin/handler_socket/perl-Net-HandlerSocket/HandlerSocket.xs new file mode 100644 index 00000000..8169b3e5 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/HandlerSocket.xs @@ -0,0 +1,634 @@ + +// vim:ai:sw=2:ts=8 + +/* + * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + * See COPYRIGHT.txt for details. + */ + +#undef VERSION +#include <config.h> + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include "ppport.h" +#include "hstcpcli.hpp" + +#define DBG(x) + +static SV * +arr_get_entry(AV *av, I32 avmax, I32 idx) +{ + if (idx > avmax) { + DBG(fprintf(stderr, "arr_get_entry1 %d %d\n", avmax, idx)); + return 0; + } + SV **const ev = av_fetch(av, idx, 0); + if (ev == 0) { + DBG(fprintf(stderr, "arr_get_entry2 %d %d\n", avmax, idx)); + return 0; + } + return *ev; +} + +static int +arr_get_intval(AV *av, I32 avmax, I32 idx, int default_val = 0) +{ + SV *const e = arr_get_entry(av, avmax, idx); + if (e == 0) { + return default_val; + } + return SvIV(e); +} + +static const char * +sv_get_strval(SV *sv) +{ + if (sv == 0 || !SvPOK(sv)) { + DBG(fprintf(stderr, "sv_get_strval\n")); + return 0; + } + return SvPV_nolen(sv); +} + +static const char * +arr_get_strval(AV *av, I32 avmax, I32 idx) +{ + SV *const e = arr_get_entry(av, avmax, idx); + return sv_get_strval(e); +} + +static AV * +sv_get_arrval(SV *sv) +{ + if (sv == 0 || !SvROK(sv)) { + DBG(fprintf(stderr, "sv_get_arrval1\n")); + return 0; + } + SV *const svtarget = SvRV(sv); + if (svtarget == 0 || SvTYPE(svtarget) != SVt_PVAV) { + DBG(fprintf(stderr, "sv_get_arrval2\n")); + return 0; + } + return (AV *)svtarget; +} + +static AV * +arr_get_arrval(AV *av, I32 avmax, I32 idx) +{ + SV *const e = arr_get_entry(av, avmax, idx); + if (e == 0) { + DBG(fprintf(stderr, "arr_get_arrval1\n")); + return 0; + } + return sv_get_arrval(e); +} + +static void +hv_to_strmap(HV *hv, std::map<std::string, std::string>& m_r) +{ + if (hv == 0) { + return; + } + hv_iterinit(hv); + HE *hent = 0; + while ((hent = hv_iternext(hv)) != 0) { + I32 klen = 0; + char *const k = hv_iterkey(hent, &klen); + DBG(fprintf(stderr, "k=%s\n", k)); + const std::string key(k, klen); + SV *const vsv = hv_iterval(hv, hent); + STRLEN vlen = 0; + char *const v = SvPV(vsv, vlen); + DBG(fprintf(stderr, "v=%s\n", v)); + const std::string val(v, vlen); + m_r[key] = val; + } +} + +static void +strrefarr_push_back(std::vector<dena::string_ref>& a_r, SV *sv) +{ + if (sv == 0 || SvTYPE(sv) == SVt_NULL) { /* !SvPOK()? */ + DBG(fprintf(stderr, "strrefarr_push_back: null\n")); + return a_r.push_back(dena::string_ref()); + } + STRLEN vlen = 0; + char *const v = SvPV(sv, vlen); + DBG(fprintf(stderr, "strrefarr_push_back: %s\n", v)); + a_r.push_back(dena::string_ref(v, vlen)); +} + +static void +av_to_strrefarr(AV *av, std::vector<dena::string_ref>& a_r) +{ + if (av == 0) { + return; + } + const I32 len = av_len(av) + 1; + for (I32 i = 0; i < len; ++i) { + SV **const ev = av_fetch(av, i, 0); + strrefarr_push_back(a_r, ev ? *ev : 0); + } +} + +static dena::string_ref +sv_get_string_ref(SV *sv) +{ + if (sv == 0 || SvTYPE(sv) == SVt_NULL) { /* !SvPOK()? */ + return dena::string_ref(); + } + STRLEN vlen = 0; + char *const v = SvPV(sv, vlen); + return dena::string_ref(v, vlen); +} + +static IV +sv_get_iv(SV *sv) +{ + if (sv == 0 || ( !SvIOK(sv) && !SvPOK(sv) ) ) { + return 0; + } + return SvIV(sv); +} + +static void +av_to_filters(AV *av, std::vector<dena::hstcpcli_filter>& f_r) +{ + DBG(fprintf(stderr, "av_to_filters: %p\n", av)); + if (av == 0) { + return; + } + const I32 len = av_len(av) + 1; + DBG(fprintf(stderr, "av_to_filters: len=%d\n", (int)len)); + for (I32 i = 0; i < len; ++i) { + AV *const earr = arr_get_arrval(av, len, i); + if (earr == 0) { + continue; + } + const I32 earrlen = av_len(earr) + 1; + dena::hstcpcli_filter fe; + fe.filter_type = sv_get_string_ref(arr_get_entry(earr, earrlen, 0)); + fe.op = sv_get_string_ref(arr_get_entry(earr, earrlen, 1)); + fe.ff_offset = sv_get_iv(arr_get_entry(earr, earrlen, 2)); + fe.val = sv_get_string_ref(arr_get_entry(earr, earrlen, 3)); + f_r.push_back(fe); + DBG(fprintf(stderr, "av_to_filters: %s %s %d %s\n", + fe.filter_action.begin(), fe.filter_op.begin(), (int)fe.ff_offset, + fe.value.begin())); + } +} + +static void +set_process_verbose_level(const std::map<std::string, std::string>& m) +{ + std::map<std::string, std::string>::const_iterator iter = m.find("verbose"); + if (iter != m.end()) { + dena::verbose_level = atoi(iter->second.c_str()); + } +} + +static AV * +execute_internal(SV *obj, int id, const char *op, AV *keys, int limit, + int skip, const char *modop, AV *modvals, AV *filters, int invalues_keypart, + AV *invalues) +{ + AV *retval = (AV *)&PL_sv_undef; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + do { + std::vector<dena::string_ref> keyarr, mvarr; + std::vector<dena::hstcpcli_filter> farr; + std::vector<dena::string_ref> ivs; + av_to_strrefarr(keys, keyarr); + dena::string_ref modop_ref; + if (modop != 0) { + modop_ref = dena::string_ref(modop, strlen(modop)); + av_to_strrefarr(modvals, mvarr); + } + if (filters != 0) { + av_to_filters(filters, farr); + } + if (invalues_keypart >= 0 && invalues != 0) { + av_to_strrefarr(invalues, ivs); + } + ptr->request_buf_exec_generic(id, dena::string_ref(op, strlen(op)), + &keyarr[0], keyarr.size(), limit, skip, modop_ref, &mvarr[0], + mvarr.size(), &farr[0], farr.size(), invalues_keypart, &ivs[0], + ivs.size()); + AV *const av = newAV(); + retval = av; + if (ptr->request_send() != 0) { + break; + } + size_t nflds = 0; + ptr->response_recv(nflds); + const int e = ptr->get_error_code(); + DBG(fprintf(stderr, "e=%d nflds=%zu\n", e, nflds)); + av_push(av, newSViv(e)); + if (e != 0) { + const std::string s = ptr->get_error(); + av_push(av, newSVpvn(s.data(), s.size())); + } else { + const dena::string_ref *row = 0; + while ((row = ptr->get_next_row()) != 0) { + DBG(fprintf(stderr, "row=%p\n", row)); + for (size_t i = 0; i < nflds; ++i) { + const dena::string_ref& v = row[i]; + DBG(fprintf(stderr, "FLD %zu v=%s vbegin=%p\n", i, + std::string(v.begin(), v.size()) + .c_str(), v.begin())); + if (v.begin() != 0) { + SV *const e = newSVpvn( + v.begin(), v.size()); + av_push(av, e); + } else { + av_push(av, &PL_sv_undef); + } + } + } + } + if (e >= 0) { + ptr->response_buf_remove(); + } + } while (0); + return retval; +} + +struct execute_arg { + int id; + const char *op; + AV *keys; + int limit; + int skip; + const char *modop; + AV *modvals; + AV *filters; + int invalues_keypart; + AV *invalues; + execute_arg() : id(0), op(0), keys(0), limit(0), skip(0), modop(0), + modvals(0), filters(0), invalues_keypart(-1), invalues(0) { } +}; + +static AV * +execute_multi_internal(SV *obj, const execute_arg *args, size_t num_args) +{ + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + /* appends multiple requests to the send buffer */ + for (size_t i = 0; i < num_args; ++i) { + std::vector<dena::string_ref> keyarr, mvarr; + std::vector<dena::hstcpcli_filter> farr; + std::vector<dena::string_ref> ivs; + const execute_arg& arg = args[i]; + av_to_strrefarr(arg.keys, keyarr); + dena::string_ref modop_ref; + if (arg.modop != 0) { + modop_ref = dena::string_ref(arg.modop, strlen(arg.modop)); + av_to_strrefarr(arg.modvals, mvarr); + } + if (arg.filters != 0) { + av_to_filters(arg.filters, farr); + } + if (arg.invalues_keypart >= 0 && arg.invalues != 0) { + av_to_strrefarr(arg.invalues, ivs); + } + ptr->request_buf_exec_generic(arg.id, + dena::string_ref(arg.op, strlen(arg.op)), &keyarr[0], keyarr.size(), + arg.limit, arg.skip, modop_ref, &mvarr[0], mvarr.size(), &farr[0], + farr.size(), arg.invalues_keypart, &ivs[0], ivs.size()); + } + AV *const retval = newAV(); + /* sends the requests */ + if (ptr->request_send() < 0) { + /* IO error */ + AV *const av_respent = newAV(); + av_push(retval, newRV_noinc((SV *)av_respent)); + av_push(av_respent, newSViv(ptr->get_error_code())); + const std::string& s = ptr->get_error(); + av_push(av_respent, newSVpvn(s.data(), s.size())); + return retval; /* retval : [ [ err_code, err_message ] ] */ + } + /* receives responses */ + for (size_t i = 0; i < num_args; ++i) { + AV *const av_respent = newAV(); + av_push(retval, newRV_noinc((SV *)av_respent)); + size_t nflds = 0; + const int e = ptr->response_recv(nflds); + av_push(av_respent, newSViv(e)); + if (e != 0) { + const std::string& s = ptr->get_error(); + av_push(av_respent, newSVpvn(s.data(), s.size())); + } else { + const dena::string_ref *row = 0; + while ((row = ptr->get_next_row()) != 0) { + for (size_t i = 0; i < nflds; ++i) { + const dena::string_ref& v = row[i]; + DBG(fprintf(stderr, "%zu %s\n", i, + std::string(v.begin(), v.size()).c_str())); + if (v.begin() != 0) { + av_push(av_respent, newSVpvn(v.begin(), v.size())); + } else { + /* null */ + av_push(av_respent, &PL_sv_undef); + } + } + } + } + if (e >= 0) { + ptr->response_buf_remove(); + } + if (e < 0) { + return retval; + } + } + return retval; +} + +MODULE = Net::HandlerSocket PACKAGE = Net::HandlerSocket + +SV * +new(klass, args) + char *klass + HV *args +CODE: + RETVAL = &PL_sv_undef; + dena::config conf; + hv_to_strmap(args, conf); + set_process_verbose_level(conf); + dena::socket_args sargs; + sargs.set(conf); + dena::hstcpcli_ptr p = dena::hstcpcli_i::create(sargs); + SV *const objref = newSViv(0); + SV *const obj = newSVrv(objref, klass); + dena::hstcpcli_i *const ptr = p.get(); + sv_setiv(obj, reinterpret_cast<IV>(ptr)); + p.release(); + SvREADONLY_on(obj); + RETVAL = objref; +OUTPUT: + RETVAL + +void +DESTROY(obj) + SV *obj +CODE: + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + delete ptr; + +void +close(obj) + SV *obj +CODE: + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + ptr->close(); + +int +reconnect(obj) + SV *obj +CODE: + RETVAL = 0; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + RETVAL = ptr->reconnect(); +OUTPUT: + RETVAL + +int +stable_point(obj) + SV *obj +CODE: + RETVAL = 0; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + const bool rv = ptr->stable_point(); + RETVAL = static_cast<int>(rv); +OUTPUT: + RETVAL + +int +get_error_code(obj) + SV *obj +CODE: + RETVAL = 0; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + RETVAL = ptr->get_error_code(); +OUTPUT: + RETVAL + +SV * +get_error(obj) + SV *obj +CODE: + RETVAL = &PL_sv_undef; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + const std::string s = ptr->get_error(); + RETVAL = newSVpvn(s.data(), s.size()); +OUTPUT: + RETVAL + +int +auth(obj, key, typ = 0) + SV *obj + const char *key + const char *typ +CODE: + RETVAL = 0; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + do { + ptr->request_buf_auth(key, typ); + if (ptr->request_send() != 0) { + break; + } + size_t nflds = 0; + ptr->response_recv(nflds); + const int e = ptr->get_error_code(); + DBG(fprintf(stderr, "errcode=%d\n", ptr->get_error_code())); + if (e >= 0) { + ptr->response_buf_remove(); + } + DBG(fprintf(stderr, "errcode=%d\n", ptr->get_error_code())); + } while (0); + RETVAL = ptr->get_error_code(); +OUTPUT: + RETVAL + + +int +open_index(obj, id, db, table, index, fields, ffields = 0) + SV *obj + int id + const char *db + const char *table + const char *index + const char *fields + SV *ffields +CODE: + const char *const ffields_str = sv_get_strval(ffields); + RETVAL = 0; + dena::hstcpcli_i *const ptr = + reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj))); + do { + ptr->request_buf_open_index(id, db, table, index, fields, ffields_str); + if (ptr->request_send() != 0) { + break; + } + size_t nflds = 0; + ptr->response_recv(nflds); + const int e = ptr->get_error_code(); + DBG(fprintf(stderr, "errcode=%d\n", ptr->get_error_code())); + if (e >= 0) { + ptr->response_buf_remove(); + } + DBG(fprintf(stderr, "errcode=%d\n", ptr->get_error_code())); + } while (0); + RETVAL = ptr->get_error_code(); +OUTPUT: + RETVAL + +AV * +execute_single(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0, ivkeypart = -1, ivs = 0) + SV *obj + int id + const char *op + AV *keys + int limit + int skip + SV *mop + SV *mvs + SV *fils + int ivkeypart + SV *ivs +CODE: + const char *const mop_str = sv_get_strval(mop); + AV *const mvs_av = sv_get_arrval(mvs); + AV *const fils_av = sv_get_arrval(fils); + AV *const ivs_av = sv_get_arrval(ivs); + RETVAL = execute_internal(obj, id, op, keys, limit, skip, mop_str, mvs_av, + fils_av, ivkeypart, ivs_av); + sv_2mortal((SV *)RETVAL); +OUTPUT: + RETVAL + +AV * +execute_multi(obj, cmds) + SV *obj + AV *cmds +CODE: + DBG(fprintf(stderr, "execute_multi0\n")); + const I32 cmdsmax = av_len(cmds); + execute_arg args[cmdsmax + 1]; /* GNU */ + for (I32 i = 0; i <= cmdsmax; ++i) { + AV *const avtarget = arr_get_arrval(cmds, cmdsmax, i); + if (avtarget == 0) { + DBG(fprintf(stderr, "execute_multi1 %d\n", i)); + continue; + } + const I32 argmax = av_len(avtarget); + if (argmax < 2) { + DBG(fprintf(stderr, "execute_multi2 %d\n", i)); + continue; + } + execute_arg& ag = args[i]; + ag.id = arr_get_intval(avtarget, argmax, 0); + ag.op = arr_get_strval(avtarget, argmax, 1); + ag.keys = arr_get_arrval(avtarget, argmax, 2); + ag.limit = arr_get_intval(avtarget, argmax, 3); + ag.skip = arr_get_intval(avtarget, argmax, 4); + ag.modop = arr_get_strval(avtarget, argmax, 5); + ag.modvals = arr_get_arrval(avtarget, argmax, 6); + ag.filters = arr_get_arrval(avtarget, argmax, 7); + ag.invalues_keypart = arr_get_intval(avtarget, argmax, 8, -1); + ag.invalues = arr_get_arrval(avtarget, argmax, 9); + DBG(fprintf(stderr, "execute_multi3 %d: %d %s %p %d %d %s %p %p %d %p\n", + i, ag.id, ag.op, ag.keys, ag.limit, ag.skip, ag.modop, ag.modvals, + ag.filters, ag.invalues_keypart, ag.invalues)); + } + RETVAL = execute_multi_internal(obj, args, cmdsmax + 1); + sv_2mortal((SV *)RETVAL); +OUTPUT: + RETVAL + +AV * +execute_find(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0, ivkeypart = -1, ivs = 0) + SV *obj + int id + const char *op + AV *keys + int limit + int skip + SV *mop + SV *mvs + SV *fils + int ivkeypart + SV *ivs +CODE: + const char *const mop_str = sv_get_strval(mop); + AV *const mvs_av = sv_get_arrval(mvs); + AV *const fils_av = sv_get_arrval(fils); + AV *const ivs_av = sv_get_arrval(ivs); + RETVAL = execute_internal(obj, id, op, keys, limit, skip, mop_str, mvs_av, + fils_av, ivkeypart, ivs_av); + sv_2mortal((SV *)RETVAL); +OUTPUT: + RETVAL + +AV * +execute_update(obj, id, op, keys, limit, skip, modvals, fils = 0, ivkeypart = -1, ivs = 0) + SV *obj + int id + const char *op + AV *keys + int limit + int skip + AV *modvals + SV *fils + int ivkeypart + SV *ivs +CODE: + AV *const fils_av = sv_get_arrval(fils); + AV *const ivs_av = sv_get_arrval(ivs); + RETVAL = execute_internal(obj, id, op, keys, limit, skip, "U", + modvals, fils_av, ivkeypart, ivs_av); + sv_2mortal((SV *)RETVAL); +OUTPUT: + RETVAL + +AV * +execute_delete(obj, id, op, keys, limit, skip, fils = 0, ivkeypart = -1, ivs = 0) + SV *obj + int id + const char *op + AV *keys + int limit + int skip + SV *fils + int ivkeypart + SV *ivs +CODE: + AV *const fils_av = sv_get_arrval(fils); + AV *const ivs_av = sv_get_arrval(ivs); + RETVAL = execute_internal(obj, id, op, keys, limit, skip, "D", 0, fils_av, + ivkeypart, ivs_av); + sv_2mortal((SV *)RETVAL); +OUTPUT: + RETVAL + +AV * +execute_insert(obj, id, fvals) + SV *obj + int id + AV *fvals +CODE: + RETVAL = execute_internal(obj, id, "+", fvals, 0, 0, 0, 0, 0, -1, 0); + sv_2mortal((SV *)RETVAL); +OUTPUT: + RETVAL + diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/MANIFEST b/plugin/handler_socket/perl-Net-HandlerSocket/MANIFEST new file mode 100644 index 00000000..874fadb5 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/MANIFEST @@ -0,0 +1,8 @@ +Changes +HandlerSocket.xs +Makefile.PL +MANIFEST +ppport.h +README +t/HandlerSocket.t +lib/Net/HandlerSocket.pm diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/Makefile.PL.in b/plugin/handler_socket/perl-Net-HandlerSocket/Makefile.PL.in new file mode 100644 index 00000000..1a9b1444 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/Makefile.PL.in @@ -0,0 +1,18 @@ +# use 5.010000; +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + NAME => 'Net::HandlerSocket', + VERSION_FROM => 'lib/Net/HandlerSocket.pm', # finds $VERSION + PREREQ_PM => {}, # e.g., Module::Name => 1.1 + ($] >= 5.005 ? ## Add these new keywords supported since 5.005 + (ABSTRACT_FROM => 'lib/Net/HandlerSocket.pm', # retrieve abstract from module + AUTHOR => 'higuchi dot akira at dena dot jp>') : ()), + CC => 'g++ -fPIC', + LD => 'g++ -fPIC', + LIBS => ['-L@builddir@/../libhsclient -L@builddir@/../libhsclient/.libs -lhsclient'], + DEFINE => '', + INC => '-I. -I../libhsclient -I@builddir@/../libhsclient -I@top_builddir@/include', + OPTIMIZE => '-g -O3 -Wall -Wno-unused', +); diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/Makefile.PL.installed b/plugin/handler_socket/perl-Net-HandlerSocket/Makefile.PL.installed new file mode 100644 index 00000000..0d01bceb --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/Makefile.PL.installed @@ -0,0 +1,20 @@ +# use 5.010000; +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + NAME => 'Net::HandlerSocket', + VERSION_FROM => 'lib/Net/HandlerSocket.pm', # finds $VERSION + PREREQ_PM => {}, # e.g., Module::Name => 1.1 + ($] >= 5.005 ? ## Add these new keywords supported since 5.005 + (ABSTRACT_FROM => 'lib/Net/HandlerSocket.pm', # retrieve abstract from module + AUTHOR => 'higuchi dot akira at dena dot jp>') : ()), + CC => 'g++ -fPIC', + LD => 'g++ -fPIC', + LIBS => ['-lhsclient'], # e.g., '-lm' + DEFINE => '', # e.g., '-DHAVE_SOMETHING' + INC => '-I. -I/usr/include/handlersocket -I/usr/include/mysql', + OPTIMIZE => '-g -O3 -Wall -Wno-unused', + # Un-comment this if you add C files to link with later: + # OBJECT => '$(O_FILES)', # link all the C files too +); diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/README b/plugin/handler_socket/perl-Net-HandlerSocket/README new file mode 100644 index 00000000..b6aec952 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/README @@ -0,0 +1,30 @@ +HandlerSocket version 0.01 +========================== + +The README is used to introduce the module and provide instructions on +how to install the module, any machine dependencies it may have (for +example C compilers and installed libraries) and any other information +that should be provided before the module is installed. + +A README file is required for CPAN modules since CPAN extracts the +README file from a module distribution so that people browsing the +archive can use it get an idea of the modules uses. It is usually a +good idea to provide version information here so that people can +decide whether fixes for the module are worth downloading. + +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +COPYRIGHT AND LICENCE + + Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. + See COPYRIGHT.txt for details. + diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/lib/Net/HandlerSocket.pm b/plugin/handler_socket/perl-Net-HandlerSocket/lib/Net/HandlerSocket.pm new file mode 100644 index 00000000..f1ad5556 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/lib/Net/HandlerSocket.pm @@ -0,0 +1,68 @@ + +package Net::HandlerSocket; + +use strict; +use warnings; + +require Exporter; + +our @ISA = qw(Exporter); + +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. + +# This allows declaration use Net::HandlerSocket ':all'; +# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK +# will save memory. +our %EXPORT_TAGS = ( 'all' => [ qw( + +) ] ); + +our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); + +our @EXPORT = qw( + +); + +our $VERSION = '0.01'; + +require XSLoader; +XSLoader::load('Net::HandlerSocket', $VERSION); + +# Preloaded methods go here. + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +Net::HandlerSocket - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use Net::HandlerSocket; + my $hsargs = { host => 'localhost', port => 9999 }; + my $cli = new Net::HandlerSocket($hsargs); + $cli->open_index(1, 'testdb', 'testtable1', 'PRIMARY', 'foo,bar,baz'); + $cli->open_index(2, 'testdb', 'testtable2', 'i2', 'hoge,fuga'); + $cli->execute_find(1, '>=', [ 'aaa', 'bbb' ], 5, 100); + # select foo,bar,baz from testdb.testtable1 + # where pk1 = 'aaa' and pk2 = 'bbb' order by pk1, pk2 + # limit 100, 5 + +=head1 DESCRIPTION + +Stub documentation for Net::HandlerSocket, created by h2xs. + +=head1 AUTHOR + +Akira HiguchiE<lt>higuchi dot akira at dena dot jpE<gt> + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. +See COPYRIGHT.txt for details. + +=cut diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm b/plugin/handler_socket/perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm new file mode 100755 index 00000000..b6ea6265 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm @@ -0,0 +1,362 @@ +#!/usr/bin/env perl + +package Net::HandlerSocket::HSPool; + +use strict; +use warnings; +use Net::HandlerSocket; +use Socket; + +sub new { + my $self = { + config => $_[1], + reopen_interval => 60, + hostmap => { }, + }; + return bless $self, $_[0]; +} + +sub clear_pool { + my ($self) = @_; + $self->{hostmap} = { }; +} + +sub on_error { + my ($self, $obj) = @_; + my $error_func = $self->{config}->{error}; + if (defined($error_func)) { + return &{$error_func}($obj); + } + die $obj; +} + +sub on_warning { + my ($self, $obj) = @_; + my $warning_func = $self->{config}->{warning}; + if (defined($warning_func)) { + return &{$warning_func}($obj); + } +} + +sub get_conf { + my ($self, $dbtbl) = @_; + my $hcent = $self->{config}->{hostmap}->{$dbtbl}; + if (!defined($hcent)) { + $self->on_error("get_conf: $dbtbl not found"); + return undef; + } + my %cpy = %$hcent; + $cpy{port} ||= 9998; + $cpy{timeout} ||= 2; + return \%cpy; +} + +sub resolve_hostname { + my ($self, $hcent, $host_ip_list) = @_; + if (defined($host_ip_list)) { + if (scalar(@$host_ip_list) > 0) { + $hcent->{host} = shift(@$host_ip_list); + return $host_ip_list; + } + return undef; # no more ip + } + my $host = $hcent->{host}; # unresolved name + $hcent->{hostname} = $host; + my $resolve_list_func = $self->{config}->{resolve_list}; + if (defined($resolve_list_func)) { + $host_ip_list = &{$resolve_list_func}($host); + if (scalar(@$host_ip_list) > 0) { + $hcent->{host} = shift(@$host_ip_list); + return $host_ip_list; + } + return undef; # no more ip + } + my $resolve_func = $self->{config}->{resolve}; + if (defined($resolve_func)) { + $hcent->{host} = &{$resolve_func}($host); + return []; + } + my $packed = gethostbyname($host); + if (!defined($packed)) { + return undef; + } + $hcent->{host} = inet_ntoa($packed); + return []; +} + +sub get_handle_exec { + my ($self, $db, $tbl, $idx, $cols, $exec_multi, $exec_args) = @_; + my $now = time(); + my $dbtbl = join('.', $db, $tbl); + my $hcent = $self->get_conf($dbtbl); # copy + if (!defined($hcent)) { + return undef; + } + my $hmkey = join(':', $hcent->{host}, $hcent->{port}); + my $hment = $self->{hostmap}->{$hmkey}; + # [ open_time, handle, index_map, host, next_index_id ] + my $host_ip_list; + TRY_OTHER_IP: + if (!defined($hment) || + $hment->[0] + $self->{reopen_interval} < $now || + !$hment->[1]->stable_point()) { + $host_ip_list = $self->resolve_hostname($hcent, $host_ip_list); + if (!defined($host_ip_list)) { + my $hostport = $hmkey . '(' . $hcent->{host} . ')'; + $self->on_error("HSPool::get_handle" . + "($db, $tbl, $idx, $cols): host=$hmkey: " . + "no more active ip"); + return undef; + } + my $hnd = new Net::HandlerSocket($hcent); + my %m = (); + $hment = [ $now, $hnd, \%m, $hcent->{host}, 1 ]; + $self->{hostmap}->{$hmkey} = $hment; + } + my $hnd = $hment->[1]; + my $idxmap = $hment->[2]; + my $imkey = join(':', $idx, $cols); + my $idx_id = $idxmap->{$imkey}; + if (!defined($idx_id)) { + $idx_id = $hment->[4]; + my $e = $hnd->open_index($idx_id, $db, $tbl, $idx, $cols); + if ($e != 0) { + my $estr = $hnd->get_error(); + my $hostport = $hmkey . '(' . $hcent->{host} . ')'; + my $errmess = "HSPool::get_handle open_index" . + "($db, $tbl, $idx, $cols): host=$hostport " . + "err=$e($estr)"; + $self->on_warning($errmess); + $hnd->close(); + $hment = undef; + goto TRY_OTHER_IP; + } + $hment->[4]++; + $idxmap->{$imkey} = $idx_id; + } + if ($exec_multi) { + my $resarr; + for my $cmdent (@$exec_args) { + $cmdent->[0] = $idx_id; + } + if (scalar(@$exec_args) == 0) { + $resarr = []; + } else { + $resarr = $hnd->execute_multi($exec_args); + } + my $i = 0; + for my $res (@$resarr) { + if ($res->[0] != 0) { + my $cmdent = $exec_args->[$i]; + my $ec = $res->[0]; + my $estr = $res->[1]; + my $op = $cmdent->[1]; + my $kfvs = $cmdent->[2]; + my $kvstr = defined($kfvs) + ? join(',', @$kfvs) : ''; + my $limit = $cmdent->[3] || 0; + my $skip = $cmdent->[4] || 0; + my $hostport = $hmkey . '(' . $hcent->{host} + . ')'; + my $errmess = "HSPool::get_handle execm" . + "($db, $tbl, $idx, [$cols], " . + "($idx_id), $op, [$kvstr] " . + "$limit, $skip): " . + "host=$hostport err=$ec($estr)"; + if ($res->[0] < 0 || $res->[0] == 2) { + $self->on_warning($errmess); + $hnd->close(); + $hment = undef; + goto TRY_OTHER_IP; + } else { + $self->on_error($errmess); + } + } + shift(@$res); + ++$i; + } + return $resarr; + } else { + my $res = $hnd->execute_find($idx_id, @$exec_args); + if ($res->[0] != 0) { + my ($op, $kfvals, $limit, $skip) = @$exec_args; + my $ec = $res->[0]; + my $estr = $res->[1]; + my $kvstr = join(',', @$kfvals); + my $hostport = $hmkey . '(' . $hcent->{host} . ')'; + my $errmess = "HSPool::get_handle exec" . + "($db, $tbl, $idx, [$cols], ($idx_id), " . + "$op, [$kvstr], $limit, $skip): " . + "host=$hostport err=$ec($estr)"; + if ($res->[0] < 0 || $res->[0] == 2) { + $self->on_warning($errmess); + $hnd->close(); + $hment = undef; + goto TRY_OTHER_IP; + } else { + $self->on_error($errmess); + } + } + shift(@$res); + return $res; + } +} + +sub index_find { + my ($self, $db, $tbl, $idx, $cols, $op, $kfvals, $limit, $skip) = @_; + # cols: comma separated list + # kfvals: arrayref + $limit ||= 0; + $skip ||= 0; + my $res = $self->get_handle_exec($db, $tbl, $idx, $cols, + 0, [ $op, $kfvals, $limit, $skip ]); + return $res; +} + +sub index_find_multi { + my ($self, $db, $tbl, $idx, $cols, $cmdlist) = @_; + # cols : comma separated list + # cmdlist : [ dummy, op, kfvals, limit, skip ] + # kfvals : arrayref + my $resarr = $self->get_handle_exec($db, $tbl, $idx, $cols, + 1, $cmdlist); + return $resarr; +} + +sub result_single_to_arrarr { + my ($numcols, $hsres, $ret) = @_; + my $hsreslen = scalar(@$hsres); + my $rlen = int($hsreslen / $numcols); + $ret = [ ] if !defined($ret); + my @r = (); + my $p = 0; + for (my $i = 0; $i < $rlen; ++$i) { + my @a = splice(@$hsres, $p, $numcols); + $p += $numcols; + push(@$ret, \@a); + } + return $ret; # arrayref of arrayrefs +} + +sub result_multi_to_arrarr { + my ($numcols, $mhsres, $ret) = @_; + $ret = [ ] if !defined($ret); + for my $hsres (@$mhsres) { + my $hsreslen = scalar(@$hsres); + my $rlen = int($hsreslen / $numcols); + my $p = 0; + for (my $i = 0; $i < $rlen; ++$i) { + my @a = splice(@$hsres, $p, $numcols); + $p += $numcols; + push(@$ret, \@a); + } + } + return $ret; # arrayref of arrayrefs +} + +sub result_single_to_hasharr { + my ($names, $hsres, $ret) = @_; + my $nameslen = scalar(@$names); + my $hsreslen = scalar(@$hsres); + my $rlen = int($hsreslen / $nameslen); + $ret = [ ] if !defined($ret); + my $p = 0; + for (my $i = 0; $i < $rlen; ++$i) { + my %h = (); + for (my $j = 0; $j < $nameslen; ++$j, ++$p) { + $h{$names->[$j]} = $hsres->[$p]; + } + push(@$ret, \%h); + } + return $ret; # arrayref of hashrefs +} + +sub result_multi_to_hasharr { + my ($names, $mhsres, $ret) = @_; + my $nameslen = scalar(@$names); + $ret = [ ] if !defined($ret); + for my $hsres (@$mhsres) { + my $hsreslen = scalar(@$hsres); + my $rlen = int($hsreslen / $nameslen); + my $p = 0; + for (my $i = 0; $i < $rlen; ++$i) { + my %h = (); + for (my $j = 0; $j < $nameslen; ++$j, ++$p) { + $h{$names->[$j]} = $hsres->[$p]; + } + push(@$ret, \%h); + } + } + return $ret; # arrayref of hashrefs +} + +sub result_single_to_hashhash { + my ($names, $key, $hsres, $ret) = @_; + my $nameslen = scalar(@$names); + my $hsreslen = scalar(@$hsres); + my $rlen = int($hsreslen / $nameslen); + $ret = { } if !defined($ret); + my $p = 0; + for (my $i = 0; $i < $rlen; ++$i) { + my %h = (); + for (my $j = 0; $j < $nameslen; ++$j, ++$p) { + $h{$names->[$j]} = $hsres->[$p]; + } + my $k = $h{$key}; + $ret->{$k} = \%h if defined($k); + } + return $ret; # hashref of hashrefs +} + +sub result_multi_to_hashhash { + my ($names, $key, $mhsres, $ret) = @_; + my $nameslen = scalar(@$names); + $ret = { } if !defined($ret); + for my $hsres (@$mhsres) { + my $hsreslen = scalar(@$hsres); + my $rlen = int($hsreslen / $nameslen); + my $p = 0; + for (my $i = 0; $i < $rlen; ++$i) { + my %h = (); + for (my $j = 0; $j < $nameslen; ++$j, ++$p) { + $h{$names->[$j]} = $hsres->[$p]; + } + my $k = $h{$key}; + $ret->{$k} = \%h if defined($k); + } + } + return $ret; # hashref of hashrefs +} + +sub select_cols_where_eq_aa { + # SELECT $cols FROM $db.$tbl WHERE $idx_key = $kv LIMIT 1 + my ($self, $db, $tbl, $idx, $cols_aref, $kv_aref) = @_; + my $cols_str = join(',', @$cols_aref); + my $res = $self->index_find($db, $tbl, $idx, $cols_str, '=', $kv_aref); + return result_single_to_arrarr(scalar(@$cols_aref), $res); +} + +sub select_cols_where_eq_hh { + # SELECT $cols FROM $db.$tbl WHERE $idx_key = $kv LIMIT 1 + my ($self, $db, $tbl, $idx, $cols_aref, $kv_aref, $retkey) = @_; + my $cols_str = join(',', @$cols_aref); + my $res = $self->index_find($db, $tbl, $idx, $cols_str, '=', $kv_aref); + my $r = result_single_to_hashhash($cols_aref, $retkey, $res); + return $r; +} + +sub select_cols_where_in_hh { + # SELECT $cols FROM $db.$tbl WHERE $idx_key in ($vals) + my ($self, $db, $tbl, $idx, $cols_aref, $vals_aref, $retkey) = @_; + my $cols_str = join(',', @$cols_aref); + my @cmdlist = (); + for my $v (@$vals_aref) { + push(@cmdlist, [ -1, '=', [ $v ] ]); + } + my $res = $self->index_find_multi($db, $tbl, $idx, $cols_str, + \@cmdlist); + return result_multi_to_hashhash($cols_aref, $retkey, $res); +} + +1; + diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/perl-Net-HandlerSocket.spec.template b/plugin/handler_socket/perl-Net-HandlerSocket/perl-Net-HandlerSocket.spec.template new file mode 100644 index 00000000..304baf03 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/perl-Net-HandlerSocket.spec.template @@ -0,0 +1,127 @@ +# +# - HandlerSocket - +# This spec file was automatically generated by cpan2rpm [ver: 2.027] +# The following arguments were used: +# --no-sign perl-Net-HandlerSocket.tar.gz +# For more information on cpan2rpm please visit: http://perl.arix.com/ +# + +%define pkgname perl-Net-HandlerSocket +%define filelist %{pkgname}-%{version}-filelist +%define NVR %{pkgname}-%{version}-%{release} +%define maketest 1 + +name: perl-Net-HandlerSocket +summary: HandlerSocket - Perl extension for handlersocket +version: HANDLERSOCKET_VERSION +release: 1%{?dist} +packager: Akira Higuchi <higuchi dot akira at dena dot jp> +license: BSD +group: Applications/CPAN +group: System Environment/Libraries +buildroot: %{_tmppath}/%{name}-%{version}-%(id -u -n) +prefix: %(echo %{_prefix}) +source: perl-Net-HandlerSocket.tar.gz +BuildRequires: libhsclient +Requires: libhsclient +Obsoletes: perl-DB-HandlerSocket + +%description +Stub documentation for HandlerSocket, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +# +# This package was generated automatically with the cpan2rpm +# utility. To get this software or for more information +# please visit: http://perl.arix.com/ +# + +%prep +%setup -q -n %{pkgname} +chmod -R u+w %{_builddir}/%{pkgname} + +%build +grep -rsl '^#!.*perl' . | +grep -v '.bak$' |xargs --no-run-if-empty \ +%__perl -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)' +CFLAGS="$RPM_OPT_FLAGS" +%{__perl} Makefile.PL.installed `%{__perl} -MExtUtils::MakeMaker -e ' print qq|PREFIX=%{buildroot}%{_prefix}| if \$ExtUtils::MakeMaker::VERSION =~ /5\.9[1-6]|6\.0[0-5]/ '` +%{__make} +%if %maketest +%{__make} test +%endif + +%install +[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} + +%{makeinstall} `%{__perl} -MExtUtils::MakeMaker -e ' print \$ExtUtils::MakeMaker::VERSION <= 6.05 ? qq|PREFIX=%{buildroot}%{_prefix}| : qq|DESTDIR=%{buildroot}| '` + +cmd=/usr/share/spec-helper/compress_files +[ -x $cmd ] || cmd=/usr/lib/rpm/brp-compress +[ -x $cmd ] && $cmd + +# SuSE Linux +if [ -e /etc/SuSE-release -o -e /etc/UnitedLinux-release ] +then + %{__mkdir_p} %{buildroot}/var/adm/perl-modules + %{__cat} `find %{buildroot} -name "perllocal.pod"` \ + | %{__sed} -e s+%{buildroot}++g \ + > %{buildroot}/var/adm/perl-modules/%{name} +fi + +# remove special files +find %{buildroot} -name "perllocal.pod" \ + -o -name ".packlist" \ + -o -name "*.bs" \ + |xargs -i rm -f {} + +# no empty directories +find %{buildroot}%{_prefix} \ + -type d -depth \ + -exec rmdir {} \; 2>/dev/null + +%{__perl} -MFile::Find -le ' + find({ wanted => \&wanted, no_chdir => 1}, "%{buildroot}"); + print "%doc Changes README"; + for my $x (sort @dirs, @files) { + push @ret, $x unless indirs($x); + } + print join "\n", sort @ret; + + sub wanted { + return if /auto$/; + + local $_ = $File::Find::name; + my $f = $_; s|^\Q%{buildroot}\E||; + return unless length; + return $files[@files] = $_ if -f $f; + + $d = $_; + /\Q$d\E/ && return for reverse sort @INC; + $d =~ /\Q$_\E/ && return + for qw|/etc %_prefix/man %_prefix/bin %_prefix/share|; + + $dirs[@dirs] = $_; + } + + sub indirs { + my $x = shift; + $x =~ /^\Q$_\E\// && $x ne $_ && return 1 for @dirs; + } + ' > %filelist + +[ -z %filelist ] && { + echo "ERROR: empty %files listing" + exit -1 + } + +%clean +[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} + +%files -f %filelist +%defattr(-,root,root) + +%changelog +* Thu Apr 1 2010 a@localhost.localdomain +- Initial build. diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/ppport.h b/plugin/handler_socket/perl-Net-HandlerSocket/ppport.h new file mode 100644 index 00000000..6e562f5b --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/ppport.h @@ -0,0 +1,6375 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.13 + + Automatically created by Devel::PPPort running under perl 5.010000. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.13 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --version show version + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F<ppport.h> is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.10.0. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --version + +Display the version of F<ppport.h>. + +=head2 --patch=I<file> + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I<suffix> + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. Note that this does not +automagially add a dot between the original filename and the +suffix. If you want the dot, you have to include it in the option +argument. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C<Text::Diff> or a C<diff> program to be installed. + +=head2 --diff=I<program> + +Manually set the diff program and options to use. The default +is to use C<Text::Diff>, when installed, and output unified +context diffs. + +=head2 --compat-version=I<version> + +Tell F<ppport.h> to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F<ppport.h> if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F<ppport.h> will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F<ppport.h> to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. Warnings will still be displayed. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F<ppport.h>. +This reduces the size of F<ppport.h> dramatically and may be useful +if you want to include F<ppport.h> in smaller modules without +increasing their distribution size too much. + +The stripped F<ppport.h> will have a C<--unstrip> option that allows +you to undo the stripping, but only if an appropriate C<Devel::PPPort> +module is installed. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F<ppport.h>. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints or warnings for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F<ppport.h> and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I<name> + +Show portability information for API elements matching I<name>. +If I<name> is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C<PL_> prefix is deprecated. Also, +some API functions used to have a C<perl_> prefix. Using this form is +also deprecated. You can safely use the supported API, as F<ppport.h> +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F<ppport.h>. + +These functions or variables will be marked C<explicit> in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C<static> or global +variants. + +For a C<static> function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + load_module() NEED_load_module NEED_load_module_GLOBAL + my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL + my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL + my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL + sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + vload_module() NEED_vload_module NEED_vload_module_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + warner() NEED_warner NEED_warner_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C<DPPP_NAMESPACE> +macro. Just C<#define> the macro before including C<ppport.h>: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C<DPPP_>. + +=back + +The good thing is that most of the above can be checked by running +F<ppport.h> on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F<ppport.h> is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F<ppport.h> can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C<diff> program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +If you want to create patched copies of your files instead, use: + + perl ppport.h --copy=.new + +To display portability information for the C<newSVpvn> function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F<ppport.h> is causing failure during +the compilation of this module, please check if newer versions +of either this module or C<Devel::PPPort> are available on CPAN +before sending a bug report. + +If F<ppport.h> was generated using the latest version of +C<Devel::PPPort> and is causing failure of this module, please +file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>. + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C<Devel::PPPort> +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2007, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<Devel::PPPort>. + +=cut + +use strict; + +# Disable broken TRIE-optimization +BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } + +my $VERSION = 3.13; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, + version => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +# Never use C comments in this file! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip version + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +if ($opt{version}) { + print "This is $0 $VERSION.\n"; + exit 0; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +AvFILLp|5.004050||p +AvFILL||| +CLASS|||n +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002||p +Copy||| +CvPADLIST||| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvSV||| +Gv_AMupdate||| +HEf_SVKEY||5.004000| +HeHASH||5.004000| +HeKEY||5.004000| +HeKLEN||5.004000| +HePV||5.004000| +HeSVKEY_force||5.004000| +HeSVKEY_set||5.004000| +HeSVKEY||5.004000| +HeVAL||5.004000| +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LVRET||| +MARK||| +MULTICALL||5.009005| +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002||p +Move||| +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +ORIGMARK||| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERL_ABS|5.008001||p +PERL_BCDVERSION|5.009005||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_HASH|5.004000||p +PERL_INT_MAX|5.004000||p +PERL_INT_MIN|5.004000||p +PERL_LONG_MAX|5.004000||p +PERL_LONG_MIN|5.004000||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.009005||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.009005||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.007002||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.007002||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_QUAD_MAX|5.004000||p +PERL_QUAD_MIN|5.004000||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.004000||p +PERL_SHORT_MIN|5.004000||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_UCHAR_MAX|5.004000||p +PERL_UCHAR_MIN|5.004000||p +PERL_UINT_MAX|5.004000||p +PERL_UINT_MIN|5.004000||p +PERL_ULONG_MAX|5.004000||p +PERL_ULONG_MIN|5.004000||p +PERL_UNUSED_ARG|5.009003||p +PERL_UNUSED_CONTEXT|5.009004||p +PERL_UNUSED_DECL|5.007002||p +PERL_UNUSED_VAR|5.007002||p +PERL_UQUAD_MAX|5.004000||p +PERL_UQUAD_MIN|5.004000||p +PERL_USE_GCC_BRACE_GROUPS|5.009004||p +PERL_USHORT_MAX|5.004000||p +PERL_USHORT_MIN|5.004000||p +PERL_VERSION|5.006000||p +PL_DBsignal|5.005000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||pn +PL_Sv|5.005000||p +PL_compiling|5.004050||p +PL_copline|5.009005||p +PL_curcop|5.004050||p +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_expect|5.009005||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_last_in_gv|||n +PL_laststatval|5.005000||p +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofs_sv|||n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rsfp_filters|5.004050||p +PL_rsfp|5.004050||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_statcache|5.005000||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +POP_MULTICALL||5.009005| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.009005| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_context_layers||5.009004| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Perl_signbit||5.009005|n +PoisonFree|5.009004||p +PoisonNew|5.009004||p +PoisonWith|5.009004||p +Poison|5.008000||p +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +STR_WITH_LEN|5.009003||p +ST||| +SV_CONST_RETURN|5.009003||p +SV_COW_DROP_PV|5.008001||p +SV_COW_SHARED_HASH_KEYS|5.009005||p +SV_GMAGIC|5.007002||p +SV_HAS_TRAILING_NUL|5.009004||p +SV_IMMEDIATE_UNREF|5.007001||p +SV_MUTABLE_RETURN|5.009003||p +SV_NOSTEAL|5.009002||p +SV_SMAGIC|5.009003||p +SV_UTF8_NO_ENCODING|5.008001||p +SVf|5.006000||p +SVt_IV||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVHV||| +SVt_PVMG||| +SVt_PV||| +Safefree||| +Slab_Alloc||| +Slab_Free||| +Slab_to_rw||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGAMAGIC||5.006001| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_const|5.009003||p +SvPV_flags_const_nolen|5.009003||p +SvPV_flags_const|5.009003||p +SvPV_flags_mutable|5.009003||p +SvPV_flags|5.007002||p +SvPV_force_flags_mutable|5.009003||p +SvPV_force_flags_nolen|5.009003||p +SvPV_force_flags|5.007002||p +SvPV_force_mutable|5.009003||p +SvPV_force_nolen|5.009003||p +SvPV_force_nomg_nolen|5.009003||p +SvPV_force_nomg|5.007002||p +SvPV_force|||p +SvPV_mutable|5.009003||p +SvPV_nolen_const|5.009003||p +SvPV_nolen|5.006000||p +SvPV_nomg_const_nolen|5.009003||p +SvPV_nomg_const|5.009003||p +SvPV_nomg|5.007002||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec||| +SvREFCNT_inc_NN|5.009004||p +SvREFCNT_inc_simple_NN|5.009004||p +SvREFCNT_inc_simple_void_NN|5.009004||p +SvREFCNT_inc_simple_void|5.009004||p +SvREFCNT_inc_simple|5.009004||p +SvREFCNT_inc_void_NN|5.009004||p +SvREFCNT_inc_void|5.009004||p +SvREFCNT_inc|||p +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvRXOK||5.009005| +SvRX||5.009005| +SvSETMAGIC||| +SvSHARED_HASH|5.009003||p +SvSHARE||5.007003| +SvSTASH_set|5.009003||p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK|5.007001|5.006000|p +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +SvVSTRING_mg|5.009004||p +THIS|||n +UNDERBAR|5.009002||p +UTF8_MAXBYTES|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +WARN_ALL|5.006000||p +WARN_AMBIGUOUS|5.006000||p +WARN_ASSERTIONS|5.009005||p +WARN_BAREWORD|5.006000||p +WARN_CLOSED|5.006000||p +WARN_CLOSURE|5.006000||p +WARN_DEBUGGING|5.006000||p +WARN_DEPRECATED|5.006000||p +WARN_DIGIT|5.006000||p +WARN_EXEC|5.006000||p +WARN_EXITING|5.006000||p +WARN_GLOB|5.006000||p +WARN_INPLACE|5.006000||p +WARN_INTERNAL|5.006000||p +WARN_IO|5.006000||p +WARN_LAYER|5.008000||p +WARN_MALLOC|5.006000||p +WARN_MISC|5.006000||p +WARN_NEWLINE|5.006000||p +WARN_NUMERIC|5.006000||p +WARN_ONCE|5.006000||p +WARN_OVERFLOW|5.006000||p +WARN_PACK|5.006000||p +WARN_PARENTHESIS|5.006000||p +WARN_PIPE|5.006000||p +WARN_PORTABLE|5.006000||p +WARN_PRECEDENCE|5.006000||p +WARN_PRINTF|5.006000||p +WARN_PROTOTYPE|5.006000||p +WARN_QW|5.006000||p +WARN_RECURSION|5.006000||p +WARN_REDEFINE|5.006000||p +WARN_REGEXP|5.006000||p +WARN_RESERVED|5.006000||p +WARN_SEMICOLON|5.006000||p +WARN_SEVERE|5.006000||p +WARN_SIGNAL|5.006000||p +WARN_SUBSTR|5.006000||p +WARN_SYNTAX|5.006000||p +WARN_TAINT|5.006000||p +WARN_THREADS|5.008000||p +WARN_UNINITIALIZED|5.006000||p +WARN_UNOPENED|5.006000||p +WARN_UNPACK|5.006000||p +WARN_UNTIE|5.006000||p +WARN_UTF8|5.006000||p +WARN_VOID|5.006000||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002||p +XCPT_TRY_END|5.009002||p +XCPT_TRY_START|5.009002||p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_VERSION_BOOTCHECK||| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_pMY_CXT|5.007003||p +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHXR_|5.009005||p +aTHXR|5.009005||p +aTHX_|5.006000||p +aTHX|5.006000||p +add_data|||n +addmad||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_i_ncmp||| +amagic_ncmp||| +any_dup||| +ao||| +append_elem||| +append_list||| +append_madprops||| +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_create_and_push||5.009005| +av_create_and_unshift_one||5.009005| +av_delete||5.006000| +av_exists||5.006000| +av_extend||| +av_fake||| +av_fetch||| +av_fill||| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_undef||| +av_unshift||| +ax|||n +bad_type||| +bind_match||| +block_end||| +block_gimme||5.004000| +block_start||| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_mro||| +boot_core_xsutils||| +bytes_from_utf8||5.007001| +bytes_to_uni|||n +bytes_to_utf8||5.006001| +call_argv|5.006000||p +call_atexit||5.006000| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +calloc||5.007002|n +cando||| +cast_i32||5.006000| +cast_iv||5.006000| +cast_ulong||5.006000| +cast_uv||5.006000| +check_type_and_open||| +check_uni||| +checkcomma||| +checkposixcc||| +ckWARN|5.006000||p +ck_anoncode||| +ck_bitop||| +ck_concat||| +ck_defined||| +ck_delete||| +ck_die||| +ck_eof||| +ck_eval||| +ck_exec||| +ck_exists||| +ck_exit||| +ck_ftst||| +ck_fun||| +ck_glob||| +ck_grep||| +ck_index||| +ck_join||| +ck_lengthconst||| +ck_lfun||| +ck_listiob||| +ck_match||| +ck_method||| +ck_null||| +ck_open||| +ck_readline||| +ck_repeat||| +ck_require||| +ck_retarget||| +ck_return||| +ck_rfun||| +ck_rvconst||| +ck_sassign||| +ck_select||| +ck_shift||| +ck_sort||| +ck_spair||| +ck_split||| +ck_subr||| +ck_substr||| +ck_svconst||| +ck_trunc||| +ck_unpack||| +ckwarn_d||5.009003| +ckwarn||5.009003| +cl_and|||n +cl_anything|||n +cl_init_zero|||n +cl_init|||n +cl_is_anything|||n +cl_or|||n +clear_placeholders||| +closest_cop||| +convert||| +cop_free||| +cr_textfilter||| +create_eval_scope||| +croak_nocontext|||vn +croak|||v +csighandler||5.009003|n +curmad||| +custom_op_desc||5.007003| +custom_op_name||5.007003| +cv_ckproto_len||| +cv_ckproto||| +cv_clone||| +cv_const_sv||5.004000| +cv_dump||| +cv_undef||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXR|5.009005||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dVAR|5.009003||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +debug_start_match||| +deb||5.007003|v +del_sv||| +delete_eval_scope||| +delimcpy||5.004000| +deprecate_old||| +deprecate||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_where||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_chop||| +do_close||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_kv||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_oddball||| +do_op_dump||5.006000| +do_op_xmldump||| +do_open9||5.006000| +do_openn||5.007001| +do_open||5.004000| +do_pipe||| +do_pmop_dump||5.006000| +do_pmop_xmldump||| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch_body||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptosub||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +dump_all||5.006000| +dump_eval||5.006000| +dump_exec_pos||| +dump_fds||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs||5.006000| +dump_sub||5.006000| +dump_sv_child||| +dump_trie_interim_list||| +dump_trie_interim_table||| +dump_trie||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_cop_io||| +emulate_eaccess||| +eval_pv|5.006000||p +eval_sv|5.006000||p +exec_failed||| +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +fd_on_nosuid_fs||| +feature_is_enabled||| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +find_and_forget_pmops||| +find_array_subscript||| +find_beginning||| +find_byclass||| +find_hash_subscript||| +find_in_my_stash||| +find_runcv||5.008001| +find_rundefsvoffset||5.009002| +find_script||| +find_uninit_var||| +first_symbol|||n +fold_constants||| +forbid_setid||| +force_ident||| +force_list||| +force_next||| +force_version||| +force_word||| +forget_pmop||| +form_nocontext|||vn +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_arena||| +get_av|5.006000||p +get_context||5.006000|n +get_cvn_flags||5.009005| +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_re_arg||| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +glob_2number||| +glob_2pv||| +glob_assign_glob||| +glob_assign_ref||| +gp_dup||| +gp_free||| +gp_ref||| +grok_bin|5.007003||p +grok_hex|5.007003||p +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_autoload4||5.004000| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.004000| +gv_efullname4||5.006001| +gv_efullname||| +gv_ename||| +gv_fetchfile_flags||5.009005| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags||5.009002| +gv_fetchpv||| +gv_fetchsv||5.009002| +gv_fullname3||5.004000| +gv_fullname4||5.006001| +gv_fullname||| +gv_handler||5.007001| +gv_init_sv||| +gv_init||| +gv_name_set||5.009004| +gv_stashpvn|5.004000||p +gv_stashpvs||5.009003| +gv_stashpv||| +gv_stashsv||| +he_dup||| +hek_dup||| +hfreeentries||| +hsplit||| +hv_assert||5.009005| +hv_auxinit|||n +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_copy_hints_hv||| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.004000| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_exists_ent||5.004000| +hv_exists||| +hv_fetch_common||| +hv_fetch_ent||5.004000| +hv_fetchs|5.009003||p +hv_fetch||| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.004000| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.004000| +hv_magic_check|||n +hv_magic_uvar_xkey||| +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||5.009003| +hv_placeholders_set||5.009003| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.004000| +hv_store_flags||5.008000| +hv_stores|5.009004||p +hv_store||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incl_perldb||| +incline||| +incpush_if_exists||| +incpush||| +ingroup||| +init_argv_symbols||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +instr||| +intro_my||| +intuit_method||| +intuit_more||| +invert||| +io_close||| +isALNUM||| +isALPHA||| +isDIGIT||| +isLOWER||| +isSPACE||| +isUPPER||| +is_an_int||| +is_gv_magical_sv||| +is_gv_magical||| +is_handle_constructor|||n +is_list_assignment||| +is_lvalue_sub||5.007001| +is_uni_alnum_lc||5.006000| +is_uni_alnumc_lc||5.006000| +is_uni_alnumc||5.006000| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_alnumc||5.006000| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_char_slow|||n +is_utf8_char||5.006000| +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003| +is_utf8_string_loc||5.008001| +is_utf8_string||5.006001| +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +isa_lookup||| +items|||n +ix|||n +jmaybe||| +join_exact||| +keyword||| +leave_scope||| +lex_end||| +lex_start||| +linklist||| +listkids||| +list||| +load_module_nocontext|||vn +load_module|5.006000||pv +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHu|5.009002||p +mad_free||| +madlex||| +madparse||| +magic_clear_all_env||| +magic_clearenv||| +magic_clearhint||| +magic_clearpack||| +magic_clearsig||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_freeregexp||| +magic_getarylen||| +magic_getdefelem||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_len||| +magic_methcall||| +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setamagic||| +magic_setarylen||| +magic_setbm||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdefelem||| +magic_setenv||| +magic_setfm||| +magic_setglob||| +magic_sethint||| +magic_setisa||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +magicname||| +make_matcher||| +make_trie_failtable||| +make_trie||| +malloced_size|||n +malloc||5.007002|n +markstack_grow||| +matcher_matches_sv||| +measure_struct||| +memEQ|5.004000||p +memNE|5.004000||p +mem_collxfrm||| +mess_alloc||| +mess_nocontext|||vn +mess||5.006000|v +method_common||| +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_find||| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical||| +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002| +missingterm||| +mode_from_discipline||| +modkids||| +mod||| +more_bodies||| +more_sv||| +moreswitches||| +mro_get_linear_isa_c3||5.009005| +mro_get_linear_isa_dfs||5.009005| +mro_get_linear_isa||5.009005| +mro_isa_changed_in||| +mro_meta_dup||| +mro_meta_init||| +mro_method_changed_in||5.009005| +mul128||| +mulexp10|||n +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_betoh16|||n +my_betoh32|||n +my_betoh64|||n +my_betohi|||n +my_betohl|||n +my_betohs|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_index||| +my_cxt_init||| +my_dirfd||5.009005| +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_htobe16|||n +my_htobe32|||n +my_htobe64|||n +my_htobei|||n +my_htobel|||n +my_htobes|||n +my_htole16|||n +my_htole32|||n +my_htole64|||n +my_htolei|||n +my_htolel|||n +my_htoles|||n +my_htonl||| +my_kid||| +my_letoh16|||n +my_letoh32|||n +my_letoh64|||n +my_letohi|||n +my_letohl|||n +my_letohs|||n +my_lstat||| +my_memcmp||5.004000|n +my_memset|||n +my_ntohl||| +my_pclose||5.004000| +my_popen_list||5.007001| +my_popen||5.004000| +my_setenv||| +my_snprintf|5.009004||pvn +my_socketpair||5.007003|n +my_sprintf||5.009003|vn +my_stat||| +my_strftime||5.007002| +my_strlcat|5.009004||pn +my_strlcpy|5.009004||pn +my_swabn|||n +my_swap||| +my_unexec||| +my_vsnprintf||5.009004|n +my||| +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB|5.004050||p +newCVREF||| +newDEFSVOP||| +newFORM||| +newFOROP||| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGP||| +newGVOP||| +newGVREF||| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMADPROP||| +newMADsv||| +newMYSUB||| +newNULLLIST||| +newOP||| +newPADOP||| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.004000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSUB||| +newSVOP||| +newSVREF||| +newSV_type||5.009005| +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_share|5.007001||p +newSVpvn|5.004050||p +newSVpvs_share||5.009003| +newSVpvs|5.009003||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newTOKEN||| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.009003| +newXS_flags||5.009004| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +new_warnings_bitfield||| +next_symbol||| +nextargv||| +nextchar||| +ninstr||| +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +not_a_number||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +offer_nice_chunk||| +oopsAV||| +oopsCV||| +oopsHV||| +op_clear||| +op_const_sv||| +op_dump||5.006000| +op_free||| +op_getmad_weak||| +op_getmad||| +op_null||5.007002| +op_refcnt_dec||| +op_refcnt_inc||| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +op_xmldump||| +open_script||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +packWARN|5.007003||p +pack_cat||5.007003| +pack_rec||| +package||| +packlist||5.008001| +pad_add_anon||| +pad_add_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||| +pad_findlex||| +pad_findmy||| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||| +pad_peg|||n +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||5.009005| +pad_swipe||| +pad_tidy||| +pad_undef||| +parse_body||| +parse_unicode_opts||| +parser_dup||| +parser_free||| +path_is_absolute|||n +peep||| +pending_Slabs_to_ro||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pm_description||| +pmflag||| +pmop_dump||5.006000| +pmop_xmldump||| +pmruntime||| +pmtrans||| +pop_scope||| +pregcomp||5.009005| +pregexec||| +pregfree||| +prepend_elem||| +prepend_madprops||| +printbuf||| +printf_nocontext|||vn +process_special_blocks||| +ptr_table_clear||5.009005| +ptr_table_fetch||5.009005| +ptr_table_find|||n +ptr_table_free||5.009005| +ptr_table_new||5.009005| +ptr_table_split||5.009005| +ptr_table_store||5.009005| +push_scope||| +put_byte||| +pv_display||5.006000| +pv_escape||5.009004| +pv_pretty||5.009004| +pv_uni_display||5.007003| +qerror||| +qsortsvu||| +re_compile||5.009005| +re_croak2||| +re_dup||| +re_intuit_start||5.009005| +re_intuit_string||5.006000| +readpipe_override||| +realloc||5.007002|n +reentrant_free||| +reentrant_init||| +reentrant_retry|||vn +reentrant_size||| +ref_array_or_hash||| +refcounted_he_chain_2hv||| +refcounted_he_fetch||| +refcounted_he_free||| +refcounted_he_new||| +refcounted_he_value||| +refkids||| +refto||| +ref||5.009003| +reg_check_named_buff_matched||| +reg_named_buff_all||5.009005| +reg_named_buff_exists||5.009005| +reg_named_buff_fetch||5.009005| +reg_named_buff_firstkey||5.009005| +reg_named_buff_iter||| +reg_named_buff_nextkey||5.009005| +reg_named_buff_scalar||5.009005| +reg_named_buff||| +reg_namedseq||| +reg_node||| +reg_numbered_buff_fetch||| +reg_numbered_buff_length||| +reg_numbered_buff_store||| +reg_qr_package||| +reg_recode||| +reg_scan_name||| +reg_skipcomment||| +reg_stringify||5.009005| +reg_temp_copy||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.009004| +regclass||| +regcppop||| +regcppush||| +regcurly|||n +regdump_extflags||| +regdump||5.005000| +regdupe_internal||| +regexec_flags||5.005000| +regfree_internal||5.009005| +reghop3|||n +reghop4|||n +reghopmaybe3|||n +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regpiece||| +regpposixcc||| +regprop||| +regrepeat||| +regtail_study||| +regtail||| +regtry||| +reguni||| +regwhite|||n +reg||| +repeatcpy||| +report_evil_fh||| +report_uninit||| +require_pv||5.006000| +require_tie_mod||| +restore_magic||| +rninstr||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_aelem||5.004050| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hek_flags|||n +save_helem||5.004050| +save_hints||5.005000| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||| +save_padsv||5.007001| +save_pptr||| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_svref||| +save_vptr||5.006000| +savepvn||| +savepvs||5.009003| +savepv||| +savesharedpvn||5.009005| +savesharedpv||5.007003| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type|||n +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.009005| +scan_word||| +scope||| +screaminstr||5.005000| +seed||5.008001| +sequence_num||| +sequence_tail||| +sequence||| +set_context||5.006000|n +set_csh||| +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +setdefout||| +setenv_getix||| +share_hek_flags||| +share_hek||5.004000| +si_dup||| +sighandler|||n +simplify_sort||| +skipspace0||| +skipspace1||| +skipspace2||| +skipspace||| +softref2xv||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +space_join_names_mortal||| +ss_dup||| +stack_grow||| +start_force||| +start_glob||| +start_subparse||5.004000| +stashpv_hvname_match||5.009005| +stdize_locale||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_common||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2nv||| +sv_2pv_flags|5.007002||p +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen|5.006000||p +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff||| +sv_bless||| +sv_cat_decode||5.008001| +sv_catpv_mg|5.004050||p +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpvs|5.009003||p +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_catxmlpvn||| +sv_catxmlsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm||| +sv_compile_2op||5.008001| +sv_copypv||5.007003| +sv_dec||| +sv_del_backref||| +sv_derived_from||5.004000| +sv_does||5.009004| +sv_dump||| +sv_dup||| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_gets||5.004000| +sv_grow||| +sv_i_ncmp||| +sv_inc||| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8||5.006000| +sv_len||| +sv_magic_portable|5.009005|5.004000|p +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||| +sv_nv||5.005000| +sv_peek||5.005000| +sv_pos_b2u_midway||| +sv_pos_b2u||5.006000| +sv_pos_u2b_cached||| +sv_pos_u2b_forwards|||n +sv_pos_u2b_midway|||n +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags|5.007002||p +sv_pvn_force||| +sv_pvn_nomg|5.007003||p +sv_pvn||| +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_release_COW||| +sv_replace||| +sv_report_used||| +sv_reset||| +sv_rvweaken||5.006000| +sv_setiv_mg|5.004050||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.004050||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.004050||p +sv_setpvn||| +sv_setpvs|5.009004||p +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.004050||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.004050||p +sv_setuv|5.004000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_flags||5.009004| +sv_usepvn_mg|5.004050||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.005000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +sv_xmlpeek||| +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_get||| +swash_init||5.006000| +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +taint_env||| +taint_proper||| +tmps_grow||5.006000| +toLOWER||| +toUPPER||| +to_byte_substr||| +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.007003| +to_utf8_lower||5.007003| +to_utf8_substr||| +to_utf8_title||5.007003| +to_utf8_upper||5.007003| +token_free||| +token_getmad||| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments||| +too_many_arguments||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.004000| +unwind_handler_stack||| +update_debugger_info||| +upg_version||5.009005| +usage||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000| +utf8_length||5.007001| +utf8_mg_pos_cache_update||| +utf8_to_bytes||5.006001| +utf8_to_uvchr||5.007001| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vdie_common||| +vdie_croak_common||| +vdie||| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module|5.006000||p +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warner_nocontext|||vn +warner|5.006000|5.004000|pv +warn|||v +watch||| +whichsig||| +write_no_mem||| +write_to_stderr||| +xmldump_all||| +xmldump_attr||| +xmldump_eval||| +xmldump_form||| +xmldump_indent|||v +xmldump_packsubs||| +xmldump_sub||| +xmldump_vindent||| +yyerror||| +yylex||| +yyparse||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %warnings, %depends); +my $replace = 0; +my($hint, $define, $function); + +sub find_api +{ + my $code = shift; + $code =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; + grep { exists $API{$_} } $code =~ /(\w+)/mg; +} + +while (<DATA>) { + if ($hint) { + my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; + if (m{^\s*\*\s(.*?)\s*$}) { + for (@{$hint->[1]}) { + $h->{$_} ||= ''; # suppress warning with older perls + $h->{$_} .= "$1\n"; + } + } + else { undef $hint } + } + + $hint = [$1, [split /,?\s+/, $2]] + if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; + + if ($define) { + if ($define->[1] =~ /\\$/) { + $define->[1] .= $_; + } + else { + if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { + my @n = find_api($define->[1]); + push @{$depends{$define->[0]}}, @n if @n + } + undef $define; + } + } + + $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; + + if ($function) { + if (/^}/) { + if (exists $API{$function->[0]}) { + my @n = find_api($function->[1]); + push @{$depends{$function->[0]}}, @n if @n + } + undef $define; + } + else { + $function->[1] .= $_; + } + } + + $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2; + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +for (values %depends) { + my %s; + $_ = [sort grep !$s{$_}++, @$_]; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "\n$hints{$f}" if exists $hints{$f}; + print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; + $info++; + } + print "No portability information available.\n" unless $info; + $count++; + } + $count or print "Found no API matching '$opt{'api-info'}'."; + print "\n"; + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + push @flags, 'warning' if exists $warnings{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); +my $srcext = join '|', map { quotemeta $_ } @srcext; + +if (@ARGV) { + my %seen; + for (@ARGV) { + if (-e) { + if (-f) { + push @files, $_ unless $seen{$_}++; + } + else { warn "'$_' is not a file.\n" } + } + else { + my @new = grep { -f } glob $_ + or warn "'$_' does not exist.\n"; + push @files, grep { !$seen{$_}++ } @new; + } + } +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +die "No input files given!\n" unless @files; + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; <IN> }; + close IN; + + my %file = (orig => $c, changes => 0); + + # Temporarily remove C/XS comments and strings from the code + my @ccom; + + $c =~ s{ + ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* + | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) + | ( ^$HS*\#[^\r\n]* + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' + | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) + }{ defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + $file{uses_provided}{$func}++; + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + $file{needs}{$_} = 'static' if exists $need{$_}; + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { warning("Possibly wrong #define $1 in $filename") } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + my $warnings = 0; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + unless ($API{$func}{nothxarg}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses_provided}}) { + if ($file{uses}{$func}) { + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + else { + diag("Uses $func"); + } + } + $warnings += hint($func); + } + + unless ($opt{quiet}) { + for $func (sort keys %{$file{uses_todo}}) { + print "*** WARNING: Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo}), ", even with '$ppport'\n"; + $warnings++; + } + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + my $s = $warnings != 1 ? 's' : ''; + my $warn = $warnings ? " ($warnings warning$s)" : ''; + info("Analysis completed$warn"); + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub try_use { eval "use @_;"; return $@ eq '' } + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and try_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <<HEADER . $diff; +--- $file ++++ $file.patched +HEADER + } + + if (!defined $diff) { + $diff = run_diff('diff -u', $file, $str); + } + + if (!defined $diff) { + $diff = run_diff('diff', $file, $str); + } + + if (!defined $diff) { + error("Cannot generate a diff. Please install Text::Diff or use --copy."); + return; + } + + print F $diff; +} + +sub run_diff +{ + my($prog, $file, $str) = @_; + my $tmp = 'dppptemp'; + my $suf = 'aaa'; + my $diff = ''; + local *F; + + while (-e "$tmp.$suf") { $suf++ } + $tmp = "$tmp.$suf"; + + if (open F, ">$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while (<F>) { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub rec_depend +{ + my($func, $seen) = @_; + return () unless exists $depends{$func}; + $seen = {%{$seen||{}}}; + return () if $seen->{$func}++; + my %s; + grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +my %given_warnings; +sub hint +{ + $opt{quiet} and return; + my $func = shift; + my $rv = 0; + if (exists $warnings{$func} && !$given_warnings{$func}++) { + my $warn = $warnings{$func}; + $warn =~ s!^!*** !mg; + print "*** WARNING: $func\n", $warn; + $rv++; + } + if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; + } + $rv; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print <<ENDUSAGE; + +Usage: $usage + +See perldoc $0 for details. + +ENDUSAGE + + exit 2; +} + +sub strip +{ + my $self = do { local(@ARGV,$/)=($0); <> }; + my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; + $copy =~ s/^(?=\S+)/ /gms; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + if (\$Devel::PPPort::VERSION < $VERSION) { + die "$0 was originally generated with Devel::PPPort $VERSION.\\n" + . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" + . "Please install a newer version, or --unstrip will not work.\\n"; + } + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <<END; + +Sorry, but this is a stripped version of \$0. + +To be able to use its original script and doc functionality, +please try to regenerate this file using: + + \$^X \$0 --unstrip + +END +/ms; + my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms; + $c =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | ( "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' ) + | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex; + $c =~ s!\s+$!!mg; + $c =~ s!^$LF!!mg; + $c =~ s!^\s*#\s*!#!mg; + $c =~ s!^\s+!!mg; + + open OUT, ">$0" or die "cannot strip $0: $!\n"; + print OUT "$pl$c\n"; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include <patchlevel.h> +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include <could_not_find_Perl_patchlevel.h> +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) +#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ + +#ifdef I_LIMITS +# include <limits.h> +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +# ifdef SHORT_MAX +# define PERL_SHORT_MAX ((short)SHORT_MAX) +# else +# ifdef MAXSHORT /* Often used in <values.h> */ +# define PERL_SHORT_MAX ((short)MAXSHORT) +# else +# ifdef SHRT_MAX +# define PERL_SHORT_MAX ((short)SHRT_MAX) +# else +# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MIN +# ifdef SHORT_MIN +# define PERL_SHORT_MIN ((short)SHORT_MIN) +# else +# ifdef MINSHORT +# define PERL_SHORT_MIN ((short)MINSHORT) +# else +# ifdef SHRT_MIN +# define PERL_SHORT_MIN ((short)SHRT_MIN) +# else +# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +#ifndef PERL_UINT_MAX +# ifdef UINT_MAX +# define PERL_UINT_MAX ((unsigned int)UINT_MAX) +# else +# ifdef MAXUINT +# define PERL_UINT_MAX ((unsigned int)MAXUINT) +# else +# define PERL_UINT_MAX (~(unsigned int)0) +# endif +# endif +#endif + +#ifndef PERL_UINT_MIN +# define PERL_UINT_MIN ((unsigned int)0) +#endif + +#ifndef PERL_INT_MAX +# ifdef INT_MAX +# define PERL_INT_MAX ((int)INT_MAX) +# else +# ifdef MAXINT /* Often used in <values.h> */ +# define PERL_INT_MAX ((int)MAXINT) +# else +# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_INT_MIN +# ifdef INT_MIN +# define PERL_INT_MIN ((int)INT_MIN) +# else +# ifdef MININT +# define PERL_INT_MIN ((int)MININT) +# else +# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MAX +# ifdef ULONG_MAX +# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) +# else +# ifdef MAXULONG +# define PERL_ULONG_MAX ((unsigned long)MAXULONG) +# else +# define PERL_ULONG_MAX (~(unsigned long)0) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MIN +# define PERL_ULONG_MIN ((unsigned long)0L) +#endif + +#ifndef PERL_LONG_MAX +# ifdef LONG_MAX +# define PERL_LONG_MAX ((long)LONG_MAX) +# else +# ifdef MAXLONG +# define PERL_LONG_MAX ((long)MAXLONG) +# else +# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_LONG_MIN +# ifdef LONG_MIN +# define PERL_LONG_MIN ((long)LONG_MIN) +# else +# ifdef MINLONG +# define PERL_LONG_MIN ((long)MINLONG) +# else +# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) +# ifndef PERL_UQUAD_MAX +# ifdef ULONGLONG_MAX +# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) +# else +# ifdef MAXULONGLONG +# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) +# else +# define PERL_UQUAD_MAX (~(unsigned long long)0) +# endif +# endif +# endif + +# ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN ((unsigned long long)0L) +# endif + +# ifndef PERL_QUAD_MAX +# ifdef LONGLONG_MAX +# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) +# else +# ifdef MAXLONGLONG +# define PERL_QUAD_MAX ((long long)MAXLONGLONG) +# else +# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) +# endif +# endif +# endif + +# ifndef PERL_QUAD_MIN +# ifdef LONGLONG_MIN +# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) +# else +# ifdef MINLONGLONG +# define PERL_QUAD_MIN ((long long)MINLONGLONG) +# else +# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +/* This is based on code from 5.003 perl.h */ +#ifdef HAS_QUAD +# ifdef cray +#ifndef IVTYPE +# define IVTYPE int +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_INT_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_INT_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UINT_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UINT_MAX +#endif + +# ifdef INTSIZE +#ifndef IVSIZE +# define IVSIZE INTSIZE +#endif + +# endif +# else +# if defined(convex) || defined(uts) +#ifndef IVTYPE +# define IVTYPE long long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_QUAD_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_QUAD_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UQUAD_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UQUAD_MAX +#endif + +# ifdef LONGLONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGLONGSIZE +#endif + +# endif +# else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +# ifdef LONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGSIZE +#endif + +# endif +# endif +# endif +#ifndef IVSIZE +# define IVSIZE 8 +#endif + +#ifndef PERL_QUAD_MIN +# define PERL_QUAD_MIN IV_MIN +#endif + +#ifndef PERL_QUAD_MAX +# define PERL_QUAD_MAX IV_MAX +#endif + +#ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN UV_MIN +#endif + +#ifndef PERL_UQUAD_MAX +# define PERL_UQUAD_MAX UV_MAX +#endif + +#else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif +#ifndef UVTYPE +# define UVTYPE unsigned IVTYPE +#endif + +#ifndef UVSIZE +# define UVSIZE IVSIZE +#endif +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif + +#if !defined(SvUOK) && defined(SvIOK_UV) +# define SvUOK(sv) SvIOK_UV(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif + +#ifndef PERL_UNUSED_DECL +# ifdef HASATTRIBUTE +# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) +# define PERL_UNUSED_DECL +# else +# define PERL_UNUSED_DECL __attribute__((unused)) +# endif +# else +# define PERL_UNUSED_DECL +# endif +#endif + +#ifndef PERL_UNUSED_ARG +# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ +# include <note.h> +# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) +# else +# define PERL_UNUSED_ARG(x) ((void)x) +# endif +#endif + +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(x) ((void)x) +#endif + +#ifndef PERL_UNUSED_CONTEXT +# ifdef USE_ITHREADS +# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) +# else +# define PERL_UNUSED_CONTEXT +# endif +#endif +#ifndef NOOP +# define NOOP /*EMPTY*/(void)0 +#endif + +#ifndef dNOOP +# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef INT2PTR + +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif + +# define NUM2PTR(any,d) (any)(PTRV)(d) +# define PTR2IV(p) INT2PTR(IV,p) +# define PTR2UV(p) INT2PTR(UV,p) +# define PTR2NV(p) NUM2PTR(NV,p) + +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif + +#endif /* !INT2PTR */ + +#undef START_EXTERN_C +#undef END_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C extern +#endif + +#if defined(PERL_GCC_PEDANTIC) +# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN +# define PERL_GCC_BRACE_GROUPS_FORBIDDEN +# endif +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) +# ifndef PERL_USE_GCC_BRACE_GROUPS +# define PERL_USE_GCC_BRACE_GROUPS +# endif +#endif + +#undef STMT_START +#undef STMT_END +#ifdef PERL_USE_GCC_BRACE_GROUPS +# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ +# define STMT_END ) +#else +# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) +# define STMT_START if (1) +# define STMT_END else (void)0 +# else +# define STMT_START do +# define STMT_END while (0) +# endif +#endif +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +/* DEFSV appears first in 5.004_56 */ +#ifndef DEFSV +# define DEFSV GvSV(PL_defgv) +#endif + +#ifndef SAVE_DEFSV +# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) +#endif + +/* Older perls (<=5.003) lack AvFILLp */ +#ifndef AvFILLp +# define AvFILLp AvFILL +#endif +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif +#ifndef newSVpvn +# define newSVpvn(data,len) ((data) \ + ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ + : newSV(0)) +#endif + +/* Hint: gv_stashpvn + * This function's backport doesn't support the length parameter, but + * rather ignores it. Portability can only be ensured if the length + * parameter is used for speed reasons, but the length can always be + * correctly computed from the string argument. + */ +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,create) gv_stashpv(str,create) +#endif + +/* Replace: 1 */ +#ifndef get_cv +# define get_cv perl_get_cv +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef get_av +# define get_av perl_get_av +#endif + +#ifndef get_hv +# define get_hv perl_get_hv +#endif + +/* Replace: 0 */ +#ifndef dUNDERBAR +# define dUNDERBAR dNOOP +#endif + +#ifndef UNDERBAR +# define UNDERBAR DEFSV +#endif +#ifndef dAX +# define dAX I32 ax = MARK - PL_stack_base + 1 +#endif + +#ifndef dITEMS +# define dITEMS I32 items = SP - MARK +#endif +#ifndef dXSTARG +# define dXSTARG SV * targ = sv_newmortal() +#endif +#ifndef dAXMARK +# define dAXMARK I32 ax = POPMARK; \ + register SV ** const mark = PL_stack_base + ax++ +#endif +#ifndef XSprePUSH +# define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#if (PERL_BCDVERSION < 0x5005000) +# undef XSRETURN +# define XSRETURN(off) \ + STMT_START { \ + PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ + return; \ + } STMT_END +#endif +#ifndef PERL_ABS +# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) +#endif +#ifndef dVAR +# define dVAR dNOOP +#endif +#ifndef SVf +# define SVf "_" +#endif +#ifndef UTF8_MAXBYTES +# define UTF8_MAXBYTES UTF8_MAXLEN +#endif +#ifndef PERL_HASH +# define PERL_HASH(hash,str,len) \ + STMT_START { \ + const char *s_PeRlHaSh = str; \ + I32 i_PeRlHaSh = len; \ + U32 hash_PeRlHaSh = 0; \ + while (i_PeRlHaSh--) \ + hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ + (hash) = hash_PeRlHaSh; \ + } STMT_END +#endif + +#ifndef PERL_SIGNALS_UNSAFE_FLAG + +#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 + +#if (PERL_BCDVERSION < 0x5008000) +# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG +#else +# define D_PPP_PERL_SIGNALS_INIT 0 +#endif + +#if defined(NEED_PL_signals) +static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#elif defined(NEED_PL_signals_GLOBAL) +U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#else +extern U32 DPPP_(my_PL_signals); +#endif +#define PL_signals DPPP_(my_PL_signals) + +#endif + +/* Hint: PL_ppaddr + * Calling an op via PL_ppaddr requires passing a context argument + * for threaded builds. Since the context argument is different for + * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will + * automatically be defined as the correct argument. + */ + +#if (PERL_BCDVERSION <= 0x5005005) +/* Replace: 1 */ +# define PL_ppaddr ppaddr +# define PL_no_modify no_modify +/* Replace: 0 */ +#endif + +#if (PERL_BCDVERSION <= 0x5004005) +/* Replace: 1 */ +# define PL_DBsignal DBsignal +# define PL_DBsingle DBsingle +# define PL_DBsub DBsub +# define PL_DBtrace DBtrace +# define PL_Sv Sv +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_debstash debstash +# define PL_defgv defgv +# define PL_diehook diehook +# define PL_dirty dirty +# define PL_dowarn dowarn +# define PL_errgv errgv +# define PL_expect expect +# define PL_hexdigit hexdigit +# define PL_hints hints +# define PL_laststatval laststatval +# define PL_na na +# define PL_perl_destruct_level perl_destruct_level +# define PL_perldb perldb +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stack_base stack_base +# define PL_stack_sp stack_sp +# define PL_statcache statcache +# define PL_stdingv stdingv +# define PL_sv_arenaroot sv_arenaroot +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +# define PL_tainted tainted +# define PL_tainting tainting +/* Replace: 0 */ +#endif + +/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters + * Do not use this variable. It is internal to the perl parser + * and may change or even be removed in the future. Note that + * as of perl 5.9.5 you cannot assign to this variable anymore. + */ + +/* TODO: cannot assign to these vars; is it worth fixing? */ +#if (PERL_BCDVERSION >= 0x5009005) +# define PL_expect (PL_parser ? PL_parser->expect : 0) +# define PL_copline (PL_parser ? PL_parser->copline : 0) +# define PL_rsfp (PL_parser ? PL_parser->rsfp : (PerlIO *) 0) +# define PL_rsfp_filters (PL_parser ? PL_parser->rsfp_filters : (AV *) 0) +#endif +#ifndef dTHR +# define dTHR dNOOP +#endif +#ifndef dTHX +# define dTHX dNOOP +#endif + +#ifndef dTHXa +# define dTHXa(x) dNOOP +#endif +#ifndef pTHX +# define pTHX void +#endif + +#ifndef pTHX_ +# define pTHX_ +#endif + +#ifndef aTHX +# define aTHX +#endif + +#ifndef aTHX_ +# define aTHX_ +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# ifdef USE_THREADS +# define aTHXR thr +# define aTHXR_ thr, +# else +# define aTHXR +# define aTHXR_ +# endif +# define dTHXR dTHR +#else +# define aTHXR aTHX +# define aTHXR_ aTHX_ +# define dTHXR dTHX +#endif +#ifndef dTHXoa +# define dTHXoa(x) dTHXa(x) +#endif +#ifndef PUSHmortal +# define PUSHmortal PUSHs(sv_newmortal()) +#endif + +#ifndef mPUSHp +# define mPUSHp(p,l) sv_setpvn_mg(PUSHmortal, (p), (l)) +#endif + +#ifndef mPUSHn +# define mPUSHn(n) sv_setnv_mg(PUSHmortal, (NV)(n)) +#endif + +#ifndef mPUSHi +# define mPUSHi(i) sv_setiv_mg(PUSHmortal, (IV)(i)) +#endif + +#ifndef mPUSHu +# define mPUSHu(u) sv_setuv_mg(PUSHmortal, (UV)(u)) +#endif +#ifndef XPUSHmortal +# define XPUSHmortal XPUSHs(sv_newmortal()) +#endif + +#ifndef mXPUSHp +# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END +#endif + +#ifndef mXPUSHn +# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END +#endif + +#ifndef mXPUSHi +# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END +#endif + +#ifndef mXPUSHu +# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END +#endif + +/* Replace: 1 */ +#ifndef call_sv +# define call_sv perl_call_sv +#endif + +#ifndef call_pv +# define call_pv perl_call_pv +#endif + +#ifndef call_argv +# define call_argv perl_call_argv +#endif + +#ifndef call_method +# define call_method perl_call_method +#endif +#ifndef eval_sv +# define eval_sv perl_eval_sv +#endif +#ifndef PERL_LOADMOD_DENY +# define PERL_LOADMOD_DENY 0x1 +#endif + +#ifndef PERL_LOADMOD_NOIMPORT +# define PERL_LOADMOD_NOIMPORT 0x2 +#endif + +#ifndef PERL_LOADMOD_IMPORT_OPS +# define PERL_LOADMOD_IMPORT_OPS 0x4 +#endif + +/* Replace: 0 */ + +/* Replace perl_eval_pv with eval_pv */ + +#ifndef eval_pv +#if defined(NEED_eval_pv) +static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +static +#else +extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +#endif + +#ifdef eval_pv +# undef eval_pv +#endif +#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) +#define Perl_eval_pv DPPP_(my_eval_pv) + +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + +SV* +DPPP_(my_eval_pv)(char *p, I32 croak_on_error) +{ + dSP; + SV* sv = newSVpv(p, 0); + + PUSHMARK(sp); + eval_sv(sv, G_SCALAR); + SvREFCNT_dec(sv); + + SPAGAIN; + sv = POPs; + PUTBACK; + + if (croak_on_error && SvTRUE(GvSV(errgv))) + croak(SvPVx(GvSV(errgv), na)); + + return sv; +} + +#endif +#endif + +#ifndef vload_module +#if defined(NEED_vload_module) +static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +static +#else +extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +#endif + +#ifdef vload_module +# undef vload_module +#endif +#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) +#define Perl_vload_module DPPP_(my_vload_module) + +#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) + +void +DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) +{ + dTHR; + dVAR; + OP *veop, *imop; + + OP * const modname = newSVOP(OP_CONST, 0, name); + /* 5.005 has a somewhat hacky force_normal that doesn't croak on + SvREADONLY() if PL_compling is true. Current perls take care in + ck_require() to correctly turn off SvREADONLY before calling + force_normal_flags(). This seems a better fix than fudging PL_compling + */ + SvREADONLY_off(((SVOP*)modname)->op_sv); + modname->op_private |= OPpCONST_BARE; + if (ver) { + veop = newSVOP(OP_CONST, 0, ver); + } + else + veop = NULL; + if (flags & PERL_LOADMOD_NOIMPORT) { + imop = sawparens(newNULLLIST()); + } + else if (flags & PERL_LOADMOD_IMPORT_OPS) { + imop = va_arg(*args, OP*); + } + else { + SV *sv; + imop = NULL; + sv = va_arg(*args, SV*); + while (sv) { + imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); + sv = va_arg(*args, SV*); + } + } + { + const line_t ocopline = PL_copline; + COP * const ocurcop = PL_curcop; + const int oexpect = PL_expect; + +#if (PERL_BCDVERSION >= 0x5004000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), + veop, modname, imop); +#else + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + modname, imop); +#endif + PL_expect = oexpect; + PL_copline = ocopline; + PL_curcop = ocurcop; + } +} + +#endif +#endif + +#ifndef load_module +#if defined(NEED_load_module) +static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +static +#else +extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +#endif + +#ifdef load_module +# undef load_module +#endif +#define load_module DPPP_(my_load_module) +#define Perl_load_module DPPP_(my_load_module) + +#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) + +void +DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) +{ + va_list args; + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); +} + +#endif +#endif +#ifndef newRV_inc +# define newRV_inc(sv) newRV(sv) /* Replace */ +#endif + +#ifndef newRV_noinc +#if defined(NEED_newRV_noinc) +static SV * DPPP_(my_newRV_noinc)(SV *sv); +static +#else +extern SV * DPPP_(my_newRV_noinc)(SV *sv); +#endif + +#ifdef newRV_noinc +# undef newRV_noinc +#endif +#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) +#define Perl_newRV_noinc DPPP_(my_newRV_noinc) + +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) +SV * +DPPP_(my_newRV_noinc)(SV *sv) +{ + SV *rv = (SV *)newRV(sv); + SvREFCNT_dec(sv); + return rv; +} +#endif +#endif + +/* Hint: newCONSTSUB + * Returns a CV* as of perl-5.7.1. This return value is not supported + * by Devel::PPPort. + */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) +#if defined(NEED_newCONSTSUB) +static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +static +#else +extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +#endif + +#ifdef newCONSTSUB +# undef newCONSTSUB +#endif +#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) +#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + +void +DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) +{ + U32 oldhints = PL_hints; + HV *old_cop_stash = PL_curcop->cop_stash; + HV *old_curstash = PL_curstash; + line_t oldline = PL_curcop->cop_line; + PL_curcop->cop_line = PL_copline; + + PL_hints &= ~HINT_BLOCK_SCOPE; + if (stash) + PL_curstash = PL_curcop->cop_stash = stash; + + newSUB( + +#if (PERL_BCDVERSION < 0x5003022) + start_subparse(), +#elif (PERL_BCDVERSION == 0x5003022) + start_subparse(0), +#else /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +#endif + + newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), + newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ + newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) + ); + + PL_hints = oldhints; + PL_curcop->cop_stash = old_cop_stash; + PL_curstash = old_curstash; + PL_curcop->cop_line = oldline; +} +#endif +#endif + +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ + defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) + +#ifndef START_MY_CXT + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +#if (PERL_BCDVERSION < 0x5004068) +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) +#else /* >= perl5.004_68 */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) +#endif /* < perl5.004_68 */ + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +/* Clones the per-interpreter data. */ +#define MY_CXT_CLONE \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) +#endif + +#else /* single interpreter */ + +#ifndef START_MY_CXT + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +#define MY_CXT_CLONE NOOP +#endif + +#endif + +#ifndef IVdf +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# define UVuf "lu" +# define UVof "lo" +# define UVxf "lx" +# define UVXf "lX" +# else +# if IVSIZE == INTSIZE +# define IVdf "d" +# define UVuf "u" +# define UVof "o" +# define UVxf "x" +# define UVXf "X" +# endif +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */ +# define NVef PERL_PRIeldbl +# define NVff PERL_PRIfldbl +# define NVgf PERL_PRIgldbl +# else +# define NVef "e" +# define NVff "f" +# define NVgf "g" +# endif +#endif + +#ifndef SvREFCNT_inc +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (SvREFCNT(_sv))++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc(sv) \ + ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_simple +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_simple(sv) \ + ({ \ + if (sv) \ + (SvREFCNT(sv))++; \ + (SV *)(sv); \ + }) +# else +# define SvREFCNT_inc_simple(sv) \ + ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_NN +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_NN(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + SvREFCNT(_sv)++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc_NN(sv) \ + (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) +# endif +#endif + +#ifndef SvREFCNT_inc_void +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_void(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (void)(SvREFCNT(_sv)++); \ + }) +# else +# define SvREFCNT_inc_void(sv) \ + (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) +# endif +#endif +#ifndef SvREFCNT_inc_simple_void +# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#endif + +#ifndef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) +#endif + +#ifndef SvREFCNT_inc_void_NN +# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +/* Backwards compatibility stuff... :-( */ +#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) +# define NEED_sv_2pv_flags +#endif +#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) +# define NEED_sv_2pv_flags_GLOBAL +#endif + +/* Hint: sv_2pv_nolen + * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). + */ +#ifndef sv_2pv_nolen +# define sv_2pv_nolen(sv) SvPV_nolen(sv) +#endif + +#ifdef SvPVbyte + +/* Hint: SvPVbyte + * Does not work in perl-5.6.1, ppport.h implements a version + * borrowed from perl-5.7.3. + */ + +#if (PERL_BCDVERSION < 0x5007000) + +#if defined(NEED_sv_2pvbyte) +static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV * sv, STRLEN * lp); +static +#else +extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV * sv, STRLEN * lp); +#endif + +#ifdef sv_2pvbyte +# undef sv_2pvbyte +#endif +#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) +#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) + +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + +char * +DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) +{ + sv_utf8_downgrade(sv,0); + return SvPV(sv,*lp); +} + +#endif + +/* Hint: sv_2pvbyte + * Use the SvPVbyte() macro instead of sv_2pvbyte(). + */ + +#undef SvPVbyte + +#define SvPVbyte(sv, lp) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + +#endif + +#else + +# define SvPVbyte SvPV +# define sv_2pvbyte sv_2pv + +#endif +#ifndef sv_2pvbyte_nolen +# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) +#endif + +/* Hint: sv_pvn + * Always use the SvPV() macro instead of sv_pvn(). + */ + +/* Hint: sv_pvn_force + * Always use the SvPV_force() macro instead of sv_pvn_force(). + */ + +/* If these are undefined, they're not handled by the core anyway */ +#ifndef SV_IMMEDIATE_UNREF +# define SV_IMMEDIATE_UNREF 0 +#endif + +#ifndef SV_GMAGIC +# define SV_GMAGIC 0 +#endif + +#ifndef SV_COW_DROP_PV +# define SV_COW_DROP_PV 0 +#endif + +#ifndef SV_UTF8_NO_ENCODING +# define SV_UTF8_NO_ENCODING 0 +#endif + +#ifndef SV_NOSTEAL +# define SV_NOSTEAL 0 +#endif + +#ifndef SV_CONST_RETURN +# define SV_CONST_RETURN 0 +#endif + +#ifndef SV_MUTABLE_RETURN +# define SV_MUTABLE_RETURN 0 +#endif + +#ifndef SV_SMAGIC +# define SV_SMAGIC 0 +#endif + +#ifndef SV_HAS_TRAILING_NUL +# define SV_HAS_TRAILING_NUL 0 +#endif + +#ifndef SV_COW_SHARED_HASH_KEYS +# define SV_COW_SHARED_HASH_KEYS 0 +#endif + +#if (PERL_BCDVERSION < 0x5007002) + +#if defined(NEED_sv_2pv_flags) +static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags); +#endif + +#ifdef sv_2pv_flags +# undef sv_2pv_flags +#endif +#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) +#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) + +#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) + +char * +DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_2pv(sv, lp ? lp : &n_a); +} + +#endif + +#if defined(NEED_sv_pvn_force_flags) +static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags); +#endif + +#ifdef sv_pvn_force_flags +# undef sv_pvn_force_flags +#endif +#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) +#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) + +#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) + +char * +DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_pvn_force(sv, lp ? lp : &n_a); +} + +#endif + +#endif +#ifndef SvPV_const +# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_mutable +# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) +#endif +#ifndef SvPV_flags +# define SvPV_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_flags_const +# define SvPV_flags_const(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ + (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_const_nolen +# define SvPV_flags_const_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : \ + (const char*) sv_2pv_flags(sv, 0, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_mutable +# define SvPV_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ + sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_force +# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nolen +# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) +#endif + +#ifndef SvPV_force_mutable +# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nomg +# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) +#endif + +#ifndef SvPV_force_nomg_nolen +# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) +#endif +#ifndef SvPV_force_flags +# define SvPV_force_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_force_flags_nolen +# define SvPV_force_flags_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? SvPVX(sv) : sv_pvn_force_flags(sv, 0, flags)) +#endif +#ifndef SvPV_force_flags_mutable +# define SvPV_force_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ + : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_nolen +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC)) +#endif +#ifndef SvPV_nolen_const +# define SvPV_nolen_const(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN)) +#endif +#ifndef SvPV_nomg +# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const +# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const_nolen +# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) +#endif +#ifndef SvMAGIC_set +# define SvMAGIC_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5009003) +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) (0 + SvPVX(sv)) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END +#endif + +#else +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + ((sv)->sv_u.svu_rv = (val)); } STMT_END +#endif + +#endif +#ifndef SvSTASH_set +# define SvSTASH_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5004000) +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END +#endif + +#else +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END +#endif + +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) +#if defined(NEED_vnewSVpvf) +static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args); +static +#else +extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args); +#endif + +#ifdef vnewSVpvf +# undef vnewSVpvf +#endif +#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) +#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) + +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + +SV * +DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) +{ + register SV *sv = newSV(0); + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); + return sv; +} + +#endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) +# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) +# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) +#if defined(NEED_sv_catpvf_mg) +static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +#endif + +#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) + +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) +#if defined(NEED_sv_catpvf_mg_nocontext) +static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...); +#endif + +#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) +#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) + +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ +#ifndef sv_catpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# else +# define sv_catpvf_mg Perl_sv_catpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) +# define sv_vcatpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) +#if defined(NEED_sv_setpvf_mg) +static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +#endif + +#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) + +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) +#if defined(NEED_sv_setpvf_mg_nocontext) +static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...); +#endif + +#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) +#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) + +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ +#ifndef sv_setpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# else +# define sv_setpvf_mg Perl_sv_setpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) +# define sv_vsetpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +#ifndef newSVpvn_share + +#if defined(NEED_newSVpvn_share) +static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +static +#else +extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +#endif + +#ifdef newSVpvn_share +# undef newSVpvn_share +#endif +#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) +#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) + +#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) + +SV * +DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) +{ + SV *sv; + if (len < 0) + len = -len; + if (!hash) + PERL_HASH(hash, (char*) src, len); + sv = newSVpvn((char *) src, len); + sv_upgrade(sv, SVt_PVIV); + SvIVX(sv) = hash; + SvREADONLY_on(sv); + SvPOK_on(sv); + return sv; +} + +#endif + +#endif +#ifndef SvSHARED_HASH +# define SvSHARED_HASH(sv) (0 + SvUVX(sv)) +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#define Perl_warner DPPP_(my_warner) + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +/* concatenating with "" ensures that only literal strings are accepted as argument + * note that STR_WITH_LEN() can't be used as argument to macros or functions that + * under some configurations might be macros + */ +#ifndef STR_WITH_LEN +# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) +#endif +#ifndef newSVpvs +# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) +#endif + +#ifndef sv_catpvs +# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef sv_setpvs +# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef hv_fetchs +# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) +#endif + +#ifndef hv_stores +# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) +#endif +#ifndef SvGETMAGIC +# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END +#endif +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +/* That's the best we can do... */ +#ifndef sv_catpvn_nomg +# define sv_catpvn_nomg sv_catpvn +#endif + +#ifndef sv_catsv_nomg +# define sv_catsv_nomg sv_catsv +#endif + +#ifndef sv_setsv_nomg +# define sv_setsv_nomg sv_setsv +#endif + +#ifndef sv_pvn_nomg +# define sv_pvn_nomg sv_pvn +#endif + +#ifndef SvIV_nomg +# define SvIV_nomg SvIV +#endif + +#ifndef SvUV_nomg +# define SvUV_nomg SvUV +#endif + +#ifndef sv_catpv_mg +# define sv_catpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catpvn_mg +# define sv_catpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catsv_mg +# define sv_catsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_catsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setiv_mg +# define sv_setiv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setiv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setnv_mg +# define sv_setnv_mg(sv, num) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setnv(TeMpSv,num); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpv_mg +# define sv_setpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpvn_mg +# define sv_setpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setsv_mg +# define sv_setsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_setsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setuv_mg +# define sv_setuv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setuv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_usepvn_mg +# define sv_usepvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_usepvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif +#ifndef SvVSTRING_mg +# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) +#endif + +/* Hint: sv_magic_portable + * This is a compatibility function that is only available with + * Devel::PPPort. It is NOT in the perl core. + * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when + * it is being passed a name pointer with namlen == 0. In that + * case, perl 5.8.0 and later store the pointer, not a copy of it. + * The compatibility can be provided back to perl 5.004. With + * earlier versions, the code will not compile. + */ + +#if (PERL_BCDVERSION < 0x5004000) + + /* code that uses sv_magic_portable will not compile */ + +#elif (PERL_BCDVERSION < 0x5008000) + +# define sv_magic_portable(sv, obj, how, name, namlen) \ + STMT_START { \ + SV *SvMp_sv = (sv); \ + char *SvMp_name = (char *) (name); \ + I32 SvMp_namlen = (namlen); \ + if (SvMp_name && SvMp_namlen == 0) \ + { \ + MAGIC *mg; \ + sv_magic(SvMp_sv, obj, how, 0, 0); \ + mg = SvMAGIC(SvMp_sv); \ + mg->mg_len = -42; /* XXX: this is the tricky part */ \ + mg->mg_ptr = SvMp_name; \ + } \ + else \ + { \ + sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ + } \ + } STMT_END + +#else + +# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) + +#endif + +#ifdef USE_ITHREADS +#ifndef CopFILE +# define CopFILE(c) ((c)->cop_file) +#endif + +#ifndef CopFILEGV +# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) ((c)->cop_stashpv) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ + || (CopSTASHPV(c) && HvNAME(hv) \ + && strEQ(CopSTASHPV(c), HvNAME(hv))))) +#endif + +#else +#ifndef CopFILEGV +# define CopFILEGV(c) ((c)->cop_filegv) +#endif + +#ifndef CopFILEGV_set +# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) +#endif + +#ifndef CopFILE +# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) ((c)->cop_stash) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) +#endif + +#endif /* USE_ITHREADS */ +#ifndef IN_PERL_COMPILETIME +# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) +#endif + +#ifndef IN_LOCALE_RUNTIME +# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE_COMPILETIME +# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE +# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) +#endif +#ifndef IS_NUMBER_IN_UV +# define IS_NUMBER_IN_UV 0x01 +#endif + +#ifndef IS_NUMBER_GREATER_THAN_UV_MAX +# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef IS_NUMBER_NOT_INT +# define IS_NUMBER_NOT_INT 0x04 +#endif + +#ifndef IS_NUMBER_NEG +# define IS_NUMBER_NEG 0x08 +#endif + +#ifndef IS_NUMBER_INFINITY +# define IS_NUMBER_INFINITY 0x10 +#endif + +#ifndef IS_NUMBER_NAN +# define IS_NUMBER_NAN 0x20 +#endif +#ifndef GROK_NUMERIC_RADIX +# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +#endif +#ifndef PERL_SCAN_GREATER_THAN_UV_MAX +# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef PERL_SCAN_SILENT_ILLDIGIT +# define PERL_SCAN_SILENT_ILLDIGIT 0x04 +#endif + +#ifndef PERL_SCAN_ALLOW_UNDERSCORES +# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 +#endif + +#ifndef PERL_SCAN_DISALLOW_PREFIX +# define PERL_SCAN_DISALLOW_PREFIX 0x02 +#endif + +#ifndef grok_numeric_radix +#if defined(NEED_grok_numeric_radix) +static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +static +#else +extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +#endif + +#ifdef grok_numeric_radix +# undef grok_numeric_radix +#endif +#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) +#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) + +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) +bool +DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) +{ +#ifdef USE_LOCALE_NUMERIC +#ifdef PL_numeric_radix_sv + if (PL_numeric_radix_sv && IN_LOCALE) { + STRLEN len; + char* radix = SvPV(PL_numeric_radix_sv, len); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#else + /* older perls don't have PL_numeric_radix_sv so the radix + * must manually be requested from locale.h + */ +#include <locale.h> + dTHR; /* needed for older threaded perls */ + struct lconv *lc = localeconv(); + char *radix = lc->decimal_point; + if (radix && IN_LOCALE) { + STRLEN len = strlen(radix); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#endif +#endif /* USE_LOCALE_NUMERIC */ + /* always try "." if numeric radix didn't match because + * we may have data from different locales mixed */ + if (*sp < send && **sp == '.') { + ++*sp; + return TRUE; + } + return FALSE; +} +#endif +#endif + +#ifndef grok_number +#if defined(NEED_grok_number) +static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +static +#else +extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +#endif + +#ifdef grok_number +# undef grok_number +#endif +#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) +#define Perl_grok_number DPPP_(my_grok_number) + +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) +int +DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) +{ + const char *s = pv; + const char *send = pv + len; + const UV max_div_10 = UV_MAX / 10; + const char max_mod_10 = UV_MAX % 10; + int numtype = 0; + int sawinf = 0; + int sawnan = 0; + + while (s < send && isSPACE(*s)) + s++; + if (s == send) { + return 0; + } else if (*s == '-') { + s++; + numtype = IS_NUMBER_NEG; + } + else if (*s == '+') + s++; + + if (s == send) + return 0; + + /* next must be digit or the radix separator or beginning of infinity */ + if (isDIGIT(*s)) { + /* UVs are at least 32 bits, so the first 9 decimal digits cannot + overflow. */ + UV value = *s - '0'; + /* This construction seems to be more optimiser friendly. + (without it gcc does the isDIGIT test and the *s - '0' separately) + With it gcc on arm is managing 6 instructions (6 cycles) per digit. + In theory the optimiser could deduce how far to unroll the loop + before checking for overflow. */ + if (++s < send) { + int digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + /* Now got 9 digits, so need to check + each time for overflow. */ + digit = *s - '0'; + while (digit >= 0 && digit <= 9 + && (value < max_div_10 + || (value == max_div_10 + && digit <= max_mod_10))) { + value = value * 10 + digit; + if (++s < send) + digit = *s - '0'; + else + break; + } + if (digit >= 0 && digit <= 9 + && (s < send)) { + /* value overflowed. + skip the remaining digits, don't + worry about setting *valuep. */ + do { + s++; + } while (s < send && isDIGIT(*s)); + numtype |= + IS_NUMBER_GREATER_THAN_UV_MAX; + goto skip_value; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + numtype |= IS_NUMBER_IN_UV; + if (valuep) + *valuep = value; + + skip_value: + if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT; + while (s < send && isDIGIT(*s)) /* optional digits after the radix */ + s++; + } + } + else if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ + /* no digits before the radix means we need digits after it */ + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + if (valuep) { + /* integer approximation is valid - it's 0. */ + *valuep = 0; + } + } + else + return 0; + } else if (*s == 'I' || *s == 'i') { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; + s++; if (s < send && (*s == 'I' || *s == 'i')) { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; + s++; if (s == send || (*s != 'T' && *s != 't')) return 0; + s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; + s++; + } + sawinf = 1; + } else if (*s == 'N' || *s == 'n') { + /* XXX TODO: There are signaling NaNs and quiet NaNs. */ + s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; + sawnan = 1; + } else + return 0; + + if (sawinf) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; + } else if (sawnan) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; + } else if (s < send) { + /* we can have an optional exponent part */ + if (*s == 'e' || *s == 'E') { + /* The only flag we keep is sign. Blow away any "it's UV" */ + numtype &= IS_NUMBER_NEG; + numtype |= IS_NUMBER_NOT_INT; + s++; + if (s < send && (*s == '-' || *s == '+')) + s++; + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + } + else + return 0; + } + } + while (s < send && isSPACE(*s)) + s++; + if (s >= send) + return numtype; + if (len == 10 && memEQ(pv, "0 but true", 10)) { + if (valuep) + *valuep = 0; + return IS_NUMBER_IN_UV; + } + return 0; +} +#endif +#endif + +/* + * The grok_* routines have been modified to use warn() instead of + * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, + * which is why the stack variable has been renamed to 'xdigit'. + */ + +#ifndef grok_bin +#if defined(NEED_grok_bin) +static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_bin +# undef grok_bin +#endif +#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) +#define Perl_grok_bin DPPP_(my_grok_bin) + +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) +UV +DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_2 = UV_MAX / 2; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading b or 0b. + for compatibility silently suffer "b" and "0b" as valid binary + numbers. */ + if (len >= 1) { + if (s[0] == 'b') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'b') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + char bit = *s; + if (bit == '0' || bit == '1') { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_bin. */ + redo: + if (!overflowed) { + if (value <= max_div_2) { + value = (value << 1) | (bit - '0'); + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in binary number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 2.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount. */ + value_nv += (NV)(bit - '0'); + continue; + } + if (bit == '_' && len && allow_underscores && (bit = s[1]) + && (bit == '0' || bit == '1')) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal binary digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Binary number > 0b11111111111111111111111111111111 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_hex +#if defined(NEED_grok_hex) +static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_hex +# undef grok_hex +#endif +#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) +#define Perl_grok_hex DPPP_(my_grok_hex) + +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) +UV +DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_16 = UV_MAX / 16; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + const char *xdigit; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading x or 0x. + for compatibility silently suffer "x" and "0x" as valid hex numbers. + */ + if (len >= 1) { + if (s[0] == 'x') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'x') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + xdigit = strchr((char *) PL_hexdigit, *s); + if (xdigit) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_hex. */ + redo: + if (!overflowed) { + if (value <= max_div_16) { + value = (value << 4) | ((xdigit - PL_hexdigit) & 15); + continue; + } + warn("Integer overflow in hexadecimal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 16.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 16-tuples. */ + value_nv += (NV)((xdigit - PL_hexdigit) & 15); + continue; + } + if (*s == '_' && len && allow_underscores && s[1] + && (xdigit = strchr((char *) PL_hexdigit, s[1]))) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal hexadecimal digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Hexadecimal number > 0xffffffff non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_oct +#if defined(NEED_grok_oct) +static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_oct +# undef grok_oct +#endif +#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) +#define Perl_grok_oct DPPP_(my_grok_oct) + +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) +UV +DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_8 = UV_MAX / 8; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + for (; len-- && *s; s++) { + /* gcc 2.95 optimiser not smart enough to figure that this subtraction + out front allows slicker code. */ + int digit = *s - '0'; + if (digit >= 0 && digit <= 7) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + */ + redo: + if (!overflowed) { + if (value <= max_div_8) { + value = (value << 3) | digit; + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in octal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 8.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 8-tuples. */ + value_nv += (NV)digit; + continue; + } + if (digit == ('_' - '0') && len && allow_underscores + && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) + { + --len; + ++s; + goto redo; + } + /* Allow \octal to work the DWIM way (that is, stop scanning + * as soon as non-octal characters are seen, complain only iff + * someone seems to want to use the digits eight and nine). */ + if (digit == 8 || digit == 9) { + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal octal digit '%c' ignored", *s); + } + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Octal number > 037777777777 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#if !defined(my_snprintf) +#if defined(NEED_my_snprintf) +static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +static +#else +extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +#endif + +#define my_snprintf DPPP_(my_my_snprintf) +#define Perl_my_snprintf DPPP_(my_my_snprintf) + +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + +int +DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) +{ + dTHX; + int retval; + va_list ap; + va_start(ap, format); +#ifdef HAS_VSNPRINTF + retval = vsnprintf(buffer, len, format, ap); +#else + retval = vsprintf(buffer, format, ap); +#endif + va_end(ap); + if (retval >= (int)len) + Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); + return retval; +} + +#endif +#endif + +#ifdef NO_XSLOCKS +# ifdef dJMPENV +# define dXCPT dJMPENV; int rEtV = 0 +# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) +# define XCPT_TRY_END JMPENV_POP; +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW JMPENV_JUMP(rEtV) +# else +# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 +# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) +# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW Siglongjmp(top_env, rEtV) +# endif +#endif + +#if !defined(my_strlcat) +#if defined(NEED_my_strlcat) +static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcat DPPP_(my_my_strlcat) +#define Perl_my_strlcat DPPP_(my_my_strlcat) + +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + +Size_t +DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif +#endif + +#if !defined(my_strlcpy) +#if defined(NEED_my_strlcpy) +static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcpy DPPP_(my_my_strlcpy) +#define Perl_my_strlcpy DPPP_(my_my_strlcpy) + +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + +Size_t +DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} + +#endif +#endif + +#endif /* _P_P_PORTABILITY_H_ */ + +/* End of File ppport.h */ diff --git a/plugin/handler_socket/perl-Net-HandlerSocket/t/HandlerSocket.t b/plugin/handler_socket/perl-Net-HandlerSocket/t/HandlerSocket.t new file mode 100644 index 00000000..adb7c981 --- /dev/null +++ b/plugin/handler_socket/perl-Net-HandlerSocket/t/HandlerSocket.t @@ -0,0 +1,15 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl HandlerSocket.t' + +######################### + +# change 'tests => 1' to 'tests => last_test_to_print'; + +use Test::More tests => 1; +BEGIN { use_ok('Net::HandlerSocket') }; + +######################### + +# Insert your test code below, the Test::More module is use()ed here so read +# its man page ( perldoc Test::More ) for help writing this test script. + diff --git a/plugin/handler_socket/regtest/common/binary_my.cnf b/plugin/handler_socket/regtest/common/binary_my.cnf new file mode 100644 index 00000000..c3f7c02c --- /dev/null +++ b/plugin/handler_socket/regtest/common/binary_my.cnf @@ -0,0 +1,4 @@ + +[perl] +default-character-set-name = binary + diff --git a/plugin/handler_socket/regtest/common/compat.sh b/plugin/handler_socket/regtest/common/compat.sh new file mode 100644 index 00000000..7804bdf1 --- /dev/null +++ b/plugin/handler_socket/regtest/common/compat.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +if [ "`uname -o`" = "Cygwin" ]; then + export DIFF='diff --ignore-space --strip-trailing-cr' +elif [ "`uname`" = "Darwin" ]; then + export DIFF='diff' +else + export DIFF='diff --ignore-space --strip-trailing-cr' +fi + +compile_c() { + if [ "`uname -o`" = "Cygwin" ]; then + cl /W3 /I../.. /EHsc /FD /MD "$1" /link /DLL "/OUT:$2.dll" \ + ../../libase.lib 2> cl.log + else + $CXX -I../.. -O3 -g -Wall -fPIC -shared "$1" -o "$2.so" + fi +} + +compile_j() { + if [ "`uname -o`" = "Cygwin" ]; then + jdk="`echo /cygdrive/c/Program\ Files/Java/jdk* | head -1`" + else + jdk="$SUNJDK" + fi + "$jdk/bin/javac" -g "$1"/*.java + "$jdk/bin/jar" -cf "$1.jar" "$1"/*.class +} + diff --git a/plugin/handler_socket/regtest/common/hstest.pm b/plugin/handler_socket/regtest/common/hstest.pm new file mode 100644 index 00000000..89f273c9 --- /dev/null +++ b/plugin/handler_socket/regtest/common/hstest.pm @@ -0,0 +1,66 @@ + +# vim:sw=2:ai + +package hstest; + +use DBI; +use Net::HandlerSocket; + +our %conf = (); + +sub get_conf_env { + my ($key, $defval) = @_; + return $ENV{$key} || $defval; +} + +sub init_conf { + $conf{host} = get_conf_env("MYHOST", "localhost"); + $conf{myport} = get_conf_env("MYPORT", 3306); + $conf{dbname} = get_conf_env("MYDBNAME", "hstestdb"); + $conf{ssps} = get_conf_env("MYSSPS"); + $conf{user} = get_conf_env("MYSQLUSER", "root"); + $conf{pass} = get_conf_env("MYSQLPASS", ""); + $conf{hsport} = get_conf_env("HSPORT", 9998); + $conf{hspass} = get_conf_env("HSPASS", undef); +} + +sub get_dbi_connection { + my ($dbname, $host, $myport, $ssps, $user, $pass) + = ($conf{dbname}, $conf{host}, $conf{myport}, $conf{ssps}, + $conf{user}, $conf{pass}); + my $mycnf = "binary_my.cnf"; + my $dsn = "DBI:MariaDB:database=;host=$host;port=$myport" + . ";mariadb_server_prepare=$ssps" + . ";mariadb_read_default_group=perl" + . ";mariadb_read_default_file=../common/$mycnf"; + my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1 }); + return $dbh; +} + +sub init_testdb { + my $charset = $_[0] || "binary"; + my $dbh = get_dbi_connection(); + my $dbname = $conf{dbname}; + $dbh->do("drop database if exists $dbname"); + $dbh->do("create database $dbname default character set $charset"); + $dbh->do("use $dbname"); + return $dbh; +} + +sub get_hs_connection { + my ($host, $port) = @_; + $host ||= $conf{host}; + $port ||= $conf{hsport}; + my $hsargs = { 'host' => $host, 'port' => $port }; + my $conn = new Net::HandlerSocket($hsargs); + if (defined($conn) && defined($conf{hspass})) { + $conn->auth($conf{hspass}); + } + return $conn; +} + + +init_conf(); + +1; + diff --git a/plugin/handler_socket/regtest/test_01_lib/run.sh b/plugin/handler_socket/regtest/test_01_lib/run.sh new file mode 100755 index 00000000..84603d65 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/run.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +TESTS="01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"; + +source ../common/compat.sh + +for i in $TESTS; do + perl "test$i.pl" > test$i.log 2> test$i.log2 +done +for i in $TESTS; do + if ! $DIFF -u test$i.log test$i.expected; then + echo "test$i failed"; + exit 1 + fi + if [ -f "test$i.expect2" ]; then + lines="`wc -l < test$i.expect2`" + head -$lines test$i.log2 > test$i.log2h + if ! $DIFF -u test$i.log2h test$i.expect2 && \ + ! $DIFF -u test$i.log2h test$i.expect2ef; then + echo "test$i failed"; + exit 1 + fi + fi +done +echo "OK." +exit 0 + diff --git a/plugin/handler_socket/regtest/test_01_lib/test01.expected b/plugin/handler_socket/regtest/test_01_lib/test01.expected new file mode 100644 index 00000000..37da3242 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test01.expected @@ -0,0 +1,100 @@ +k0 v1020 +k1 v6351 +k10 v70410 +k11 v75111 +k12 v36712 +k13 v40013 +k14 v39714 +k15 v17015 +k16 v71916 +k17 v73417 +k18 v58718 +k19 v49419 +k2 v8032 +k20 v52320 +k21 v95421 +k22 v43322 +k23 v82023 +k24 v28324 +k25 v83725 +k26 v20526 +k27 v41527 +k28 v54528 +k29 v58329 +k3 v9253 +k30 v5230 +k31 v32331 +k32 v61432 +k33 v67933 +k34 v80534 +k35 v45135 +k36 v11536 +k37 v26937 +k38 v21838 +k39 v61739 +k4 v7754 +k40 v87840 +k41 v34541 +k42 v51242 +k43 v96943 +k44 v40844 +k45 v29145 +k46 v85846 +k47 v95347 +k48 v71048 +k49 v14249 +k5 v5375 +k50 v68250 +k51 v93451 +k52 v62152 +k53 v96553 +k54 v57454 +k55 v20455 +k56 v29856 +k57 v13457 +k58 v98358 +k59 v44459 +k6 v5926 +k60 v14460 +k61 v15261 +k62 v18762 +k63 v21563 +k64 v864 +k65 v69765 +k66 v65166 +k67 v28067 +k68 v70168 +k69 v53769 +k7 v4147 +k70 v41370 +k71 v6971 +k72 v8672 +k73 v82273 +k74 v67074 +k75 v37075 +k76 v80676 +k77 v68877 +k78 v2678 +k79 v6679 +k8 v5908 +k80 v80280 +k81 v17181 +k82 v55782 +k83 v84783 +k84 v77784 +k85 v73085 +k86 v98786 +k87 v11587 +k88 v64688 +k89 v49689 +k9 v3029 +k90 v12090 +k91 v68491 +k92 v37492 +k93 v6593 +k94 v37094 +k95 v17495 +k96 v82896 +k97 v86797 +k98 v75998 +k99 v70399 diff --git a/plugin/handler_socket/regtest/test_01_lib/test01.pl b/plugin/handler_socket/regtest/test_01_lib/test01.pl new file mode 100644 index 00000000..0a3ad9e9 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test01.pl @@ -0,0 +1,38 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for libmysql + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . $i; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $aref = $dbh->selectall_arrayref("select k,v from $table order by k"); +for my $row (@$aref) { + my ($k, $v) = @$row; + print "$k $v\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test02.expected b/plugin/handler_socket/regtest/test_01_lib/test02.expected new file mode 100644 index 00000000..37da3242 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test02.expected @@ -0,0 +1,100 @@ +k0 v1020 +k1 v6351 +k10 v70410 +k11 v75111 +k12 v36712 +k13 v40013 +k14 v39714 +k15 v17015 +k16 v71916 +k17 v73417 +k18 v58718 +k19 v49419 +k2 v8032 +k20 v52320 +k21 v95421 +k22 v43322 +k23 v82023 +k24 v28324 +k25 v83725 +k26 v20526 +k27 v41527 +k28 v54528 +k29 v58329 +k3 v9253 +k30 v5230 +k31 v32331 +k32 v61432 +k33 v67933 +k34 v80534 +k35 v45135 +k36 v11536 +k37 v26937 +k38 v21838 +k39 v61739 +k4 v7754 +k40 v87840 +k41 v34541 +k42 v51242 +k43 v96943 +k44 v40844 +k45 v29145 +k46 v85846 +k47 v95347 +k48 v71048 +k49 v14249 +k5 v5375 +k50 v68250 +k51 v93451 +k52 v62152 +k53 v96553 +k54 v57454 +k55 v20455 +k56 v29856 +k57 v13457 +k58 v98358 +k59 v44459 +k6 v5926 +k60 v14460 +k61 v15261 +k62 v18762 +k63 v21563 +k64 v864 +k65 v69765 +k66 v65166 +k67 v28067 +k68 v70168 +k69 v53769 +k7 v4147 +k70 v41370 +k71 v6971 +k72 v8672 +k73 v82273 +k74 v67074 +k75 v37075 +k76 v80676 +k77 v68877 +k78 v2678 +k79 v6679 +k8 v5908 +k80 v80280 +k81 v17181 +k82 v55782 +k83 v84783 +k84 v77784 +k85 v73085 +k86 v98786 +k87 v11587 +k88 v64688 +k89 v49689 +k9 v3029 +k90 v12090 +k91 v68491 +k92 v37492 +k93 v6593 +k94 v37094 +k95 v17495 +k96 v82896 +k97 v86797 +k98 v75998 +k99 v70399 diff --git a/plugin/handler_socket/regtest/test_01_lib/test02.pl b/plugin/handler_socket/regtest/test_01_lib/test02.pl new file mode 100644 index 00000000..f9bdc8b6 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test02.pl @@ -0,0 +1,49 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for '>=' + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . $i; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); +my $r = $hs->execute_single(1, '>=', [ '' ], 10000, 0); +shift(@$r); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = $r->[$i * 2]; + my $v = $r->[$i * 2 + 1]; + print "$k $v\n"; +} + +my $aref = $dbh->selectall_arrayref("select k,v from $table order by k"); +for my $row (@$aref) { + my ($k, $v) = @$row; + #print "$k $v\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test03.expected b/plugin/handler_socket/regtest/test_01_lib/test03.expected new file mode 100644 index 00000000..87b90cd0 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test03.expected @@ -0,0 +1,771 @@ +WR +0 0 +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 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +HS +0 0 +1 1 +10 10 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +11 11 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +12 12 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +13 13 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +14 14 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +15 15 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +16 16 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +17 17 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +18 18 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +19 19 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +2 2 +20 20 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +21 21 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +22 22 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +23 23 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +24 24 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +25 25 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +26 26 +27 27 +28 28 +29 29 +3 3 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +4 4 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +5 5 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +6 6 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +7 7 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +8 8 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +9 9 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +MY +0 0 +1 1 +10 10 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +11 11 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +12 12 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +13 13 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +14 14 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +15 15 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +16 16 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +17 17 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +18 18 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +19 19 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +2 2 +20 20 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +21 21 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +22 22 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +23 23 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +24 24 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +25 25 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +26 26 +27 27 +28 28 +29 29 +3 3 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +4 4 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +5 5 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +6 6 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +7 7 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +8 8 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +9 9 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 diff --git a/plugin/handler_socket/regtest/test_01_lib/test03.pl b/plugin/handler_socket/regtest/test_01_lib/test03.pl new file mode 100644 index 00000000..a51aaf3b --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test03.pl @@ -0,0 +1,61 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for binary cleanness (#1) + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 256; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb default charset = binary"); +srand(999); + +my %valmap = (); + +print "WR\n"; +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v = pack("C", $i); + my $vnum = unpack("C", $v); + print "$k $vnum\n"; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); +my $r = $hs->execute_single(1, '>=', [ '' ], 10000, 0); +shift(@$r); +print "HS\n"; +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = $r->[$i * 2]; + my $v = $r->[$i * 2 + 1]; + my $vnum = unpack("C", $v); + print "$k $vnum\n"; + print "MISMATCH\n" if ($k ne $vnum); + print "LEN\n" if (length($v) != 1); +} +undef $hs; + +print "MY\n"; +my $aref = $dbh->selectall_arrayref("select k,v from $table order by k"); +for my $row (@$aref) { + my ($k, $v) = @$row; + my $vnum = unpack("C", $v); + print "$k $vnum\n"; + print "MISMATCH\n" if ($k ne $vnum); + print "LEN\n" if (length($v) != 1); +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test04.expected b/plugin/handler_socket/regtest/test_01_lib/test04.expected Binary files differnew file mode 100644 index 00000000..ceeac438 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test04.expected diff --git a/plugin/handler_socket/regtest/test_01_lib/test04.pl b/plugin/handler_socket/regtest/test_01_lib/test04.pl new file mode 100644 index 00000000..d922b713 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test04.pl @@ -0,0 +1,63 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for binary cleanness (#2) + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 256; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb default charset = binary"); +srand(999); + +my %valmap = (); + +print "WR\n"; +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v = pack("C", $i); + my $vnum = unpack("C", $v); + print "$k $vnum\n"; + $sth->execute($k, "a" . $v . "a"); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); +my $r = $hs->execute_single(1, '>=', [ '' ], 10000, 0); +shift(@$r); +print "HS\n"; +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = $r->[$i * 2]; + my $v = $r->[$i * 2 + 1]; + my $len = length($v); + my $vnum = unpack("C", substr($v, 1, 1)); + print "$k $vnum $len [$v]\n"; + print "MISMATCH\n" if ($k ne $vnum); + print "LEN\n" if $len != 3; +} +undef $hs; + +print "MY\n"; +my $aref = $dbh->selectall_arrayref("select k,v from $table order by k"); +for my $row (@$aref) { + my ($k, $v) = @$row; + my $len = length($v); + my $vnum = unpack("C", substr($v, 1, 1)); + print "$k $vnum $len [$v]\n"; + print "MISMATCH\n" if ($k ne $vnum); + print "LEN\n" if $len != 3; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test05.expected b/plugin/handler_socket/regtest/test_01_lib/test05.expected new file mode 100644 index 00000000..6a86a446 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test05.expected @@ -0,0 +1,771 @@ +WR +0 [null] +1 1 +2 [null] +3 3 +4 [null] +5 5 +6 [null] +7 7 +8 [null] +9 9 +10 [null] +11 11 +12 [null] +13 13 +14 [null] +15 15 +16 [null] +17 17 +18 [null] +19 19 +20 [null] +21 21 +22 [null] +23 23 +24 [null] +25 25 +26 [null] +27 27 +28 [null] +29 29 +30 [null] +31 31 +32 [null] +33 33 +34 [null] +35 35 +36 [null] +37 37 +38 [null] +39 39 +40 [null] +41 41 +42 [null] +43 43 +44 [null] +45 45 +46 [null] +47 47 +48 [null] +49 49 +50 [null] +51 51 +52 [null] +53 53 +54 [null] +55 55 +56 [null] +57 57 +58 [null] +59 59 +60 [null] +61 61 +62 [null] +63 63 +64 [null] +65 65 +66 [null] +67 67 +68 [null] +69 69 +70 [null] +71 71 +72 [null] +73 73 +74 [null] +75 75 +76 [null] +77 77 +78 [null] +79 79 +80 [null] +81 81 +82 [null] +83 83 +84 [null] +85 85 +86 [null] +87 87 +88 [null] +89 89 +90 [null] +91 91 +92 [null] +93 93 +94 [null] +95 95 +96 [null] +97 97 +98 [null] +99 99 +100 [null] +101 101 +102 [null] +103 103 +104 [null] +105 105 +106 [null] +107 107 +108 [null] +109 109 +110 [null] +111 111 +112 [null] +113 113 +114 [null] +115 115 +116 [null] +117 117 +118 [null] +119 119 +120 [null] +121 121 +122 [null] +123 123 +124 [null] +125 125 +126 [null] +127 127 +128 [null] +129 129 +130 [null] +131 131 +132 [null] +133 133 +134 [null] +135 135 +136 [null] +137 137 +138 [null] +139 139 +140 [null] +141 141 +142 [null] +143 143 +144 [null] +145 145 +146 [null] +147 147 +148 [null] +149 149 +150 [null] +151 151 +152 [null] +153 153 +154 [null] +155 155 +156 [null] +157 157 +158 [null] +159 159 +160 [null] +161 161 +162 [null] +163 163 +164 [null] +165 165 +166 [null] +167 167 +168 [null] +169 169 +170 [null] +171 171 +172 [null] +173 173 +174 [null] +175 175 +176 [null] +177 177 +178 [null] +179 179 +180 [null] +181 181 +182 [null] +183 183 +184 [null] +185 185 +186 [null] +187 187 +188 [null] +189 189 +190 [null] +191 191 +192 [null] +193 193 +194 [null] +195 195 +196 [null] +197 197 +198 [null] +199 199 +200 [null] +201 201 +202 [null] +203 203 +204 [null] +205 205 +206 [null] +207 207 +208 [null] +209 209 +210 [null] +211 211 +212 [null] +213 213 +214 [null] +215 215 +216 [null] +217 217 +218 [null] +219 219 +220 [null] +221 221 +222 [null] +223 223 +224 [null] +225 225 +226 [null] +227 227 +228 [null] +229 229 +230 [null] +231 231 +232 [null] +233 233 +234 [null] +235 235 +236 [null] +237 237 +238 [null] +239 239 +240 [null] +241 241 +242 [null] +243 243 +244 [null] +245 245 +246 [null] +247 247 +248 [null] +249 249 +250 [null] +251 251 +252 [null] +253 253 +254 [null] +255 255 +HS +0 [null] +1 1 +10 [null] +100 [null] +101 101 +102 [null] +103 103 +104 [null] +105 105 +106 [null] +107 107 +108 [null] +109 109 +11 11 +110 [null] +111 111 +112 [null] +113 113 +114 [null] +115 115 +116 [null] +117 117 +118 [null] +119 119 +12 [null] +120 [null] +121 121 +122 [null] +123 123 +124 [null] +125 125 +126 [null] +127 127 +128 [null] +129 129 +13 13 +130 [null] +131 131 +132 [null] +133 133 +134 [null] +135 135 +136 [null] +137 137 +138 [null] +139 139 +14 [null] +140 [null] +141 141 +142 [null] +143 143 +144 [null] +145 145 +146 [null] +147 147 +148 [null] +149 149 +15 15 +150 [null] +151 151 +152 [null] +153 153 +154 [null] +155 155 +156 [null] +157 157 +158 [null] +159 159 +16 [null] +160 [null] +161 161 +162 [null] +163 163 +164 [null] +165 165 +166 [null] +167 167 +168 [null] +169 169 +17 17 +170 [null] +171 171 +172 [null] +173 173 +174 [null] +175 175 +176 [null] +177 177 +178 [null] +179 179 +18 [null] +180 [null] +181 181 +182 [null] +183 183 +184 [null] +185 185 +186 [null] +187 187 +188 [null] +189 189 +19 19 +190 [null] +191 191 +192 [null] +193 193 +194 [null] +195 195 +196 [null] +197 197 +198 [null] +199 199 +2 [null] +20 [null] +200 [null] +201 201 +202 [null] +203 203 +204 [null] +205 205 +206 [null] +207 207 +208 [null] +209 209 +21 21 +210 [null] +211 211 +212 [null] +213 213 +214 [null] +215 215 +216 [null] +217 217 +218 [null] +219 219 +22 [null] +220 [null] +221 221 +222 [null] +223 223 +224 [null] +225 225 +226 [null] +227 227 +228 [null] +229 229 +23 23 +230 [null] +231 231 +232 [null] +233 233 +234 [null] +235 235 +236 [null] +237 237 +238 [null] +239 239 +24 [null] +240 [null] +241 241 +242 [null] +243 243 +244 [null] +245 245 +246 [null] +247 247 +248 [null] +249 249 +25 25 +250 [null] +251 251 +252 [null] +253 253 +254 [null] +255 255 +26 [null] +27 27 +28 [null] +29 29 +3 3 +30 [null] +31 31 +32 [null] +33 33 +34 [null] +35 35 +36 [null] +37 37 +38 [null] +39 39 +4 [null] +40 [null] +41 41 +42 [null] +43 43 +44 [null] +45 45 +46 [null] +47 47 +48 [null] +49 49 +5 5 +50 [null] +51 51 +52 [null] +53 53 +54 [null] +55 55 +56 [null] +57 57 +58 [null] +59 59 +6 [null] +60 [null] +61 61 +62 [null] +63 63 +64 [null] +65 65 +66 [null] +67 67 +68 [null] +69 69 +7 7 +70 [null] +71 71 +72 [null] +73 73 +74 [null] +75 75 +76 [null] +77 77 +78 [null] +79 79 +8 [null] +80 [null] +81 81 +82 [null] +83 83 +84 [null] +85 85 +86 [null] +87 87 +88 [null] +89 89 +9 9 +90 [null] +91 91 +92 [null] +93 93 +94 [null] +95 95 +96 [null] +97 97 +98 [null] +99 99 +MY +0 [null] +1 1 +10 [null] +100 [null] +101 101 +102 [null] +103 103 +104 [null] +105 105 +106 [null] +107 107 +108 [null] +109 109 +11 11 +110 [null] +111 111 +112 [null] +113 113 +114 [null] +115 115 +116 [null] +117 117 +118 [null] +119 119 +12 [null] +120 [null] +121 121 +122 [null] +123 123 +124 [null] +125 125 +126 [null] +127 127 +128 [null] +129 129 +13 13 +130 [null] +131 131 +132 [null] +133 133 +134 [null] +135 135 +136 [null] +137 137 +138 [null] +139 139 +14 [null] +140 [null] +141 141 +142 [null] +143 143 +144 [null] +145 145 +146 [null] +147 147 +148 [null] +149 149 +15 15 +150 [null] +151 151 +152 [null] +153 153 +154 [null] +155 155 +156 [null] +157 157 +158 [null] +159 159 +16 [null] +160 [null] +161 161 +162 [null] +163 163 +164 [null] +165 165 +166 [null] +167 167 +168 [null] +169 169 +17 17 +170 [null] +171 171 +172 [null] +173 173 +174 [null] +175 175 +176 [null] +177 177 +178 [null] +179 179 +18 [null] +180 [null] +181 181 +182 [null] +183 183 +184 [null] +185 185 +186 [null] +187 187 +188 [null] +189 189 +19 19 +190 [null] +191 191 +192 [null] +193 193 +194 [null] +195 195 +196 [null] +197 197 +198 [null] +199 199 +2 [null] +20 [null] +200 [null] +201 201 +202 [null] +203 203 +204 [null] +205 205 +206 [null] +207 207 +208 [null] +209 209 +21 21 +210 [null] +211 211 +212 [null] +213 213 +214 [null] +215 215 +216 [null] +217 217 +218 [null] +219 219 +22 [null] +220 [null] +221 221 +222 [null] +223 223 +224 [null] +225 225 +226 [null] +227 227 +228 [null] +229 229 +23 23 +230 [null] +231 231 +232 [null] +233 233 +234 [null] +235 235 +236 [null] +237 237 +238 [null] +239 239 +24 [null] +240 [null] +241 241 +242 [null] +243 243 +244 [null] +245 245 +246 [null] +247 247 +248 [null] +249 249 +25 25 +250 [null] +251 251 +252 [null] +253 253 +254 [null] +255 255 +26 [null] +27 27 +28 [null] +29 29 +3 3 +30 [null] +31 31 +32 [null] +33 33 +34 [null] +35 35 +36 [null] +37 37 +38 [null] +39 39 +4 [null] +40 [null] +41 41 +42 [null] +43 43 +44 [null] +45 45 +46 [null] +47 47 +48 [null] +49 49 +5 5 +50 [null] +51 51 +52 [null] +53 53 +54 [null] +55 55 +56 [null] +57 57 +58 [null] +59 59 +6 [null] +60 [null] +61 61 +62 [null] +63 63 +64 [null] +65 65 +66 [null] +67 67 +68 [null] +69 69 +7 7 +70 [null] +71 71 +72 [null] +73 73 +74 [null] +75 75 +76 [null] +77 77 +78 [null] +79 79 +8 [null] +80 [null] +81 81 +82 [null] +83 83 +84 [null] +85 85 +86 [null] +87 87 +88 [null] +89 89 +9 9 +90 [null] +91 91 +92 [null] +93 93 +94 [null] +95 95 +96 [null] +97 97 +98 [null] +99 99 diff --git a/plugin/handler_socket/regtest/test_01_lib/test05.pl b/plugin/handler_socket/regtest/test_01_lib/test05.pl new file mode 100644 index 00000000..2993e7a9 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test05.pl @@ -0,0 +1,59 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for binary cleanness (#3) + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 256; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30)) " . + "engine = innodb default charset = binary"); +srand(999); + +my %valmap = (); + +print "WR\n"; +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v = ($i % 2 == 1) ? $i : undef; + $sth->execute($k, $v); + $v = "[null]" if !defined($v); + print "$k $v\n"; + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); +my $r = $hs->execute_single(1, '>=', [ '' ], 10000, 0); +shift(@$r); +print "HS\n"; +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = $r->[$i * 2]; + my $v = $r->[$i * 2 + 1]; + $v = "[null]" if !defined($v); + print "$k $v\n"; + print "MISMATCH\n" if ($valmap{$k} ne $v); +} +undef $hs; + +print "MY\n"; +my $aref = $dbh->selectall_arrayref("select k,v from $table order by k"); +for my $row (@$aref) { + my ($k, $v) = @$row; + $v = "[null]" if !defined($v); + print "$k $v\n"; + print "MISMATCH\n" if ($valmap{$k} ne $v); +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test06.expected b/plugin/handler_socket/regtest/test_01_lib/test06.expected new file mode 100644 index 00000000..b376c4af --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test06.expected @@ -0,0 +1,644 @@ +HSINSERTDUMP_TABLE +0 v1_0 v2_0 +1 v1_1 v2_1 +10 v1_10 v2_10 +100 v1_100 v2_100 +101 v1_101 v2_101 +102 v1_102 v2_102 +103 v1_103 v2_103 +104 v1_104 v2_104 +105 v1_105 v2_105 +106 v1_106 v2_106 +107 v1_107 v2_107 +108 v1_108 v2_108 +109 v1_109 v2_109 +11 v1_11 v2_11 +110 v1_110 v2_110 +111 v1_111 v2_111 +112 v1_112 v2_112 +113 v1_113 v2_113 +114 v1_114 v2_114 +115 v1_115 v2_115 +116 v1_116 v2_116 +117 v1_117 v2_117 +118 v1_118 v2_118 +119 v1_119 v2_119 +12 v1_12 v2_12 +120 v1_120 v2_120 +121 v1_121 v2_121 +122 v1_122 v2_122 +123 v1_123 v2_123 +124 v1_124 v2_124 +125 v1_125 v2_125 +126 v1_126 v2_126 +127 v1_127 v2_127 +128 v1_128 v2_128 +129 v1_129 v2_129 +13 v1_13 v2_13 +130 v1_130 v2_130 +131 v1_131 v2_131 +132 v1_132 v2_132 +133 v1_133 v2_133 +134 v1_134 v2_134 +135 v1_135 v2_135 +136 v1_136 v2_136 +137 v1_137 v2_137 +138 v1_138 v2_138 +139 v1_139 v2_139 +14 v1_14 v2_14 +140 v1_140 v2_140 +141 v1_141 v2_141 +142 v1_142 v2_142 +143 v1_143 v2_143 +144 v1_144 v2_144 +145 v1_145 v2_145 +146 v1_146 v2_146 +147 v1_147 v2_147 +148 v1_148 v2_148 +149 v1_149 v2_149 +15 v1_15 v2_15 +150 v1_150 v2_150 +151 v1_151 v2_151 +152 v1_152 v2_152 +153 v1_153 v2_153 +154 v1_154 v2_154 +155 v1_155 v2_155 +156 v1_156 v2_156 +157 v1_157 v2_157 +158 v1_158 v2_158 +159 v1_159 v2_159 +16 v1_16 v2_16 +160 v1_160 v2_160 +161 v1_161 v2_161 +162 v1_162 v2_162 +163 v1_163 v2_163 +164 v1_164 v2_164 +165 v1_165 v2_165 +166 v1_166 v2_166 +167 v1_167 v2_167 +168 v1_168 v2_168 +169 v1_169 v2_169 +17 v1_17 v2_17 +170 v1_170 v2_170 +171 v1_171 v2_171 +172 v1_172 v2_172 +173 v1_173 v2_173 +174 v1_174 v2_174 +175 v1_175 v2_175 +176 v1_176 v2_176 +177 v1_177 v2_177 +178 v1_178 v2_178 +179 v1_179 v2_179 +18 v1_18 v2_18 +180 v1_180 v2_180 +181 v1_181 v2_181 +182 v1_182 v2_182 +183 v1_183 v2_183 +184 v1_184 v2_184 +185 v1_185 v2_185 +186 v1_186 v2_186 +187 v1_187 v2_187 +188 v1_188 v2_188 +189 v1_189 v2_189 +19 v1_19 v2_19 +190 v1_190 v2_190 +191 v1_191 v2_191 +192 v1_192 v2_192 +193 v1_193 v2_193 +194 v1_194 v2_194 +195 v1_195 v2_195 +196 v1_196 v2_196 +197 v1_197 v2_197 +198 v1_198 v2_198 +199 v1_199 v2_199 +2 v1_2 v2_2 +20 v1_20 v2_20 +200 v1_200 v2_200 +201 v1_201 v2_201 +202 v1_202 v2_202 +203 v1_203 v2_203 +204 v1_204 v2_204 +205 v1_205 v2_205 +206 v1_206 v2_206 +207 v1_207 v2_207 +208 v1_208 v2_208 +209 v1_209 v2_209 +21 v1_21 v2_21 +210 v1_210 v2_210 +211 v1_211 v2_211 +212 v1_212 v2_212 +213 v1_213 v2_213 +214 v1_214 v2_214 +215 v1_215 v2_215 +216 v1_216 v2_216 +217 v1_217 v2_217 +218 v1_218 v2_218 +219 v1_219 v2_219 +22 v1_22 v2_22 +220 v1_220 v2_220 +221 v1_221 v2_221 +222 v1_222 v2_222 +223 v1_223 v2_223 +224 v1_224 v2_224 +225 v1_225 v2_225 +226 v1_226 v2_226 +227 v1_227 v2_227 +228 v1_228 v2_228 +229 v1_229 v2_229 +23 v1_23 v2_23 +230 v1_230 v2_230 +231 v1_231 v2_231 +232 v1_232 v2_232 +233 v1_233 v2_233 +234 v1_234 v2_234 +235 v1_235 v2_235 +236 v1_236 v2_236 +237 v1_237 v2_237 +238 v1_238 v2_238 +239 v1_239 v2_239 +24 v1_24 v2_24 +240 v1_240 v2_240 +241 v1_241 v2_241 +242 v1_242 v2_242 +243 v1_243 v2_243 +244 v1_244 v2_244 +245 v1_245 v2_245 +246 v1_246 v2_246 +247 v1_247 v2_247 +248 v1_248 v2_248 +249 v1_249 v2_249 +25 v1_25 v2_25 +250 v1_250 v2_250 +251 v1_251 v2_251 +252 v1_252 v2_252 +253 v1_253 v2_253 +254 v1_254 v2_254 +255 v1_255 v2_255 +26 v1_26 v2_26 +27 v1_27 v2_27 +28 v1_28 v2_28 +29 v1_29 v2_29 +3 v1_3 v2_3 +30 v1_30 v2_30 +31 v1_31 v2_31 +32 v1_32 v2_32 +33 v1_33 v2_33 +34 v1_34 v2_34 +35 v1_35 v2_35 +36 v1_36 v2_36 +37 v1_37 v2_37 +38 v1_38 v2_38 +39 v1_39 v2_39 +4 v1_4 v2_4 +40 v1_40 v2_40 +41 v1_41 v2_41 +42 v1_42 v2_42 +43 v1_43 v2_43 +44 v1_44 v2_44 +45 v1_45 v2_45 +46 v1_46 v2_46 +47 v1_47 v2_47 +48 v1_48 v2_48 +49 v1_49 v2_49 +5 v1_5 v2_5 +50 v1_50 v2_50 +51 v1_51 v2_51 +52 v1_52 v2_52 +53 v1_53 v2_53 +54 v1_54 v2_54 +55 v1_55 v2_55 +56 v1_56 v2_56 +57 v1_57 v2_57 +58 v1_58 v2_58 +59 v1_59 v2_59 +6 v1_6 v2_6 +60 v1_60 v2_60 +61 v1_61 v2_61 +62 v1_62 v2_62 +63 v1_63 v2_63 +64 v1_64 v2_64 +65 v1_65 v2_65 +66 v1_66 v2_66 +67 v1_67 v2_67 +68 v1_68 v2_68 +69 v1_69 v2_69 +7 v1_7 v2_7 +70 v1_70 v2_70 +71 v1_71 v2_71 +72 v1_72 v2_72 +73 v1_73 v2_73 +74 v1_74 v2_74 +75 v1_75 v2_75 +76 v1_76 v2_76 +77 v1_77 v2_77 +78 v1_78 v2_78 +79 v1_79 v2_79 +8 v1_8 v2_8 +80 v1_80 v2_80 +81 v1_81 v2_81 +82 v1_82 v2_82 +83 v1_83 v2_83 +84 v1_84 v2_84 +85 v1_85 v2_85 +86 v1_86 v2_86 +87 v1_87 v2_87 +88 v1_88 v2_88 +89 v1_89 v2_89 +9 v1_9 v2_9 +90 v1_90 v2_90 +91 v1_91 v2_91 +92 v1_92 v2_92 +93 v1_93 v2_93 +94 v1_94 v2_94 +95 v1_95 v2_95 +96 v1_96 v2_96 +97 v1_97 v2_97 +98 v1_98 v2_98 +99 v1_99 v2_99 +HSUPDATEDUMP_TABLE +0 mod_0 v2_0 +1 mod_1 v2_1 +10 mod_10 v2_10 +100 mod_100 v2_100 +101 mod_101 v2_101 +102 mod_102 v2_102 +103 mod_103 v2_103 +104 mod_104 v2_104 +105 mod_105 v2_105 +106 mod_106 v2_106 +107 mod_107 v2_107 +108 mod_108 v2_108 +109 mod_109 v2_109 +11 mod_11 v2_11 +110 mod_110 v2_110 +111 mod_111 v2_111 +112 mod_112 v2_112 +113 mod_113 v2_113 +114 mod_114 v2_114 +115 mod_115 v2_115 +116 mod_116 v2_116 +117 mod_117 v2_117 +118 mod_118 v2_118 +119 mod_119 v2_119 +12 mod_12 v2_12 +120 mod_120 v2_120 +121 mod_121 v2_121 +122 mod_122 v2_122 +123 mod_123 v2_123 +124 mod_124 v2_124 +125 mod_125 v2_125 +126 mod_126 v2_126 +127 mod_127 v2_127 +128 mod_128 v2_128 +129 mod_129 v2_129 +13 mod_13 v2_13 +130 mod_130 v2_130 +131 mod_131 v2_131 +132 mod_132 v2_132 +133 mod_133 v2_133 +134 mod_134 v2_134 +135 mod_135 v2_135 +136 mod_136 v2_136 +137 mod_137 v2_137 +138 mod_138 v2_138 +139 mod_139 v2_139 +14 mod_14 v2_14 +140 mod_140 v2_140 +141 mod_141 v2_141 +142 mod_142 v2_142 +143 mod_143 v2_143 +144 mod_144 v2_144 +145 mod_145 v2_145 +146 mod_146 v2_146 +147 mod_147 v2_147 +148 mod_148 v2_148 +149 mod_149 v2_149 +15 mod_15 v2_15 +150 mod_150 v2_150 +151 mod_151 v2_151 +152 mod_152 v2_152 +153 mod_153 v2_153 +154 mod_154 v2_154 +155 mod_155 v2_155 +156 mod_156 v2_156 +157 mod_157 v2_157 +158 mod_158 v2_158 +159 mod_159 v2_159 +16 mod_16 v2_16 +160 mod_160 v2_160 +161 mod_161 v2_161 +162 mod_162 v2_162 +163 mod_163 v2_163 +164 mod_164 v2_164 +165 mod_165 v2_165 +166 mod_166 v2_166 +167 mod_167 v2_167 +168 mod_168 v2_168 +169 mod_169 v2_169 +17 mod_17 v2_17 +170 mod_170 v2_170 +171 mod_171 v2_171 +172 mod_172 v2_172 +173 mod_173 v2_173 +174 mod_174 v2_174 +175 mod_175 v2_175 +176 mod_176 v2_176 +177 mod_177 v2_177 +178 mod_178 v2_178 +179 mod_179 v2_179 +18 mod_18 v2_18 +180 mod_180 v2_180 +181 mod_181 v2_181 +182 mod_182 v2_182 +183 mod_183 v2_183 +184 mod_184 v2_184 +185 mod_185 v2_185 +186 mod_186 v2_186 +187 mod_187 v2_187 +188 mod_188 v2_188 +189 mod_189 v2_189 +19 mod_19 v2_19 +190 mod_190 v2_190 +191 mod_191 v2_191 +192 mod_192 v2_192 +193 mod_193 v2_193 +194 mod_194 v2_194 +195 mod_195 v2_195 +196 mod_196 v2_196 +197 mod_197 v2_197 +198 mod_198 v2_198 +199 mod_199 v2_199 +2 mod_2 v2_2 +20 mod_20 v2_20 +200 mod_200 v2_200 +201 mod_201 v2_201 +202 mod_202 v2_202 +203 mod_203 v2_203 +204 mod_204 v2_204 +205 mod_205 v2_205 +206 mod_206 v2_206 +207 mod_207 v2_207 +208 mod_208 v2_208 +209 mod_209 v2_209 +21 mod_21 v2_21 +210 mod_210 v2_210 +211 mod_211 v2_211 +212 mod_212 v2_212 +213 mod_213 v2_213 +214 mod_214 v2_214 +215 mod_215 v2_215 +216 mod_216 v2_216 +217 mod_217 v2_217 +218 mod_218 v2_218 +219 mod_219 v2_219 +22 mod_22 v2_22 +220 mod_220 v2_220 +221 mod_221 v2_221 +222 mod_222 v2_222 +223 mod_223 v2_223 +224 mod_224 v2_224 +225 mod_225 v2_225 +226 mod_226 v2_226 +227 mod_227 v2_227 +228 mod_228 v2_228 +229 mod_229 v2_229 +23 mod_23 v2_23 +230 mod_230 v2_230 +231 mod_231 v2_231 +232 mod_232 v2_232 +233 mod_233 v2_233 +234 mod_234 v2_234 +235 mod_235 v2_235 +236 mod_236 v2_236 +237 mod_237 v2_237 +238 mod_238 v2_238 +239 mod_239 v2_239 +24 mod_24 v2_24 +240 mod_240 v2_240 +241 mod_241 v2_241 +242 mod_242 v2_242 +243 mod_243 v2_243 +244 mod_244 v2_244 +245 mod_245 v2_245 +246 mod_246 v2_246 +247 mod_247 v2_247 +248 mod_248 v2_248 +249 mod_249 v2_249 +25 mod_25 v2_25 +250 mod_250 v2_250 +251 mod_251 v2_251 +252 mod_252 v2_252 +253 mod_253 v2_253 +254 mod_254 v2_254 +255 mod_255 v2_255 +26 mod_26 v2_26 +27 mod_27 v2_27 +28 mod_28 v2_28 +29 mod_29 v2_29 +3 mod_3 v2_3 +30 mod_30 v2_30 +31 mod_31 v2_31 +32 mod_32 v2_32 +33 mod_33 v2_33 +34 mod_34 v2_34 +35 mod_35 v2_35 +36 mod_36 v2_36 +37 mod_37 v2_37 +38 mod_38 v2_38 +39 mod_39 v2_39 +4 mod_4 v2_4 +40 mod_40 v2_40 +41 mod_41 v2_41 +42 mod_42 v2_42 +43 mod_43 v2_43 +44 mod_44 v2_44 +45 mod_45 v2_45 +46 mod_46 v2_46 +47 mod_47 v2_47 +48 mod_48 v2_48 +49 mod_49 v2_49 +5 mod_5 v2_5 +50 mod_50 v2_50 +51 mod_51 v2_51 +52 mod_52 v2_52 +53 mod_53 v2_53 +54 mod_54 v2_54 +55 mod_55 v2_55 +56 mod_56 v2_56 +57 mod_57 v2_57 +58 mod_58 v2_58 +59 mod_59 v2_59 +6 mod_6 v2_6 +60 mod_60 v2_60 +61 mod_61 v2_61 +62 mod_62 v2_62 +63 mod_63 v2_63 +64 mod_64 v2_64 +65 mod_65 v2_65 +66 mod_66 v2_66 +67 mod_67 v2_67 +68 mod_68 v2_68 +69 mod_69 v2_69 +7 mod_7 v2_7 +70 mod_70 v2_70 +71 mod_71 v2_71 +72 mod_72 v2_72 +73 mod_73 v2_73 +74 mod_74 v2_74 +75 mod_75 v2_75 +76 mod_76 v2_76 +77 mod_77 v2_77 +78 mod_78 v2_78 +79 mod_79 v2_79 +8 mod_8 v2_8 +80 mod_80 v2_80 +81 mod_81 v2_81 +82 mod_82 v2_82 +83 mod_83 v2_83 +84 mod_84 v2_84 +85 mod_85 v2_85 +86 mod_86 v2_86 +87 mod_87 v2_87 +88 mod_88 v2_88 +89 mod_89 v2_89 +9 mod_9 v2_9 +90 mod_90 v2_90 +91 mod_91 v2_91 +92 mod_92 v2_92 +93 mod_93 v2_93 +94 mod_94 v2_94 +95 mod_95 v2_95 +96 mod_96 v2_96 +97 mod_97 v2_97 +98 mod_98 v2_98 +99 mod_99 v2_99 +HSDELETE +DUMP_TABLE +1 mod_1 v2_1 +101 mod_101 v2_101 +103 mod_103 v2_103 +105 mod_105 v2_105 +107 mod_107 v2_107 +109 mod_109 v2_109 +11 mod_11 v2_11 +111 mod_111 v2_111 +113 mod_113 v2_113 +115 mod_115 v2_115 +117 mod_117 v2_117 +119 mod_119 v2_119 +121 mod_121 v2_121 +123 mod_123 v2_123 +125 mod_125 v2_125 +127 mod_127 v2_127 +129 mod_129 v2_129 +13 mod_13 v2_13 +131 mod_131 v2_131 +133 mod_133 v2_133 +135 mod_135 v2_135 +137 mod_137 v2_137 +139 mod_139 v2_139 +141 mod_141 v2_141 +143 mod_143 v2_143 +145 mod_145 v2_145 +147 mod_147 v2_147 +149 mod_149 v2_149 +15 mod_15 v2_15 +151 mod_151 v2_151 +153 mod_153 v2_153 +155 mod_155 v2_155 +157 mod_157 v2_157 +159 mod_159 v2_159 +161 mod_161 v2_161 +163 mod_163 v2_163 +165 mod_165 v2_165 +167 mod_167 v2_167 +169 mod_169 v2_169 +17 mod_17 v2_17 +171 mod_171 v2_171 +173 mod_173 v2_173 +175 mod_175 v2_175 +177 mod_177 v2_177 +179 mod_179 v2_179 +181 mod_181 v2_181 +183 mod_183 v2_183 +185 mod_185 v2_185 +187 mod_187 v2_187 +189 mod_189 v2_189 +19 mod_19 v2_19 +191 mod_191 v2_191 +193 mod_193 v2_193 +195 mod_195 v2_195 +197 mod_197 v2_197 +199 mod_199 v2_199 +201 mod_201 v2_201 +203 mod_203 v2_203 +205 mod_205 v2_205 +207 mod_207 v2_207 +209 mod_209 v2_209 +21 mod_21 v2_21 +211 mod_211 v2_211 +213 mod_213 v2_213 +215 mod_215 v2_215 +217 mod_217 v2_217 +219 mod_219 v2_219 +221 mod_221 v2_221 +223 mod_223 v2_223 +225 mod_225 v2_225 +227 mod_227 v2_227 +229 mod_229 v2_229 +23 mod_23 v2_23 +231 mod_231 v2_231 +233 mod_233 v2_233 +235 mod_235 v2_235 +237 mod_237 v2_237 +239 mod_239 v2_239 +241 mod_241 v2_241 +243 mod_243 v2_243 +245 mod_245 v2_245 +247 mod_247 v2_247 +249 mod_249 v2_249 +25 mod_25 v2_25 +251 mod_251 v2_251 +253 mod_253 v2_253 +255 mod_255 v2_255 +27 mod_27 v2_27 +29 mod_29 v2_29 +3 mod_3 v2_3 +31 mod_31 v2_31 +33 mod_33 v2_33 +35 mod_35 v2_35 +37 mod_37 v2_37 +39 mod_39 v2_39 +41 mod_41 v2_41 +43 mod_43 v2_43 +45 mod_45 v2_45 +47 mod_47 v2_47 +49 mod_49 v2_49 +5 mod_5 v2_5 +51 mod_51 v2_51 +53 mod_53 v2_53 +55 mod_55 v2_55 +57 mod_57 v2_57 +59 mod_59 v2_59 +61 mod_61 v2_61 +63 mod_63 v2_63 +65 mod_65 v2_65 +67 mod_67 v2_67 +69 mod_69 v2_69 +7 mod_7 v2_7 +71 mod_71 v2_71 +73 mod_73 v2_73 +75 mod_75 v2_75 +77 mod_77 v2_77 +79 mod_79 v2_79 +81 mod_81 v2_81 +83 mod_83 v2_83 +85 mod_85 v2_85 +87 mod_87 v2_87 +89 mod_89 v2_89 +9 mod_9 v2_9 +91 mod_91 v2_91 +93 mod_93 v2_93 +95 mod_95 v2_95 +97 mod_97 v2_97 +99 mod_99 v2_99 diff --git a/plugin/handler_socket/regtest/test_01_lib/test06.pl b/plugin/handler_socket/regtest/test_01_lib/test06.pl new file mode 100644 index 00000000..69dd107e --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test06.pl @@ -0,0 +1,90 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for insert/update/delete + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 256; +$dbh->do( + "create table $table (" . + "k varchar(30) primary key, " . + "v1 varchar(30), " . + "v2 varchar(30)) " . + "engine = innodb default charset = binary"); +srand(999); + +my %valmap = (); + +print "HSINSERT"; +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v1 = "v1_" . $i; + my $v2 = "v2_" . $i; + my $r = $hs->execute_insert(1, [ $k, $v1, $v2 ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } +} +undef $hs; + +dump_table(); + +print "HSUPDATE"; +$hs = hstest::get_hs_connection(undef, 9999); +$dbname = $hstest::conf{dbname}; +$hs->open_index(2, $dbname, $table, '', 'v1'); +for (my $i = 0; $i < $tablesize; ++$i) { + my $r = $hs->execute_single(2, '=', [ $i ], 1000, 0, 'U', [ "mod_$i" ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } +} +undef $hs; + +dump_table(); + +print "HSDELETE\n"; +$hs = hstest::get_hs_connection(undef, 9999); +$dbname = $hstest::conf{dbname}; +$hs->open_index(3, $dbname, $table, '', ''); +for (my $i = 0; $i < $tablesize; $i = $i + 2) { + my $r = $hs->execute_single(3, '=', [ $i ], 1000, 0, 'D'); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } +} +undef $hs; + +dump_table(); + +sub dump_table { + print "DUMP_TABLE\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test07.expected b/plugin/handler_socket/regtest/test_01_lib/test07.expected new file mode 100644 index 00000000..f2047c2e --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test07.expected @@ -0,0 +1,304 @@ +MY +0 1v1020 2v6350 +1 1v8031 2v9251 +2 1v7752 2v5372 +3 [NULL] 2v4143 +4 1v5904 2v3024 +5 1v7045 2v7515 +6 1v3676 2v4006 +7 1v3977 2v1707 +8 1v7198 2v7348 +9 1v5879 2v4949 +10 1v52310 2v95410 +11 1v43311 2v82011 +12 1v28312 2v83712 +13 [NULL] 2v41513 +14 1v54514 2v58314 +15 1v5215 2v32315 +16 1v61416 2v67916 +17 1v80517 2v45117 +18 1v11518 2v26918 +19 1v21819 2v61719 +20 1v87820 2v34520 +21 1v51221 2v96921 +22 1v40822 2v29122 +23 [NULL] 2v95323 +24 1v71024 2v14224 +25 1v68225 2v93425 +26 1v62126 2v96526 +27 1v57427 2v20427 +28 1v29828 2v13428 +29 1v98329 2v44429 +30 1v14430 2v15230 +31 1v18731 2v21531 +32 1v832 2v69732 +33 [NULL] 2v28033 +34 1v70134 2v53734 +35 1v41335 2v6935 +36 1v8636 2v82236 +37 1v67037 2v37037 +38 1v80638 2v68838 +39 1v2639 2v6639 +40 1v80240 2v17140 +41 1v55741 2v84741 +42 1v77742 2v73042 +43 [NULL] 2v11543 +44 1v64644 2v49644 +45 1v12045 2v68445 +46 1v37446 2v6546 +47 1v37047 2v17447 +48 1v82848 2v86748 +49 1v75949 2v70349 +50 1v84350 2v94250 +51 1v40151 2v36251 +52 1v36752 2v30752 +53 [NULL] 2v16753 +54 1v79954 2v82954 +55 1v53955 2v37955 +56 1v56056 2v85856 +57 1v57957 2v2657 +58 1v88758 2v50758 +59 1v34559 2v89859 +60 1v43060 2v80160 +61 1v84561 2v32561 +62 1v62462 2v48062 +63 [NULL] 2v67663 +64 1v5364 2v73664 +65 1v80965 2v27065 +66 1v17566 2v83966 +67 1v6167 2v22267 +68 1v35868 2v50568 +69 1v62769 2v90669 +70 1v4670 2v98170 +71 1v11971 2v471 +72 1v1472 2v48072 +73 [NULL] 2v40573 +74 1v87574 2v63974 +75 1v82775 2v34475 +76 1v59876 2v56376 +77 1v77077 2v51677 +78 1v53878 2v54878 +79 1v35779 2v32279 +80 1v3680 2v37080 +81 1v33181 2v81581 +82 1v76982 2v66882 +83 [NULL] 2v28183 +84 1v69684 2v45284 +85 1v40685 2v185 +86 1v39586 2v32486 +87 1v3687 2v73887 +88 1v16088 2v7988 +89 1v75989 2v65789 +90 1v3190 2v78390 +91 1v65091 2v82491 +92 1v85292 2v6892 +93 [NULL] 2v54693 +94 1v81394 2v77594 +95 1v8795 2v69695 +96 1v19696 2v38096 +97 1v7997 2v75197 +98 1v32398 2v21798 +99 1v3799 2v70199 +HS +0 1v1020 2v6350 +1 1v8031 2v9251 +2 1v7752 2v5372 +3 [NULL] 2v4143 +4 1v5904 2v3024 +5 1v7045 2v7515 +6 1v3676 2v4006 +7 1v3977 2v1707 +8 1v7198 2v7348 +9 1v5879 2v4949 +10 1v52310 2v95410 +11 1v43311 2v82011 +12 1v28312 2v83712 +13 [NULL] 2v41513 +14 1v54514 2v58314 +15 1v5215 2v32315 +16 1v61416 2v67916 +17 1v80517 2v45117 +18 1v11518 2v26918 +19 1v21819 2v61719 +20 1v87820 2v34520 +21 1v51221 2v96921 +22 1v40822 2v29122 +23 [NULL] 2v95323 +24 1v71024 2v14224 +25 1v68225 2v93425 +26 1v62126 2v96526 +27 1v57427 2v20427 +28 1v29828 2v13428 +29 1v98329 2v44429 +30 1v14430 2v15230 +31 1v18731 2v21531 +32 1v832 2v69732 +33 [NULL] 2v28033 +34 1v70134 2v53734 +35 1v41335 2v6935 +36 1v8636 2v82236 +37 1v67037 2v37037 +38 1v80638 2v68838 +39 1v2639 2v6639 +40 1v80240 2v17140 +41 1v55741 2v84741 +42 1v77742 2v73042 +43 [NULL] 2v11543 +44 1v64644 2v49644 +45 1v12045 2v68445 +46 1v37446 2v6546 +47 1v37047 2v17447 +48 1v82848 2v86748 +49 1v75949 2v70349 +50 1v84350 2v94250 +51 1v40151 2v36251 +52 1v36752 2v30752 +53 [NULL] 2v16753 +54 1v79954 2v82954 +55 1v53955 2v37955 +56 1v56056 2v85856 +57 1v57957 2v2657 +58 1v88758 2v50758 +59 1v34559 2v89859 +60 1v43060 2v80160 +61 1v84561 2v32561 +62 1v62462 2v48062 +63 [NULL] 2v67663 +64 1v5364 2v73664 +65 1v80965 2v27065 +66 1v17566 2v83966 +67 1v6167 2v22267 +68 1v35868 2v50568 +69 1v62769 2v90669 +70 1v4670 2v98170 +71 1v11971 2v471 +72 1v1472 2v48072 +73 [NULL] 2v40573 +74 1v87574 2v63974 +75 1v82775 2v34475 +76 1v59876 2v56376 +77 1v77077 2v51677 +78 1v53878 2v54878 +79 1v35779 2v32279 +80 1v3680 2v37080 +81 1v33181 2v81581 +82 1v76982 2v66882 +83 [NULL] 2v28183 +84 1v69684 2v45284 +85 1v40685 2v185 +86 1v39586 2v32486 +87 1v3687 2v73887 +88 1v16088 2v7988 +89 1v75989 2v65789 +90 1v3190 2v78390 +91 1v65091 2v82491 +92 1v85292 2v6892 +93 [NULL] 2v54693 +94 1v81394 2v77594 +95 1v8795 2v69695 +96 1v19696 2v38096 +97 1v7997 2v75197 +98 1v32398 2v21798 +99 1v3799 2v70199 +2ndIDX +2ndidx 0 1v1020 => 0 1v1020 2v6350 +2ndidx 1 1v8031 => 1 1v8031 2v9251 +2ndidx 2 1v7752 => 2 1v7752 2v5372 +2ndidx 4 1v5904 => 4 1v5904 2v3024 +2ndidx 5 1v7045 => 5 1v7045 2v7515 +2ndidx 6 1v3676 => 6 1v3676 2v4006 +2ndidx 7 1v3977 => 7 1v3977 2v1707 +2ndidx 8 1v7198 => 8 1v7198 2v7348 +2ndidx 9 1v5879 => 9 1v5879 2v4949 +2ndidx 10 1v52310 => 10 1v52310 2v95410 +2ndidx 11 1v43311 => 11 1v43311 2v82011 +2ndidx 12 1v28312 => 12 1v28312 2v83712 +2ndidx 14 1v54514 => 14 1v54514 2v58314 +2ndidx 15 1v5215 => 15 1v5215 2v32315 +2ndidx 16 1v61416 => 16 1v61416 2v67916 +2ndidx 17 1v80517 => 17 1v80517 2v45117 +2ndidx 18 1v11518 => 18 1v11518 2v26918 +2ndidx 19 1v21819 => 19 1v21819 2v61719 +2ndidx 20 1v87820 => 20 1v87820 2v34520 +2ndidx 21 1v51221 => 21 1v51221 2v96921 +2ndidx 22 1v40822 => 22 1v40822 2v29122 +2ndidx 24 1v71024 => 24 1v71024 2v14224 +2ndidx 25 1v68225 => 25 1v68225 2v93425 +2ndidx 26 1v62126 => 26 1v62126 2v96526 +2ndidx 27 1v57427 => 27 1v57427 2v20427 +2ndidx 28 1v29828 => 28 1v29828 2v13428 +2ndidx 29 1v98329 => 29 1v98329 2v44429 +2ndidx 30 1v14430 => 30 1v14430 2v15230 +2ndidx 31 1v18731 => 31 1v18731 2v21531 +2ndidx 32 1v832 => 32 1v832 2v69732 +2ndidx 34 1v70134 => 34 1v70134 2v53734 +2ndidx 35 1v41335 => 35 1v41335 2v6935 +2ndidx 36 1v8636 => 36 1v8636 2v82236 +2ndidx 37 1v67037 => 37 1v67037 2v37037 +2ndidx 38 1v80638 => 38 1v80638 2v68838 +2ndidx 39 1v2639 => 39 1v2639 2v6639 +2ndidx 40 1v80240 => 40 1v80240 2v17140 +2ndidx 41 1v55741 => 41 1v55741 2v84741 +2ndidx 42 1v77742 => 42 1v77742 2v73042 +2ndidx 44 1v64644 => 44 1v64644 2v49644 +2ndidx 45 1v12045 => 45 1v12045 2v68445 +2ndidx 46 1v37446 => 46 1v37446 2v6546 +2ndidx 47 1v37047 => 47 1v37047 2v17447 +2ndidx 48 1v82848 => 48 1v82848 2v86748 +2ndidx 49 1v75949 => 49 1v75949 2v70349 +2ndidx 50 1v84350 => 50 1v84350 2v94250 +2ndidx 51 1v40151 => 51 1v40151 2v36251 +2ndidx 52 1v36752 => 52 1v36752 2v30752 +2ndidx 54 1v79954 => 54 1v79954 2v82954 +2ndidx 55 1v53955 => 55 1v53955 2v37955 +2ndidx 56 1v56056 => 56 1v56056 2v85856 +2ndidx 57 1v57957 => 57 1v57957 2v2657 +2ndidx 58 1v88758 => 58 1v88758 2v50758 +2ndidx 59 1v34559 => 59 1v34559 2v89859 +2ndidx 60 1v43060 => 60 1v43060 2v80160 +2ndidx 61 1v84561 => 61 1v84561 2v32561 +2ndidx 62 1v62462 => 62 1v62462 2v48062 +2ndidx 64 1v5364 => 64 1v5364 2v73664 +2ndidx 65 1v80965 => 65 1v80965 2v27065 +2ndidx 66 1v17566 => 66 1v17566 2v83966 +2ndidx 67 1v6167 => 67 1v6167 2v22267 +2ndidx 68 1v35868 => 68 1v35868 2v50568 +2ndidx 69 1v62769 => 69 1v62769 2v90669 +2ndidx 70 1v4670 => 70 1v4670 2v98170 +2ndidx 71 1v11971 => 71 1v11971 2v471 +2ndidx 72 1v1472 => 72 1v1472 2v48072 +2ndidx 74 1v87574 => 74 1v87574 2v63974 +2ndidx 75 1v82775 => 75 1v82775 2v34475 +2ndidx 76 1v59876 => 76 1v59876 2v56376 +2ndidx 77 1v77077 => 77 1v77077 2v51677 +2ndidx 78 1v53878 => 78 1v53878 2v54878 +2ndidx 79 1v35779 => 79 1v35779 2v32279 +2ndidx 80 1v3680 => 80 1v3680 2v37080 +2ndidx 81 1v33181 => 81 1v33181 2v81581 +2ndidx 82 1v76982 => 82 1v76982 2v66882 +2ndidx 84 1v69684 => 84 1v69684 2v45284 +2ndidx 85 1v40685 => 85 1v40685 2v185 +2ndidx 86 1v39586 => 86 1v39586 2v32486 +2ndidx 87 1v3687 => 87 1v3687 2v73887 +2ndidx 88 1v16088 => 88 1v16088 2v7988 +2ndidx 89 1v75989 => 89 1v75989 2v65789 +2ndidx 90 1v3190 => 90 1v3190 2v78390 +2ndidx 91 1v65091 => 91 1v65091 2v82491 +2ndidx 92 1v85292 => 92 1v85292 2v6892 +2ndidx 94 1v81394 => 94 1v81394 2v77594 +2ndidx 95 1v8795 => 95 1v8795 2v69695 +2ndidx 96 1v19696 => 96 1v19696 2v38096 +2ndidx 97 1v7997 => 97 1v7997 2v75197 +2ndidx 98 1v32398 => 98 1v32398 2v21798 +2ndidx 99 1v3799 => 99 1v3799 2v70199 +2ndIDX NULL +2ndidxnull 3 2v4143 +2ndidxnull 13 2v41513 +2ndidxnull 23 2v95323 +2ndidxnull 33 2v28033 +2ndidxnull 43 2v11543 +2ndidxnull 53 2v16753 +2ndidxnull 63 2v67663 +2ndidxnull 73 2v40573 +2ndidxnull 83 2v28183 +2ndidxnull 93 2v54693 diff --git a/plugin/handler_socket/regtest/test_01_lib/test07.pl b/plugin/handler_socket/regtest/test_01_lib/test07.pl new file mode 100644 index 00000000..2286aeba --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test07.pl @@ -0,0 +1,98 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for nulls + +BEGIN { + push @INC, "../common/"; +}; + +# use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (" . + "k int primary key, v1 varchar(30), v2 varchar(30), " . + "key idxv1 (v1) " . + ") engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v1 = "1v" . int(rand(1000)) . $i; + my $v2 = "2v" . int(rand(1000)) . $i; + if ($i % 10 == 3) { + $v1 = undef; + } + $sth->execute($k, $v1, $v2); + $valmap{$k} = $v1; +} + +print "MY\n"; +my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); +for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[NULL]" if (!defined($v1)); + print "$k $v1 $v2\n"; +} + +print "HS\n"; +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); +my $r = $hs->execute_single(1, '>=', [ '' ], 10000, 0); +shift(@$r); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = $r->[$i * 3]; + my $v1 = $r->[$i * 3 + 1]; + my $v2 = $r->[$i * 3 + 2]; + $v1 = "[NULL]" if (!defined($v1)); + print "$k $v1 $v2\n"; +} + +print "2ndIDX\n"; +$hs->open_index(2, $dbname, $table, 'idxv1', 'k,v1,v2'); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v1 = $valmap{$k}; + next if !defined($v1); + my $r = $hs->execute_single(2, '=', [ $v1 ], 1, 0); + shift(@$r); + my $r_k = $r->[0]; + my $r_v1 = $r->[1]; + my $r_v2 = $r->[2]; + print "2ndidx $k $v1 => $r_k $r_v1 $r_v2\n"; +} + +print "2ndIDX NULL\n"; +{ + my %rvals = (); + my $v1 = undef; + my @arr; + push(@arr, undef); + my $kv = \@arr; + my $r = $hs->execute_single(2, "=", $kv, 10000, 0); + shift(@$r); + for (my $i = 0; $i < scalar(@$r); $i += 3) { + my $k = $r->[$i]; + my $v1 = $r->[$i + 1]; + my $v2 = $r->[$i + 2]; + $rvals{$k} = [ $k, $v1, $v2 ]; + } + for my $i (sort { $a <=> $b } keys %rvals) { + my $rec = $rvals{$i}; + my $k = $rec->[0]; + my $v1 = $rec->[1]; + my $v2 = $rec->[2]; + print "2ndidxnull $k $v2\n"; + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test08.expected b/plugin/handler_socket/regtest/test_01_lib/test08.expected new file mode 100644 index 00000000..64d705da --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test08.expected @@ -0,0 +1,2 @@ +[0][k5][v5375] +[0] diff --git a/plugin/handler_socket/regtest/test_01_lib/test08.pl b/plugin/handler_socket/regtest/test_01_lib/test08.pl new file mode 100644 index 00000000..da736ef3 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test08.pl @@ -0,0 +1,48 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for not-found + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . $i; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); + +dump_rec($hs, 1, 'k5'); # found +dump_rec($hs, 1, 'k000000'); # notfound + +sub dump_rec { + my ($hs, $idxid, $key) = @_; + my $r = $hs->execute_single($idxid, '=', [ $key ], 1, 0); + for my $fld (@$r) { + print "[$fld]"; + } + print "\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test09.expected b/plugin/handler_socket/regtest/test_01_lib/test09.expected new file mode 100644 index 00000000..12cb1182 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test09.expected @@ -0,0 +1,12 @@ +DEL +[0][1] +[0][k50][v68250][k51][v93451] +DELINS +[0][k6][v5926][k60][v14460][k61][v15261] +[0][1] +[0] +[0][k6][v5926][k60][INS][k61][v15261] +DELUPUP +[0][k7][v4147][k70][v41370][k71][v6971] +[0][1] +[0][k7][v4147][k70][UP][k71][v6971] diff --git a/plugin/handler_socket/regtest/test_01_lib/test09.pl b/plugin/handler_socket/regtest/test_01_lib/test09.pl new file mode 100644 index 00000000..7d6165ec --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test09.pl @@ -0,0 +1,67 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for multiple modify requests + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . $i; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); + +exec_multi( + "DEL", + [ 1, '=', [ 'k5' ], 1, 0, 'D' ], + [ 1, '>=', [ 'k5' ], 2, 0 ], +); +exec_multi( + "DELINS", + [ 1, '>=', [ 'k6' ], 3, 0 ], + [ 1, '=', [ 'k60' ], 1, 0, 'D' ], + [ 1, '+', [ 'k60', 'INS' ] ], + [ 1, '>=', [ 'k6' ], 3, 0 ], +); +exec_multi( + "DELUPUP", + [ 1, '>=', [ 'k7' ], 3, 0 ], + [ 1, '=', [ 'k70' ], 1, 0, 'U', [ 'k70', 'UP' ] ], + [ 1, '>=', [ 'k7' ], 3, 0 ], +); + +sub exec_multi { + my $mess = shift(@_); + print "$mess\n"; + my $mres = $hs->execute_multi(\@_); + for my $res (@$mres) { + for my $fld (@$res) { + print "[$fld]"; + } + print "\n"; + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test10.expected b/plugin/handler_socket/regtest/test_01_lib/test10.expected new file mode 100644 index 00000000..6716abad --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test10.expected @@ -0,0 +1,771 @@ +HSINSERTDUMP_TABLE +0 v1_0 [null] +1 v1_1 [null] +10 v1_10 [null] +100 v1_100 [null] +101 v1_101 [null] +102 v1_102 [null] +103 v1_103 [null] +104 v1_104 [null] +105 v1_105 [null] +106 v1_106 [null] +107 v1_107 [null] +108 v1_108 [null] +109 v1_109 [null] +11 v1_11 [null] +110 v1_110 [null] +111 v1_111 [null] +112 v1_112 [null] +113 v1_113 [null] +114 v1_114 [null] +115 v1_115 [null] +116 v1_116 [null] +117 v1_117 [null] +118 v1_118 [null] +119 v1_119 [null] +12 v1_12 [null] +120 v1_120 [null] +121 v1_121 [null] +122 v1_122 [null] +123 v1_123 [null] +124 v1_124 [null] +125 v1_125 [null] +126 v1_126 [null] +127 v1_127 [null] +128 v1_128 [null] +129 v1_129 [null] +13 v1_13 [null] +130 v1_130 [null] +131 v1_131 [null] +132 v1_132 [null] +133 v1_133 [null] +134 v1_134 [null] +135 v1_135 [null] +136 v1_136 [null] +137 v1_137 [null] +138 v1_138 [null] +139 v1_139 [null] +14 v1_14 [null] +140 v1_140 [null] +141 v1_141 [null] +142 v1_142 [null] +143 v1_143 [null] +144 v1_144 [null] +145 v1_145 [null] +146 v1_146 [null] +147 v1_147 [null] +148 v1_148 [null] +149 v1_149 [null] +15 v1_15 [null] +150 v1_150 [null] +151 v1_151 [null] +152 v1_152 [null] +153 v1_153 [null] +154 v1_154 [null] +155 v1_155 [null] +156 v1_156 [null] +157 v1_157 [null] +158 v1_158 [null] +159 v1_159 [null] +16 v1_16 [null] +160 v1_160 [null] +161 v1_161 [null] +162 v1_162 [null] +163 v1_163 [null] +164 v1_164 [null] +165 v1_165 [null] +166 v1_166 [null] +167 v1_167 [null] +168 v1_168 [null] +169 v1_169 [null] +17 v1_17 [null] +170 v1_170 [null] +171 v1_171 [null] +172 v1_172 [null] +173 v1_173 [null] +174 v1_174 [null] +175 v1_175 [null] +176 v1_176 [null] +177 v1_177 [null] +178 v1_178 [null] +179 v1_179 [null] +18 v1_18 [null] +180 v1_180 [null] +181 v1_181 [null] +182 v1_182 [null] +183 v1_183 [null] +184 v1_184 [null] +185 v1_185 [null] +186 v1_186 [null] +187 v1_187 [null] +188 v1_188 [null] +189 v1_189 [null] +19 v1_19 [null] +190 v1_190 [null] +191 v1_191 [null] +192 v1_192 [null] +193 v1_193 [null] +194 v1_194 [null] +195 v1_195 [null] +196 v1_196 [null] +197 v1_197 [null] +198 v1_198 [null] +199 v1_199 [null] +2 v1_2 [null] +20 v1_20 [null] +200 v1_200 [null] +201 v1_201 [null] +202 v1_202 [null] +203 v1_203 [null] +204 v1_204 [null] +205 v1_205 [null] +206 v1_206 [null] +207 v1_207 [null] +208 v1_208 [null] +209 v1_209 [null] +21 v1_21 [null] +210 v1_210 [null] +211 v1_211 [null] +212 v1_212 [null] +213 v1_213 [null] +214 v1_214 [null] +215 v1_215 [null] +216 v1_216 [null] +217 v1_217 [null] +218 v1_218 [null] +219 v1_219 [null] +22 v1_22 [null] +220 v1_220 [null] +221 v1_221 [null] +222 v1_222 [null] +223 v1_223 [null] +224 v1_224 [null] +225 v1_225 [null] +226 v1_226 [null] +227 v1_227 [null] +228 v1_228 [null] +229 v1_229 [null] +23 v1_23 [null] +230 v1_230 [null] +231 v1_231 [null] +232 v1_232 [null] +233 v1_233 [null] +234 v1_234 [null] +235 v1_235 [null] +236 v1_236 [null] +237 v1_237 [null] +238 v1_238 [null] +239 v1_239 [null] +24 v1_24 [null] +240 v1_240 [null] +241 v1_241 [null] +242 v1_242 [null] +243 v1_243 [null] +244 v1_244 [null] +245 v1_245 [null] +246 v1_246 [null] +247 v1_247 [null] +248 v1_248 [null] +249 v1_249 [null] +25 v1_25 [null] +250 v1_250 [null] +251 v1_251 [null] +252 v1_252 [null] +253 v1_253 [null] +254 v1_254 [null] +255 v1_255 [null] +26 v1_26 [null] +27 v1_27 [null] +28 v1_28 [null] +29 v1_29 [null] +3 v1_3 [null] +30 v1_30 [null] +31 v1_31 [null] +32 v1_32 [null] +33 v1_33 [null] +34 v1_34 [null] +35 v1_35 [null] +36 v1_36 [null] +37 v1_37 [null] +38 v1_38 [null] +39 v1_39 [null] +4 v1_4 [null] +40 v1_40 [null] +41 v1_41 [null] +42 v1_42 [null] +43 v1_43 [null] +44 v1_44 [null] +45 v1_45 [null] +46 v1_46 [null] +47 v1_47 [null] +48 v1_48 [null] +49 v1_49 [null] +5 v1_5 [null] +50 v1_50 [null] +51 v1_51 [null] +52 v1_52 [null] +53 v1_53 [null] +54 v1_54 [null] +55 v1_55 [null] +56 v1_56 [null] +57 v1_57 [null] +58 v1_58 [null] +59 v1_59 [null] +6 v1_6 [null] +60 v1_60 [null] +61 v1_61 [null] +62 v1_62 [null] +63 v1_63 [null] +64 v1_64 [null] +65 v1_65 [null] +66 v1_66 [null] +67 v1_67 [null] +68 v1_68 [null] +69 v1_69 [null] +7 v1_7 [null] +70 v1_70 [null] +71 v1_71 [null] +72 v1_72 [null] +73 v1_73 [null] +74 v1_74 [null] +75 v1_75 [null] +76 v1_76 [null] +77 v1_77 [null] +78 v1_78 [null] +79 v1_79 [null] +8 v1_8 [null] +80 v1_80 [null] +81 v1_81 [null] +82 v1_82 [null] +83 v1_83 [null] +84 v1_84 [null] +85 v1_85 [null] +86 v1_86 [null] +87 v1_87 [null] +88 v1_88 [null] +89 v1_89 [null] +9 v1_9 [null] +90 v1_90 [null] +91 v1_91 [null] +92 v1_92 [null] +93 v1_93 [null] +94 v1_94 [null] +95 v1_95 [null] +96 v1_96 [null] +97 v1_97 [null] +98 v1_98 [null] +99 v1_99 [null] +HSUPDATEDUMP_TABLE +0 [null] [null] +1 [null] [null] +10 [null] [null] +100 [null] [null] +101 [null] [null] +102 [null] [null] +103 [null] [null] +104 [null] [null] +105 [null] [null] +106 [null] [null] +107 [null] [null] +108 [null] [null] +109 [null] [null] +11 [null] [null] +110 [null] [null] +111 [null] [null] +112 [null] [null] +113 [null] [null] +114 [null] [null] +115 [null] [null] +116 [null] [null] +117 [null] [null] +118 [null] [null] +119 [null] [null] +12 [null] [null] +120 [null] [null] +121 [null] [null] +122 [null] [null] +123 [null] [null] +124 [null] [null] +125 [null] [null] +126 [null] [null] +127 [null] [null] +128 [null] [null] +129 [null] [null] +13 [null] [null] +130 [null] [null] +131 [null] [null] +132 [null] [null] +133 [null] [null] +134 [null] [null] +135 [null] [null] +136 [null] [null] +137 [null] [null] +138 [null] [null] +139 [null] [null] +14 [null] [null] +140 [null] [null] +141 [null] [null] +142 [null] [null] +143 [null] [null] +144 [null] [null] +145 [null] [null] +146 [null] [null] +147 [null] [null] +148 [null] [null] +149 [null] [null] +15 [null] [null] +150 [null] [null] +151 [null] [null] +152 [null] [null] +153 [null] [null] +154 [null] [null] +155 [null] [null] +156 [null] [null] +157 [null] [null] +158 [null] [null] +159 [null] [null] +16 [null] [null] +160 [null] [null] +161 [null] [null] +162 [null] [null] +163 [null] [null] +164 [null] [null] +165 [null] [null] +166 [null] [null] +167 [null] [null] +168 [null] [null] +169 [null] [null] +17 [null] [null] +170 [null] [null] +171 [null] [null] +172 [null] [null] +173 [null] [null] +174 [null] [null] +175 [null] [null] +176 [null] [null] +177 [null] [null] +178 [null] [null] +179 [null] [null] +18 [null] [null] +180 [null] [null] +181 [null] [null] +182 [null] [null] +183 [null] [null] +184 [null] [null] +185 [null] [null] +186 [null] [null] +187 [null] [null] +188 [null] [null] +189 [null] [null] +19 [null] [null] +190 [null] [null] +191 [null] [null] +192 [null] [null] +193 [null] [null] +194 [null] [null] +195 [null] [null] +196 [null] [null] +197 [null] [null] +198 [null] [null] +199 [null] [null] +2 [null] [null] +20 [null] [null] +200 [null] [null] +201 [null] [null] +202 [null] [null] +203 [null] [null] +204 [null] [null] +205 [null] [null] +206 [null] [null] +207 [null] [null] +208 [null] [null] +209 [null] [null] +21 [null] [null] +210 [null] [null] +211 [null] [null] +212 [null] [null] +213 [null] [null] +214 [null] [null] +215 [null] [null] +216 [null] [null] +217 [null] [null] +218 [null] [null] +219 [null] [null] +22 [null] [null] +220 [null] [null] +221 [null] [null] +222 [null] [null] +223 [null] [null] +224 [null] [null] +225 [null] [null] +226 [null] [null] +227 [null] [null] +228 [null] [null] +229 [null] [null] +23 [null] [null] +230 [null] [null] +231 [null] [null] +232 [null] [null] +233 [null] [null] +234 [null] [null] +235 [null] [null] +236 [null] [null] +237 [null] [null] +238 [null] [null] +239 [null] [null] +24 [null] [null] +240 [null] [null] +241 [null] [null] +242 [null] [null] +243 [null] [null] +244 [null] [null] +245 [null] [null] +246 [null] [null] +247 [null] [null] +248 [null] [null] +249 [null] [null] +25 [null] [null] +250 [null] [null] +251 [null] [null] +252 [null] [null] +253 [null] [null] +254 [null] [null] +255 [null] [null] +26 [null] [null] +27 [null] [null] +28 [null] [null] +29 [null] [null] +3 [null] [null] +30 [null] [null] +31 [null] [null] +32 [null] [null] +33 [null] [null] +34 [null] [null] +35 [null] [null] +36 [null] [null] +37 [null] [null] +38 [null] [null] +39 [null] [null] +4 [null] [null] +40 [null] [null] +41 [null] [null] +42 [null] [null] +43 [null] [null] +44 [null] [null] +45 [null] [null] +46 [null] [null] +47 [null] [null] +48 [null] [null] +49 [null] [null] +5 [null] [null] +50 [null] [null] +51 [null] [null] +52 [null] [null] +53 [null] [null] +54 [null] [null] +55 [null] [null] +56 [null] [null] +57 [null] [null] +58 [null] [null] +59 [null] [null] +6 [null] [null] +60 [null] [null] +61 [null] [null] +62 [null] [null] +63 [null] [null] +64 [null] [null] +65 [null] [null] +66 [null] [null] +67 [null] [null] +68 [null] [null] +69 [null] [null] +7 [null] [null] +70 [null] [null] +71 [null] [null] +72 [null] [null] +73 [null] [null] +74 [null] [null] +75 [null] [null] +76 [null] [null] +77 [null] [null] +78 [null] [null] +79 [null] [null] +8 [null] [null] +80 [null] [null] +81 [null] [null] +82 [null] [null] +83 [null] [null] +84 [null] [null] +85 [null] [null] +86 [null] [null] +87 [null] [null] +88 [null] [null] +89 [null] [null] +9 [null] [null] +90 [null] [null] +91 [null] [null] +92 [null] [null] +93 [null] [null] +94 [null] [null] +95 [null] [null] +96 [null] [null] +97 [null] [null] +98 [null] [null] +99 [null] [null] +HSUPDATEDUMP_TABLE +0 hoge [null] +1 hoge [null] +10 hoge [null] +100 hoge [null] +101 hoge [null] +102 hoge [null] +103 hoge [null] +104 hoge [null] +105 hoge [null] +106 hoge [null] +107 hoge [null] +108 hoge [null] +109 hoge [null] +11 hoge [null] +110 hoge [null] +111 hoge [null] +112 hoge [null] +113 hoge [null] +114 hoge [null] +115 hoge [null] +116 hoge [null] +117 hoge [null] +118 hoge [null] +119 hoge [null] +12 hoge [null] +120 hoge [null] +121 hoge [null] +122 hoge [null] +123 hoge [null] +124 hoge [null] +125 hoge [null] +126 hoge [null] +127 hoge [null] +128 hoge [null] +129 hoge [null] +13 hoge [null] +130 hoge [null] +131 hoge [null] +132 hoge [null] +133 hoge [null] +134 hoge [null] +135 hoge [null] +136 hoge [null] +137 hoge [null] +138 hoge [null] +139 hoge [null] +14 hoge [null] +140 hoge [null] +141 hoge [null] +142 hoge [null] +143 hoge [null] +144 hoge [null] +145 hoge [null] +146 hoge [null] +147 hoge [null] +148 hoge [null] +149 hoge [null] +15 hoge [null] +150 hoge [null] +151 hoge [null] +152 hoge [null] +153 hoge [null] +154 hoge [null] +155 hoge [null] +156 hoge [null] +157 hoge [null] +158 hoge [null] +159 hoge [null] +16 hoge [null] +160 hoge [null] +161 hoge [null] +162 hoge [null] +163 hoge [null] +164 hoge [null] +165 hoge [null] +166 hoge [null] +167 hoge [null] +168 hoge [null] +169 hoge [null] +17 hoge [null] +170 hoge [null] +171 hoge [null] +172 hoge [null] +173 hoge [null] +174 hoge [null] +175 hoge [null] +176 hoge [null] +177 hoge [null] +178 hoge [null] +179 hoge [null] +18 hoge [null] +180 hoge [null] +181 hoge [null] +182 hoge [null] +183 hoge [null] +184 hoge [null] +185 hoge [null] +186 hoge [null] +187 hoge [null] +188 hoge [null] +189 hoge [null] +19 hoge [null] +190 hoge [null] +191 hoge [null] +192 hoge [null] +193 hoge [null] +194 hoge [null] +195 hoge [null] +196 hoge [null] +197 hoge [null] +198 hoge [null] +199 hoge [null] +2 hoge [null] +20 hoge [null] +200 hoge [null] +201 hoge [null] +202 hoge [null] +203 hoge [null] +204 hoge [null] +205 hoge [null] +206 hoge [null] +207 hoge [null] +208 hoge [null] +209 hoge [null] +21 hoge [null] +210 hoge [null] +211 hoge [null] +212 hoge [null] +213 hoge [null] +214 hoge [null] +215 hoge [null] +216 hoge [null] +217 hoge [null] +218 hoge [null] +219 hoge [null] +22 hoge [null] +220 hoge [null] +221 hoge [null] +222 hoge [null] +223 hoge [null] +224 hoge [null] +225 hoge [null] +226 hoge [null] +227 hoge [null] +228 hoge [null] +229 hoge [null] +23 hoge [null] +230 hoge [null] +231 hoge [null] +232 hoge [null] +233 hoge [null] +234 hoge [null] +235 hoge [null] +236 hoge [null] +237 hoge [null] +238 hoge [null] +239 hoge [null] +24 hoge [null] +240 hoge [null] +241 hoge [null] +242 hoge [null] +243 hoge [null] +244 hoge [null] +245 hoge [null] +246 hoge [null] +247 hoge [null] +248 hoge [null] +249 hoge [null] +25 hoge [null] +250 hoge [null] +251 hoge [null] +252 hoge [null] +253 hoge [null] +254 hoge [null] +255 hoge [null] +26 hoge [null] +27 hoge [null] +28 hoge [null] +29 hoge [null] +3 hoge [null] +30 hoge [null] +31 hoge [null] +32 hoge [null] +33 hoge [null] +34 hoge [null] +35 hoge [null] +36 hoge [null] +37 hoge [null] +38 hoge [null] +39 hoge [null] +4 hoge [null] +40 hoge [null] +41 hoge [null] +42 hoge [null] +43 hoge [null] +44 hoge [null] +45 hoge [null] +46 hoge [null] +47 hoge [null] +48 hoge [null] +49 hoge [null] +5 hoge [null] +50 hoge [null] +51 hoge [null] +52 hoge [null] +53 hoge [null] +54 hoge [null] +55 hoge [null] +56 hoge [null] +57 hoge [null] +58 hoge [null] +59 hoge [null] +6 hoge [null] +60 hoge [null] +61 hoge [null] +62 hoge [null] +63 hoge [null] +64 hoge [null] +65 hoge [null] +66 hoge [null] +67 hoge [null] +68 hoge [null] +69 hoge [null] +7 hoge [null] +70 hoge [null] +71 hoge [null] +72 hoge [null] +73 hoge [null] +74 hoge [null] +75 hoge [null] +76 hoge [null] +77 hoge [null] +78 hoge [null] +79 hoge [null] +8 hoge [null] +80 hoge [null] +81 hoge [null] +82 hoge [null] +83 hoge [null] +84 hoge [null] +85 hoge [null] +86 hoge [null] +87 hoge [null] +88 hoge [null] +89 hoge [null] +9 hoge [null] +90 hoge [null] +91 hoge [null] +92 hoge [null] +93 hoge [null] +94 hoge [null] +95 hoge [null] +96 hoge [null] +97 hoge [null] +98 hoge [null] +99 hoge [null] diff --git a/plugin/handler_socket/regtest/test_01_lib/test10.pl b/plugin/handler_socket/regtest/test_01_lib/test10.pl new file mode 100644 index 00000000..560976ba --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test10.pl @@ -0,0 +1,93 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for nulls + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 256; +$dbh->do( + "create table $table (" . + "k varchar(30) primary key, " . + "v1 varchar(30), " . + "v2 varchar(30)) " . + "engine = innodb default charset = binary"); +srand(999); + +my %valmap = (); + +# setting null +print "HSINSERT"; +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "" . $i; + my $v1 = "v1_" . $i; + my $v2 = undef; # null value + my $r = $hs->execute_insert(1, [ $k, $v1, $v2 ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } +} +undef $hs; + +dump_table(); + +# setting null +print "HSUPDATE"; +$hs = hstest::get_hs_connection(undef, 9999); +$dbname = $hstest::conf{dbname}; +$hs->open_index(2, $dbname, $table, '', 'v1'); +for (my $i = 0; $i < $tablesize; ++$i) { + my $r = $hs->execute_single(2, '=', [ $i ], 1000, 0, 'U', [ undef ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } +} +undef $hs; + +dump_table(); + +# setting non-null +print "HSUPDATE"; +$hs = hstest::get_hs_connection(undef, 9999); +$dbname = $hstest::conf{dbname}; +$hs->open_index(2, $dbname, $table, '', 'v1'); +for (my $i = 0; $i < $tablesize; ++$i) { + my $r = $hs->execute_single(2, '=', [ $i ], 1000, 0, 'U', [ "hoge" ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } +} +undef $hs; + +dump_table(); + +sub dump_table { + print "DUMP_TABLE\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test11.expected b/plugin/handler_socket/regtest/test_01_lib/test11.expected new file mode 100644 index 00000000..4359d470 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test11.expected @@ -0,0 +1,37 @@ +VAL +[0][k5][5] +[0][k6][6] +[0][k7][7] +[0][k8][8] +INCREMENT +[0][1] +[0][1] +[0][1] +[0][1] +VAL +[0][k5][8] +[0][k6][18] +[0][k7][-4] +[0][k8][-7] +DECREMENT +[0][1] +[0][0] +[0][1] +[0][0] +VAL +[0][k5][6] +[0][k6][18] +[0][k7][-84] +[0][k8][-7] +INCREMENT +[0][6] +[0][7] +[0][8] +[0][9] +[0][10] +[0][11] +[0][12] +[0][13] +[0][14] +VAL +[0][k5][15] diff --git a/plugin/handler_socket/regtest/test_01_lib/test11.pl b/plugin/handler_socket/regtest/test_01_lib/test11.pl new file mode 100644 index 00000000..cfaa9405 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test11.pl @@ -0,0 +1,112 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for increment/decrement + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = $i; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); +$hs->open_index(2, $dbname, $table, '', 'v'); + +exec_multi( + "VAL", + [ 1, '=', [ 'k5' ], 1, 0 ], + [ 1, '=', [ 'k6' ], 1, 0 ], + [ 1, '=', [ 'k7' ], 1, 0 ], + [ 1, '=', [ 'k8' ], 1, 0 ], +); +# 5, 6, 7, 8 + +exec_multi( + "INCREMENT", + [ 2, '=', [ 'k5' ], 1, 0, '+', [ 3 ] ], + [ 2, '=', [ 'k6' ], 1, 0, '+', [ 12 ] ], + [ 2, '=', [ 'k7' ], 1, 0, '+', [ -11 ] ], + [ 2, '=', [ 'k8' ], 1, 0, '+', [ -15 ] ], +); + +exec_multi( + "VAL", + [ 1, '=', [ 'k5' ], 1, 0 ], + [ 1, '=', [ 'k6' ], 1, 0 ], + [ 1, '=', [ 'k7' ], 1, 0 ], + [ 1, '=', [ 'k8' ], 1, 0 ], +); +# 8, 18, -4, -7 + +exec_multi( + "DECREMENT", + [ 2, '=', [ 'k5' ], 1, 0, '-', [ 2 ] ], + [ 2, '=', [ 'k6' ], 1, 0, '-', [ 24 ] ], + [ 2, '=', [ 'k7' ], 1, 0, '-', [ 80 ] ], + [ 2, '=', [ 'k8' ], 1, 0, '-', [ -80 ] ], +); +# mod, no, mod, no + +exec_multi( + "VAL", + [ 1, '=', [ 'k5' ], 1, 0 ], + [ 1, '=', [ 'k6' ], 1, 0 ], + [ 1, '=', [ 'k7' ], 1, 0 ], + [ 1, '=', [ 'k8' ], 1, 0 ], +); +# 6, 18, -84, -7 + +exec_multi( + "INCREMENT", + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], + [ 2, '=', [ 'k5' ], 1, 0, '+?', [ 1 ] ], +); + +exec_multi( + "VAL", + [ 1, '=', [ 'k5' ], 1, 0 ], +); +# 15 + +sub exec_multi { + my $mess = shift(@_); + print "$mess\n"; + my $mres = $hs->execute_multi(\@_); + for my $res (@$mres) { + for my $fld (@$res) { + print "[$fld]"; + } + print "\n"; + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test12.expected b/plugin/handler_socket/regtest/test_01_lib/test12.expected new file mode 100644 index 00000000..96002e79 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test12.expected @@ -0,0 +1,273 @@ +VAL +code=0 +[k1_0][k2_0][0][0] +[k1_0][k2_1][1][0] +[k1_0][k2_2][2][0] +[k1_0][k2_3][3][0] +[k1_0][k2_4][4][0] +[k1_0][k2_5][5][0] +[k1_0][k2_6][6][0] +[k1_0][k2_7][7][0] +[k1_0][k2_8][8][0] +[k1_0][k2_9][9][0] +[k1_1][k2_0][1][0] +[k1_1][k2_1][2][1] +[k1_1][k2_2][3][2] +[k1_1][k2_3][4][3] +[k1_1][k2_4][5][4] +[k1_1][k2_5][6][5] +[k1_1][k2_6][7][6] +[k1_1][k2_7][8][7] +[k1_1][k2_8][9][8] +[k1_1][k2_9][10][9] +[k1_2][k2_0][2][0] +[k1_2][k2_1][3][2] +[k1_2][k2_2][4][4] +[k1_2][k2_3][5][6] +[k1_2][k2_4][6][8] +[k1_2][k2_5][7][10] +[k1_2][k2_6][8][12] +[k1_2][k2_7][9][14] +[k1_2][k2_8][10][16] +[k1_2][k2_9][11][18] +[k1_3][k2_0][3][0] +[k1_3][k2_1][4][3] +[k1_3][k2_2][5][6] +[k1_3][k2_3][6][9] +[k1_3][k2_4][7][12] +[k1_3][k2_5][8][15] +[k1_3][k2_6][9][18] +[k1_3][k2_7][10][21] +[k1_3][k2_8][11][24] +[k1_3][k2_9][12][27] +[k1_4][k2_0][4][0] +[k1_4][k2_1][5][4] +[k1_4][k2_2][6][8] +[k1_4][k2_3][7][12] +[k1_4][k2_4][8][16] +[k1_4][k2_5][9][20] +[k1_4][k2_6][10][24] +[k1_4][k2_7][11][28] +[k1_4][k2_8][12][32] +[k1_4][k2_9][13][36] +[k1_5][k2_0][5][0] +[k1_5][k2_1][6][5] +[k1_5][k2_2][7][10] +[k1_5][k2_3][8][15] +[k1_5][k2_4][9][20] +[k1_5][k2_5][10][25] +[k1_5][k2_6][11][30] +[k1_5][k2_7][12][35] +[k1_5][k2_8][13][40] +[k1_5][k2_9][14][45] +[k1_6][k2_0][6][0] +[k1_6][k2_1][7][6] +[k1_6][k2_2][8][12] +[k1_6][k2_3][9][18] +[k1_6][k2_4][10][24] +[k1_6][k2_5][11][30] +[k1_6][k2_6][12][36] +[k1_6][k2_7][13][42] +[k1_6][k2_8][14][48] +[k1_6][k2_9][15][54] +[k1_7][k2_0][7][0] +[k1_7][k2_1][8][7] +[k1_7][k2_2][9][14] +[k1_7][k2_3][10][21] +[k1_7][k2_4][11][28] +[k1_7][k2_5][12][35] +[k1_7][k2_6][13][42] +[k1_7][k2_7][14][49] +[k1_7][k2_8][15][56] +[k1_7][k2_9][16][63] +[k1_8][k2_0][8][0] +[k1_8][k2_1][9][8] +[k1_8][k2_2][10][16] +[k1_8][k2_3][11][24] +[k1_8][k2_4][12][32] +[k1_8][k2_5][13][40] +[k1_8][k2_6][14][48] +[k1_8][k2_7][15][56] +[k1_8][k2_8][16][64] +[k1_8][k2_9][17][72] +[k1_9][k2_0][9][0] +[k1_9][k2_1][10][9] +[k1_9][k2_2][11][18] +[k1_9][k2_3][12][27] +[k1_9][k2_4][13][36] +[k1_9][k2_5][14][45] +[k1_9][k2_6][15][54] +[k1_9][k2_7][16][63] +[k1_9][k2_8][17][72] +[k1_9][k2_9][18][81] + +FILTER +code=0 +[k1_0][k2_5][5][0] +[k1_1][k2_5][6][5] +[k1_2][k2_5][7][10] +[k1_3][k2_5][8][15] +[k1_4][k2_5][9][20] +[k1_5][k2_5][10][25] +[k1_6][k2_5][11][30] +[k1_7][k2_5][12][35] +[k1_8][k2_5][13][40] +[k1_9][k2_5][14][45] + +FILTER +code=0 +[k1_0][k2_5][5][0] +[k1_1][k2_5][6][5] +[k1_2][k2_5][7][10] +[k1_3][k2_5][8][15] +[k1_4][k2_5][9][20] +[k1_5][k2_5][10][25] +[k1_6][k2_5][11][30] +[k1_7][k2_5][12][35] +[k1_8][k2_5][13][40] +[k1_9][k2_5][14][45] + +FILTER +code=0 +[k1_0][k2_3][3][0] +[k1_1][k2_2][3][2] +[k1_2][k2_1][3][2] +[k1_3][k2_0][3][0] + +FILTER +code=0 +[k1_1][k2_0][1][0] +[k1_1][k2_1][2][1] +[k1_1][k2_2][3][2] +[k1_1][k2_3][4][3] +[k1_1][k2_4][5][4] +[k1_1][k2_5][6][5] +[k1_1][k2_6][7][6] +[k1_1][k2_7][8][7] +[k1_1][k2_8][9][8] +[k1_1][k2_9][10][9] +[k1_2][k2_0][2][0] +[k1_2][k2_1][3][2] +[k1_2][k2_2][4][4] +[k1_2][k2_3][5][6] +[k1_2][k2_4][6][8] +[k1_2][k2_5][7][10] +[k1_2][k2_6][8][12] +[k1_2][k2_7][9][14] +[k1_2][k2_8][10][16] +[k1_2][k2_9][11][18] + +FILTER +code=0 +[k1_2][k2_5][7][10] +[k1_2][k2_6][8][12] +[k1_2][k2_7][9][14] +[k1_2][k2_8][10][16] +[k1_2][k2_9][11][18] + +FILTER +code=0 +[2] +VAL +code=0 +[k1_0][k2_0][0][0] +[k1_0][k2_1][1][0] +[k1_0][k2_2][2][0] +[k1_0][k2_3][3][0] +[k1_0][k2_4][4][0] +[k1_0][k2_5][5][0] +[k1_0][k2_6][6][0] +[k1_0][k2_7][7][0] +[k1_0][k2_8][8][0] +[k1_0][k2_9][9][0] +[k1_1][k2_0][1][0] +[k1_1][k2_1][2][1] +[k1_1][k2_2][3][2] +[k1_1][k2_3][4][3] +[k1_1][k2_4][5][4] +[k1_1][k2_5][6][5] +[k1_1][k2_6][7][6] +[k1_1][k2_7][8][7] +[k1_1][k2_8][9][8] +[k1_1][k2_9][10][9] +[k1_2][k2_0][2][0] +[k1_2][k2_1][3][2] +[k1_2][k2_2][4][4] +[k1_2][k2_3][5][6] +[k1_2][k2_4][6][8] +[k1_2][k2_5][-1][10] +[k1_2][k2_6][8][12] +[k1_2][k2_7][9][14] +[k1_2][k2_8][10][16] +[k1_2][k2_9][11][18] +[k1_3][k2_0][3][0] +[k1_3][k2_1][4][3] +[k1_3][k2_2][5][6] +[k1_3][k2_3][6][9] +[k1_3][k2_4][7][12] +[k1_3][k2_5][8][15] +[k1_3][k2_6][9][18] +[k1_3][k2_7][10][21] +[k1_3][k2_8][11][24] +[k1_3][k2_9][12][27] +[k1_4][k2_0][4][0] +[k1_4][k2_1][5][4] +[k1_4][k2_2][6][8] +[k1_4][k2_3][7][12] +[k1_4][k2_4][8][16] +[k1_4][k2_5][9][20] +[k1_4][k2_6][10][24] +[k1_4][k2_7][11][28] +[k1_4][k2_8][12][32] +[k1_4][k2_9][13][36] +[k1_5][k2_0][5][0] +[k1_5][k2_1][6][5] +[k1_5][k2_2][-1][10] +[k1_5][k2_3][8][15] +[k1_5][k2_4][9][20] +[k1_5][k2_5][10][25] +[k1_5][k2_6][11][30] +[k1_5][k2_7][12][35] +[k1_5][k2_8][13][40] +[k1_5][k2_9][14][45] +[k1_6][k2_0][6][0] +[k1_6][k2_1][7][6] +[k1_6][k2_2][8][12] +[k1_6][k2_3][9][18] +[k1_6][k2_4][10][24] +[k1_6][k2_5][11][30] +[k1_6][k2_6][12][36] +[k1_6][k2_7][13][42] +[k1_6][k2_8][14][48] +[k1_6][k2_9][15][54] +[k1_7][k2_0][7][0] +[k1_7][k2_1][8][7] +[k1_7][k2_2][9][14] +[k1_7][k2_3][10][21] +[k1_7][k2_4][11][28] +[k1_7][k2_5][12][35] +[k1_7][k2_6][13][42] +[k1_7][k2_7][14][49] +[k1_7][k2_8][15][56] +[k1_7][k2_9][16][63] +[k1_8][k2_0][8][0] +[k1_8][k2_1][9][8] +[k1_8][k2_2][10][16] +[k1_8][k2_3][11][24] +[k1_8][k2_4][12][32] +[k1_8][k2_5][13][40] +[k1_8][k2_6][14][48] +[k1_8][k2_7][15][56] +[k1_8][k2_8][16][64] +[k1_8][k2_9][17][72] +[k1_9][k2_0][9][0] +[k1_9][k2_1][10][9] +[k1_9][k2_2][11][18] +[k1_9][k2_3][12][27] +[k1_9][k2_4][13][36] +[k1_9][k2_5][14][45] +[k1_9][k2_6][15][54] +[k1_9][k2_7][16][63] +[k1_9][k2_8][17][72] +[k1_9][k2_9][18][81] + diff --git a/plugin/handler_socket/regtest/test_01_lib/test12.pl b/plugin/handler_socket/regtest/test_01_lib/test12.pl new file mode 100644 index 00000000..0cae3798 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test12.pl @@ -0,0 +1,134 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for filters + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 10; +$dbh->do( + "create table $table " . + "(k1 varchar(30) not null, k2 varchar(30) not null, " . + "v1 int not null, v2 int not null, " . + "primary key (k1, k2) ) engine = innodb"); +srand(999); + +my $sth = $dbh->prepare("insert into $table values (?,?,?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + for (my $j = 0; $j < $tablesize; ++$j) { + my $k1 = "k1_" . $i; + my $k2 = "k2_" . $j; + my $v1 = $i + $j; + my $v2 = $i * $j; + $sth->execute($k1, $k2, $v1, $v2); + } +} + +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k1,k2,v1,v2', 'k2'); +$hs->open_index(2, $dbname, $table, '', 'k1,k2,v1,v2', 'k1,k2,v1,v2'); +$hs->open_index(3, $dbname, $table, '', 'v1', 'k1,v2'); + +exec_multi( + 4, "VAL", + [ 1, '>=', [ '', '' ], 1000, 0 ], +); +# all + +# select k1, k2, v1, v2 ... where (k1, k2) >= ('', '') and k2 = 'k2_5' +exec_single( + 4, "FILTER", + [ 1, '>=', [ '', '' ], 1000, 0, undef, undef, [ [ 'F', '=', 0, 'k2_5' ] ] ] +); + +# same as above +exec_multi( + 4, "FILTER", + [ 1, '>=', [ '', '' ], 1000, 0, undef, undef, [ [ 'F', '=', 0, 'k2_5' ] ] ], +); + +# select k1, k2, v1, v2 ... where (k1, k2) >= ('', '') and v1 = 3 +exec_multi( + 4, "FILTER", + [ 2, '>=', [ '', '' ], 1000, 0, undef, undef, [ [ 'F', '=', 2, 3 ] ] ], +); + +# select k1, k2, v1, v2 ... where (k1, k2) >= ('k1_1', '') and k1 <= 'k1_2' +exec_multi( + 4, "FILTER", + [ 2, '>=', [ 'k1_1', '' ], 1000, 0, undef, undef, + [ [ 'W', '<=', 0, 'k1_2' ] ] ], +); + +# select k1, k2, v1, v2 ... where (k1, k2) >= ('k1_1', '') and k1 <= 'k1_2' +# and v2 >= 10 +exec_multi( + 4, "FILTER", + [ 2, '>=', [ 'k1_1', '' ], 1000, 0, undef, undef, + [ [ 'W', '<=', 0, 'k1_2' ], [ 'F', '>=', 3, 10 ] ] ], +); + +# update ... set v2 = -1 where (k1, k2) >= ('k1_3', '') and v2 = 10 +exec_multi( + 4, "FILTER", + [ 3, '>=', [ 'k1_1', '' ], 1000, 0, 'U', [ -1 ], + [ [ 'F', '=', 1, 10 ] ] ], +); + +exec_multi( + 4, "VAL", + [ 1, '>=', [ '', '' ], 1000, 0 ], +); +# all + +exit 0; + +sub exec_single { + my ($width, $mess, $req) = @_; + print "$mess\n"; + my $res = $hs->execute_single(@$req); + { + my $code = shift(@$res); + print "code=$code\n"; + my $i = 0; + for my $fld (@$res) { + print "[$fld]"; + if (++$i >= $width) { + print "\n"; + $i = 0; + } + } + print "\n"; + } +} + +sub exec_multi { + my $width = shift(@_); + my $mess = shift(@_); + print "$mess\n"; + my $mres = $hs->execute_multi(\@_); + for my $res (@$mres) { + my $code = shift(@$res); + print "code=$code\n"; + my $i = 0; + for my $fld (@$res) { + print "[$fld]"; + if (++$i >= $width) { + print "\n"; + $i = 0; + } + } + print "\n"; + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test13.expected b/plugin/handler_socket/regtest/test_01_lib/test13.expected new file mode 100644 index 00000000..3330382e --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test13.expected @@ -0,0 +1,92 @@ +HSINSERT +11 v1hs_0 +12 v1hs_1 +13 v1hs_2 +14 v1hs_3 +15 v1hs_4 +16 v1hs_5 +17 v1hs_6 +18 v1hs_7 +19 v1hs_8 +20 v1hs_9 +21 v1hs3_0 +22 v1hs3_0 +23 v1hs3_0 +24 v1hs3_1 +25 v1hs3_1 +26 v1hs3_1 +27 v1hs3_2 +28 v1hs3_2 +29 v1hs3_2 +30 v1hs3_3 +31 v1hs3_3 +32 v1hs3_3 +33 v1hs3_4 +34 v1hs3_4 +35 v1hs3_4 +36 v1hs3_5 +37 v1hs3_5 +38 v1hs3_5 +39 v1hs3_6 +40 v1hs3_6 +41 v1hs3_6 +42 v1hs3_7 +43 v1hs3_7 +44 v1hs3_7 +45 v1hs3_8 +46 v1hs3_8 +47 v1hs3_8 +48 v1hs3_9 +49 v1hs3_9 +50 v1hs3_9 +DUMP_TABLE +1 v1sql_0 v2sql_0 +2 v1sql_1 v2sql_1 +3 v1sql_2 v2sql_2 +4 v1sql_3 v2sql_3 +5 v1sql_4 v2sql_4 +6 v1sql_5 v2sql_5 +7 v1sql_6 v2sql_6 +8 v1sql_7 v2sql_7 +9 v1sql_8 v2sql_8 +10 v1sql_9 v2sql_9 +11 v1hs_0 v2hs_0 +12 v1hs_1 v2hs_1 +13 v1hs_2 v2hs_2 +14 v1hs_3 v2hs_3 +15 v1hs_4 v2hs_4 +16 v1hs_5 v2hs_5 +17 v1hs_6 v2hs_6 +18 v1hs_7 v2hs_7 +19 v1hs_8 v2hs_8 +20 v1hs_9 v2hs_9 +21 v1hs3_0 v2hs3_0 +22 v1hs3_0 v2hs3_0 +23 v1hs3_0 v2hs3_0 +24 v1hs3_1 v2hs3_1 +25 v1hs3_1 v2hs3_1 +26 v1hs3_1 v2hs3_1 +27 v1hs3_2 v2hs3_2 +28 v1hs3_2 v2hs3_2 +29 v1hs3_2 v2hs3_2 +30 v1hs3_3 v2hs3_3 +31 v1hs3_3 v2hs3_3 +32 v1hs3_3 v2hs3_3 +33 v1hs3_4 v2hs3_4 +34 v1hs3_4 v2hs3_4 +35 v1hs3_4 v2hs3_4 +36 v1hs3_5 v2hs3_5 +37 v1hs3_5 v2hs3_5 +38 v1hs3_5 v2hs3_5 +39 v1hs3_6 v2hs3_6 +40 v1hs3_6 v2hs3_6 +41 v1hs3_6 v2hs3_6 +42 v1hs3_7 v2hs3_7 +43 v1hs3_7 v2hs3_7 +44 v1hs3_7 v2hs3_7 +45 v1hs3_8 v2hs3_8 +46 v1hs3_8 v2hs3_8 +47 v1hs3_8 v2hs3_8 +48 v1hs3_9 v2hs3_9 +49 v1hs3_9 v2hs3_9 +50 v1hs3_9 v2hs3_9 diff --git a/plugin/handler_socket/regtest/test_01_lib/test13.pl b/plugin/handler_socket/regtest/test_01_lib/test13.pl new file mode 100644 index 00000000..2068c4bc --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test13.pl @@ -0,0 +1,92 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for auto_increment + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 10; +$dbh->do( + "create table $table (" . + "k int primary key auto_increment, " . + "v1 varchar(30), " . + "v2 varchar(30)) " . + "engine = myisam default charset = binary"); +srand(999); + +my $sth = $dbh->prepare("insert into $table values (?,?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = 0; + my $v1 = "v1sql_" . $i; + my $v2 = "v2sql_" . $i; + $sth->execute($k, $v1, $v2); +} + +my %valmap = (); + +print "HSINSERT\n"; +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); +# inserts with auto_increment +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = 0; + my $v1 = "v1hs_" . $i; + my $v2 = "v2hs_" . $i; + my $r = $hs->execute_insert(1, [ $k, $v1, $v2 ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } else { + my $id = $r->[1]; + print "$id $v1\n"; + } +} +# make sure that it works even when inserts are pipelined. these requests +# are possibly executed in a single transaction. +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = 0; + my $v1 = "v1hs3_" . $i; + my $v2 = "v2hs3_" . $i; + my $r = $hs->execute_multi([ + [ 1, '+', [$k, $v1, $v2] ], + [ 1, '+', [$k, $v1, $v2] ], + [ 1, '+', [$k, $v1, $v2] ], + ]); + for (my $i = 0; $i < 3; ++$i) { + my $err = $r->[$i]->[0]; + if ($err != 0) { + my $err_str = $r->[$i]->[1]; + print "$err $err_str\n"; + } else { + my $id = $r->[$i]->[1]; + print "$id $v1\n"; + } + } +} +undef $hs; + +dump_table(); + +sub dump_table { + print "DUMP_TABLE\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test14.expected b/plugin/handler_socket/regtest/test_01_lib/test14.expected new file mode 100644 index 00000000..00149dd9 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test14.expected @@ -0,0 +1,144 @@ +DUMP_TABLE +0 +1 0 A +2 01 AB +3 012 ABC +4 0123 ABCD +5 01234 ABCDE +6 012345 ABCDEF +7 0123456 ABCDEFG +8 01234567 ABCDEFGH +9 012345678 ABCDEFGHI +10 0123456789 ABCDEFGHIJ +11 01234567890 ABCDEFGHIJA +12 012345678901 ABCDEFGHIJAB +13 0123456789012 ABCDEFGHIJABC +14 01234567890123 ABCDEFGHIJABCD +15 012345678901234 ABCDEFGHIJABCDE +16 0123456789012345 ABCDEFGHIJABCDEF +17 01234567890123456 ABCDEFGHIJABCDEFG +18 012345678901234567 ABCDEFGHIJABCDEFGH +19 0123456789012345678 ABCDEFGHIJABCDEFGHI +20 01234567890123456789 ABCDEFGHIJABCDEFGHIJ +21 012345678901234567890 ABCDEFGHIJABCDEFGHIJA +22 0123456789012345678901 ABCDEFGHIJABCDEFGHIJAB +23 01234567890123456789012 ABCDEFGHIJABCDEFGHIJABC +24 012345678901234567890123 ABCDEFGHIJABCDEFGHIJABCD +25 0123456789012345678901234 ABCDEFGHIJABCDEFGHIJABCDE +26 01234567890123456789012345 ABCDEFGHIJABCDEFGHIJABCDEF +27 012345678901234567890123456 ABCDEFGHIJABCDEFGHIJABCDEFG +28 0123456789012345678901234567 ABCDEFGHIJABCDEFGHIJABCDEFGH +29 01234567890123456789012345678 ABCDEFGHIJABCDEFGHIJABCDEFGHI +30 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +31 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +32 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +33 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +34 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +35 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +36 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +37 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +38 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +39 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +40 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +41 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +42 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +43 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +44 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +45 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +46 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +47 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +48 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +49 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +PK 0 +I1 0 +I2 0 +PK 1 0 A +I1 1 0 A +I2 1 0 A +PK 2 01 AB +I1 2 01 AB +I2 2 01 AB +PK 3 012 ABC +I1 3 012 ABC +I2 3 012 ABC +PK 4 0123 ABCD +I1 4 0123 ABCD +I2 4 0123 ABCD +PK 5 01234 ABCDE +I1 5 01234 ABCDE +I2 5 01234 ABCDE +PK 6 012345 ABCDEF +I1 6 012345 ABCDEF +I2 6 012345 ABCDEF +PK 7 0123456 ABCDEFG +I1 7 0123456 ABCDEFG +I2 7 0123456 ABCDEFG +PK 8 01234567 ABCDEFGH +I1 8 01234567 ABCDEFGH +I2 8 01234567 ABCDEFGH +PK 9 012345678 ABCDEFGHI +I1 9 012345678 ABCDEFGHI +I2 9 012345678 ABCDEFGHI +PK 10 0123456789 ABCDEFGHIJ +I1 10 0123456789 ABCDEFGHIJ +I2 10 0123456789 ABCDEFGHIJ +PK 11 01234567890 ABCDEFGHIJA +I1 11 01234567890 ABCDEFGHIJA +I2 11 01234567890 ABCDEFGHIJA +PK 12 012345678901 ABCDEFGHIJAB +I1 12 012345678901 ABCDEFGHIJAB +I2 12 012345678901 ABCDEFGHIJAB +PK 13 0123456789012 ABCDEFGHIJABC +I1 13 0123456789012 ABCDEFGHIJABC +I2 13 0123456789012 ABCDEFGHIJABC +PK 14 01234567890123 ABCDEFGHIJABCD +I1 14 01234567890123 ABCDEFGHIJABCD +I2 14 01234567890123 ABCDEFGHIJABCD +PK 15 012345678901234 ABCDEFGHIJABCDE +I1 15 012345678901234 ABCDEFGHIJABCDE +I2 15 012345678901234 ABCDEFGHIJABCDE +PK 16 0123456789012345 ABCDEFGHIJABCDEF +I1 16 0123456789012345 ABCDEFGHIJABCDEF +I2 16 0123456789012345 ABCDEFGHIJABCDEF +PK 17 01234567890123456 ABCDEFGHIJABCDEFG +I1 17 01234567890123456 ABCDEFGHIJABCDEFG +I2 17 01234567890123456 ABCDEFGHIJABCDEFG +PK 18 012345678901234567 ABCDEFGHIJABCDEFGH +I1 18 012345678901234567 ABCDEFGHIJABCDEFGH +I2 18 012345678901234567 ABCDEFGHIJABCDEFGH +PK 19 0123456789012345678 ABCDEFGHIJABCDEFGHI +I1 19 0123456789012345678 ABCDEFGHIJABCDEFGHI +I2 19 0123456789012345678 ABCDEFGHIJABCDEFGHI +PK 20 01234567890123456789 ABCDEFGHIJABCDEFGHIJ +I1 20 01234567890123456789 ABCDEFGHIJABCDEFGHIJ +I2 20 01234567890123456789 ABCDEFGHIJABCDEFGHIJ +PK 21 012345678901234567890 ABCDEFGHIJABCDEFGHIJA +I1 21 012345678901234567890 ABCDEFGHIJABCDEFGHIJA +I2 21 012345678901234567890 ABCDEFGHIJABCDEFGHIJA +PK 22 0123456789012345678901 ABCDEFGHIJABCDEFGHIJAB +I1 22 0123456789012345678901 ABCDEFGHIJABCDEFGHIJAB +I2 22 0123456789012345678901 ABCDEFGHIJABCDEFGHIJAB +PK 23 01234567890123456789012 ABCDEFGHIJABCDEFGHIJABC +I1 23 01234567890123456789012 ABCDEFGHIJABCDEFGHIJABC +I2 23 01234567890123456789012 ABCDEFGHIJABCDEFGHIJABC +PK 24 012345678901234567890123 ABCDEFGHIJABCDEFGHIJABCD +I1 24 012345678901234567890123 ABCDEFGHIJABCDEFGHIJABCD +I2 24 012345678901234567890123 ABCDEFGHIJABCDEFGHIJABCD +PK 25 0123456789012345678901234 ABCDEFGHIJABCDEFGHIJABCDE +I1 25 0123456789012345678901234 ABCDEFGHIJABCDEFGHIJABCDE +I2 25 0123456789012345678901234 ABCDEFGHIJABCDEFGHIJABCDE +PK 26 01234567890123456789012345 ABCDEFGHIJABCDEFGHIJABCDEF +I1 26 01234567890123456789012345 ABCDEFGHIJABCDEFGHIJABCDEF +I2 26 01234567890123456789012345 ABCDEFGHIJABCDEFGHIJABCDEF +PK 27 012345678901234567890123456 ABCDEFGHIJABCDEFGHIJABCDEFG +I1 27 012345678901234567890123456 ABCDEFGHIJABCDEFGHIJABCDEFG +I2 27 012345678901234567890123456 ABCDEFGHIJABCDEFGHIJABCDEFG +PK 28 0123456789012345678901234567 ABCDEFGHIJABCDEFGHIJABCDEFGH +I1 28 0123456789012345678901234567 ABCDEFGHIJABCDEFGHIJABCDEFGH +I2 28 0123456789012345678901234567 ABCDEFGHIJABCDEFGHIJABCDEFGH +PK 29 01234567890123456789012345678 ABCDEFGHIJABCDEFGHIJABCDEFGHI +I1 29 01234567890123456789012345678 ABCDEFGHIJABCDEFGHIJABCDEFGHI +I2 29 01234567890123456789012345678 ABCDEFGHIJABCDEFGHIJABCDEFGHI +PK 30 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +I1 30 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ +I2 30 012345678901234567890123456789 ABCDEFGHIJABCDEFGHIJABCDEFGHIJ diff --git a/plugin/handler_socket/regtest/test_01_lib/test14.pl b/plugin/handler_socket/regtest/test_01_lib/test14.pl new file mode 100644 index 00000000..ab890733 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test14.pl @@ -0,0 +1,80 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for bugfix: commit/c88efe637f6a184b55d2bd8d060bda3e556572d8 +# (some trailing bytes were dropped for varlen or nullable key fields) + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 50; +$dbh->do( + "create table $table (" . + "k int primary key, " . + "v1 varchar(30), " . + "v2 varchar(30), " . + "index i1(v1), index i2(v2, v1)) " . + "engine = myisam default charset = binary"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert ignore into $table values (?,?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = $i; + my ($s1, $s2) = ("", ""); + for (my $j = 0; $j < $i; ++$j) { + $s1 .= chr(48 + $j % 10); + $s2 .= chr(65 + $j % 10); + } + my $v1 = $s1; + my $v2 = $s2; + $sth->execute($k, $v1, $v2); + $valmap{$k} = [ $v1, $v2 ]; +} + +dump_table(); + +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); +$hs->open_index(2, $dbname, $table, 'i1', 'k,v1,v2'); +$hs->open_index(3, $dbname, $table, 'i2', 'k,v1,v2'); + +for (my $i = 0; $i <= 30; ++$i) { + my ($v1, $v2) = @{$valmap{$i}}; + my ($rk, $rv1, $rv2); + my $r = $hs->execute_single(1, '=', [ $i ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "PK $rk $rv1 $rv2\n"; + $r = $hs->execute_single(2, '=', [ $v1 ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I1 $rk $rv1 $rv2\n"; + $r = $hs->execute_single(3, '=', [ $v2, $v1 ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I2 $rk $rv1 $rv2\n"; +} + +sub dump_table { + print "DUMP_TABLE\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test15.expected b/plugin/handler_socket/regtest/test_01_lib/test15.expected new file mode 100644 index 00000000..ea15afef --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test15.expected @@ -0,0 +1,764 @@ +TYPE TINYINT +DUMP_TABLE_BEGIN +-128 s-128 -128 +-42 s-42 -42 +-14 s-14 -14 +-4 s-4 -4 +-1 s-1 -1 +0 s0 0 +1 s1 1 +4 s4 4 +14 s14 14 +42 s42 42 +127 s127 127 +DUMP_TABLE_END +PK[-128] -128 s-128 -128 +I1[s-128] -128 s-128 -128 +I2[-128, s-128] -128 s-128 -128 +I2p[-128] -128 s-128 -128 +PK[-42] -42 s-42 -42 +I1[s-42] -42 s-42 -42 +I2[-42, s-42] -42 s-42 -42 +I2p[-42] -42 s-42 -42 +PK[-14] -14 s-14 -14 +I1[s-14] -14 s-14 -14 +I2[-14, s-14] -14 s-14 -14 +I2p[-14] -14 s-14 -14 +PK[-4] -4 s-4 -4 +I1[s-4] -4 s-4 -4 +I2[-4, s-4] -4 s-4 -4 +I2p[-4] -4 s-4 -4 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[4] 4 s4 4 +I1[s4] 4 s4 4 +I2[4, s4] 4 s4 4 +I2p[4] 4 s4 4 +PK[14] 14 s14 14 +I1[s14] 14 s14 14 +I2[14, s14] 14 s14 14 +I2p[14] 14 s14 14 +PK[42] 42 s42 42 +I1[s42] 42 s42 42 +I2[42, s42] 42 s42 42 +I2p[42] 42 s42 42 +PK[127] 127 s127 127 +I1[s127] 127 s127 127 +I2[127, s127] 127 s127 127 +I2p[127] 127 s127 127 + +TYPE TINYINT UNSIGNED +DUMP_TABLE_BEGIN +0 s0 0 +1 s1 1 +3 s3 3 +9 s9 9 +28 s28 28 +85 s85 85 +255 s255 255 +DUMP_TABLE_END +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[3] 3 s3 3 +I1[s3] 3 s3 3 +I2[3, s3] 3 s3 3 +I2p[3] 3 s3 3 +PK[9] 9 s9 9 +I1[s9] 9 s9 9 +I2[9, s9] 9 s9 9 +I2p[9] 9 s9 9 +PK[28] 28 s28 28 +I1[s28] 28 s28 28 +I2[28, s28] 28 s28 28 +I2p[28] 28 s28 28 +PK[85] 85 s85 85 +I1[s85] 85 s85 85 +I2[85, s85] 85 s85 85 +I2p[85] 85 s85 85 +PK[255] 255 s255 255 +I1[s255] 255 s255 255 +I2[255, s255] 255 s255 255 +I2p[255] 255 s255 255 + +TYPE SMALLINT +DUMP_TABLE_BEGIN +-32768 s-32768 -32768 +-10922 s-10922 -10922 +-3640 s-3640 -3640 +-1213 s-1213 -1213 +-404 s-404 -404 +-134 s-134 -134 +-1 s-1 -1 +0 s0 0 +1 s1 1 +134 s134 134 +404 s404 404 +1213 s1213 1213 +3640 s3640 3640 +10922 s10922 10922 +32767 s32768 32767 +DUMP_TABLE_END +PK[-32768] -32768 s-32768 -32768 +I1[s-32768] -32768 s-32768 -32768 +I2[-32768, s-32768] -32768 s-32768 -32768 +I2p[-32768] -32768 s-32768 -32768 +PK[-10922] -10922 s-10922 -10922 +I1[s-10922] -10922 s-10922 -10922 +I2[-10922, s-10922] -10922 s-10922 -10922 +I2p[-10922] -10922 s-10922 -10922 +PK[-3640] -3640 s-3640 -3640 +I1[s-3640] -3640 s-3640 -3640 +I2[-3640, s-3640] -3640 s-3640 -3640 +I2p[-3640] -3640 s-3640 -3640 +PK[-1213] -1213 s-1213 -1213 +I1[s-1213] -1213 s-1213 -1213 +I2[-1213, s-1213] -1213 s-1213 -1213 +I2p[-1213] -1213 s-1213 -1213 +PK[-404] -404 s-404 -404 +I1[s-404] -404 s-404 -404 +I2[-404, s-404] -404 s-404 -404 +I2p[-404] -404 s-404 -404 +PK[-134] -134 s-134 -134 +I1[s-134] -134 s-134 -134 +I2[-134, s-134] -134 s-134 -134 +I2p[-134] -134 s-134 -134 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[134] 134 s134 134 +I1[s134] 134 s134 134 +I2[134, s134] 134 s134 134 +I2p[134] 134 s134 134 +PK[404] 404 s404 404 +I1[s404] 404 s404 404 +I2[404, s404] 404 s404 404 +I2p[404] 404 s404 404 +PK[1213] 1213 s1213 1213 +I1[s1213] 1213 s1213 1213 +I2[1213, s1213] 1213 s1213 1213 +I2p[1213] 1213 s1213 1213 +PK[3640] 3640 s3640 3640 +I1[s3640] 3640 s3640 3640 +I2[3640, s3640] 3640 s3640 3640 +I2p[3640] 3640 s3640 3640 +PK[10922] 10922 s10922 10922 +I1[s10922] 10922 s10922 10922 +I2[10922, s10922] 10922 s10922 10922 +I2p[10922] 10922 s10922 10922 +PK[32768] 32767 s32768 32767 +I1[s32768] 32767 s32768 32767 +I2[32768, s32768] 32767 s32768 32767 +I2p[32768] 32767 s32768 32767 + +TYPE SMALLINT UNSIGNED +DUMP_TABLE_BEGIN +0 s0 0 +1 s1 1 +269 s269 269 +809 s809 809 +2427 s2427 2427 +7281 s7281 7281 +21845 s21845 21845 +65535 s65535 65535 +DUMP_TABLE_END +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[269] 269 s269 269 +I1[s269] 269 s269 269 +I2[269, s269] 269 s269 269 +I2p[269] 269 s269 269 +PK[809] 809 s809 809 +I1[s809] 809 s809 809 +I2[809, s809] 809 s809 809 +I2p[809] 809 s809 809 +PK[2427] 2427 s2427 2427 +I1[s2427] 2427 s2427 2427 +I2[2427, s2427] 2427 s2427 2427 +I2p[2427] 2427 s2427 2427 +PK[7281] 7281 s7281 7281 +I1[s7281] 7281 s7281 7281 +I2[7281, s7281] 7281 s7281 7281 +I2p[7281] 7281 s7281 7281 +PK[21845] 21845 s21845 21845 +I1[s21845] 21845 s21845 21845 +I2[21845, s21845] 21845 s21845 21845 +I2p[21845] 21845 s21845 21845 +PK[65535] 65535 s65535 65535 +I1[s65535] 65535 s65535 65535 +I2[65535, s65535] 65535 s65535 65535 +I2p[65535] 65535 s65535 65535 + +TYPE MEDIUMINT +DUMP_TABLE_BEGIN +-8388608 s-8388608 -8388608 +-2796202 s-2796202 -2796202 +-932067 s-932067 -932067 +-310689 s-310689 -310689 +-103563 s-103563 -103563 +-34521 s-34521 -34521 +-1 s-1 -1 +0 s0 0 +1 s1 1 +34521 s34521 34521 +103563 s103563 103563 +310689 s310689 310689 +932067 s932067 932067 +2796202 s2796202 2796202 +8388607 s8388607 8388607 +DUMP_TABLE_END +PK[-8388608] -8388608 s-8388608 -8388608 +I1[s-8388608] -8388608 s-8388608 -8388608 +I2[-8388608, s-8388608] -8388608 s-8388608 -8388608 +I2p[-8388608] -8388608 s-8388608 -8388608 +PK[-2796202] -2796202 s-2796202 -2796202 +I1[s-2796202] -2796202 s-2796202 -2796202 +I2[-2796202, s-2796202] -2796202 s-2796202 -2796202 +I2p[-2796202] -2796202 s-2796202 -2796202 +PK[-932067] -932067 s-932067 -932067 +I1[s-932067] -932067 s-932067 -932067 +I2[-932067, s-932067] -932067 s-932067 -932067 +I2p[-932067] -932067 s-932067 -932067 +PK[-310689] -310689 s-310689 -310689 +I1[s-310689] -310689 s-310689 -310689 +I2[-310689, s-310689] -310689 s-310689 -310689 +I2p[-310689] -310689 s-310689 -310689 +PK[-103563] -103563 s-103563 -103563 +I1[s-103563] -103563 s-103563 -103563 +I2[-103563, s-103563] -103563 s-103563 -103563 +I2p[-103563] -103563 s-103563 -103563 +PK[-34521] -34521 s-34521 -34521 +I1[s-34521] -34521 s-34521 -34521 +I2[-34521, s-34521] -34521 s-34521 -34521 +I2p[-34521] -34521 s-34521 -34521 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[34521] 34521 s34521 34521 +I1[s34521] 34521 s34521 34521 +I2[34521, s34521] 34521 s34521 34521 +I2p[34521] 34521 s34521 34521 +PK[103563] 103563 s103563 103563 +I1[s103563] 103563 s103563 103563 +I2[103563, s103563] 103563 s103563 103563 +I2p[103563] 103563 s103563 103563 +PK[310689] 310689 s310689 310689 +I1[s310689] 310689 s310689 310689 +I2[310689, s310689] 310689 s310689 310689 +I2p[310689] 310689 s310689 310689 +PK[932067] 932067 s932067 932067 +I1[s932067] 932067 s932067 932067 +I2[932067, s932067] 932067 s932067 932067 +I2p[932067] 932067 s932067 932067 +PK[2796202] 2796202 s2796202 2796202 +I1[s2796202] 2796202 s2796202 2796202 +I2[2796202, s2796202] 2796202 s2796202 2796202 +I2p[2796202] 2796202 s2796202 2796202 +PK[8388607] 8388607 s8388607 8388607 +I1[s8388607] 8388607 s8388607 8388607 +I2[8388607, s8388607] 8388607 s8388607 8388607 +I2p[8388607] 8388607 s8388607 8388607 + +TYPE MEDIUMINT UNSIGNED +DUMP_TABLE_BEGIN +0 s0 0 +1 s1 1 +69042 s69042 69042 +207126 s207126 207126 +621378 s621378 621378 +1864135 s1864135 1864135 +5592405 s5592405 5592405 +16777215 s16777215 16777215 +DUMP_TABLE_END +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[69042] 69042 s69042 69042 +I1[s69042] 69042 s69042 69042 +I2[69042, s69042] 69042 s69042 69042 +I2p[69042] 69042 s69042 69042 +PK[207126] 207126 s207126 207126 +I1[s207126] 207126 s207126 207126 +I2[207126, s207126] 207126 s207126 207126 +I2p[207126] 207126 s207126 207126 +PK[621378] 621378 s621378 621378 +I1[s621378] 621378 s621378 621378 +I2[621378, s621378] 621378 s621378 621378 +I2p[621378] 621378 s621378 621378 +PK[1864135] 1864135 s1864135 1864135 +I1[s1864135] 1864135 s1864135 1864135 +I2[1864135, s1864135] 1864135 s1864135 1864135 +I2p[1864135] 1864135 s1864135 1864135 +PK[5592405] 5592405 s5592405 5592405 +I1[s5592405] 5592405 s5592405 5592405 +I2[5592405, s5592405] 5592405 s5592405 5592405 +I2p[5592405] 5592405 s5592405 5592405 +PK[16777215] 16777215 s16777215 16777215 +I1[s16777215] 16777215 s16777215 16777215 +I2[16777215, s16777215] 16777215 s16777215 16777215 +I2p[16777215] 16777215 s16777215 16777215 + +TYPE INT +DUMP_TABLE_BEGIN +-2147483648 s-2147483648 -2147483648 +-715827882 s-715827882 -715827882 +-238609294 s-238609294 -238609294 +-79536431 s-79536431 -79536431 +-26512143 s-26512143 -26512143 +-8837381 s-8837381 -8837381 +-1 s-1 -1 +0 s0 0 +1 s1 1 +8837381 s8837381 8837381 +26512143 s26512143 26512143 +79536431 s79536431 79536431 +238609294 s238609294 238609294 +715827882 s715827882 715827882 +2147483647 s2147483647 2147483647 +DUMP_TABLE_END +PK[-2147483648] -2147483648 s-2147483648 -2147483648 +I1[s-2147483648] -2147483648 s-2147483648 -2147483648 +I2[-2147483648, s-2147483648] -2147483648 s-2147483648 -2147483648 +I2p[-2147483648] -2147483648 s-2147483648 -2147483648 +PK[-715827882] -715827882 s-715827882 -715827882 +I1[s-715827882] -715827882 s-715827882 -715827882 +I2[-715827882, s-715827882] -715827882 s-715827882 -715827882 +I2p[-715827882] -715827882 s-715827882 -715827882 +PK[-238609294] -238609294 s-238609294 -238609294 +I1[s-238609294] -238609294 s-238609294 -238609294 +I2[-238609294, s-238609294] -238609294 s-238609294 -238609294 +I2p[-238609294] -238609294 s-238609294 -238609294 +PK[-79536431] -79536431 s-79536431 -79536431 +I1[s-79536431] -79536431 s-79536431 -79536431 +I2[-79536431, s-79536431] -79536431 s-79536431 -79536431 +I2p[-79536431] -79536431 s-79536431 -79536431 +PK[-26512143] -26512143 s-26512143 -26512143 +I1[s-26512143] -26512143 s-26512143 -26512143 +I2[-26512143, s-26512143] -26512143 s-26512143 -26512143 +I2p[-26512143] -26512143 s-26512143 -26512143 +PK[-8837381] -8837381 s-8837381 -8837381 +I1[s-8837381] -8837381 s-8837381 -8837381 +I2[-8837381, s-8837381] -8837381 s-8837381 -8837381 +I2p[-8837381] -8837381 s-8837381 -8837381 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[8837381] 8837381 s8837381 8837381 +I1[s8837381] 8837381 s8837381 8837381 +I2[8837381, s8837381] 8837381 s8837381 8837381 +I2p[8837381] 8837381 s8837381 8837381 +PK[26512143] 26512143 s26512143 26512143 +I1[s26512143] 26512143 s26512143 26512143 +I2[26512143, s26512143] 26512143 s26512143 26512143 +I2p[26512143] 26512143 s26512143 26512143 +PK[79536431] 79536431 s79536431 79536431 +I1[s79536431] 79536431 s79536431 79536431 +I2[79536431, s79536431] 79536431 s79536431 79536431 +I2p[79536431] 79536431 s79536431 79536431 +PK[238609294] 238609294 s238609294 238609294 +I1[s238609294] 238609294 s238609294 238609294 +I2[238609294, s238609294] 238609294 s238609294 238609294 +I2p[238609294] 238609294 s238609294 238609294 +PK[715827882] 715827882 s715827882 715827882 +I1[s715827882] 715827882 s715827882 715827882 +I2[715827882, s715827882] 715827882 s715827882 715827882 +I2p[715827882] 715827882 s715827882 715827882 +PK[2147483647] 2147483647 s2147483647 2147483647 +I1[s2147483647] 2147483647 s2147483647 2147483647 +I2[2147483647, s2147483647] 2147483647 s2147483647 2147483647 +I2p[2147483647] 2147483647 s2147483647 2147483647 + +TYPE INT UNSIGNED +DUMP_TABLE_BEGIN +0 s0 0 +1 s1 1 +17674762 s17674762 17674762 +53024287 s53024287 53024287 +159072862 s159072862 159072862 +477218588 s477218588 477218588 +1431655765 s1431655765 1431655765 +4294967295 s4294967295 4294967295 +DUMP_TABLE_END +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[17674762] 17674762 s17674762 17674762 +I1[s17674762] 17674762 s17674762 17674762 +I2[17674762, s17674762] 17674762 s17674762 17674762 +I2p[17674762] 17674762 s17674762 17674762 +PK[53024287] 53024287 s53024287 53024287 +I1[s53024287] 53024287 s53024287 53024287 +I2[53024287, s53024287] 53024287 s53024287 53024287 +I2p[53024287] 53024287 s53024287 53024287 +PK[159072862] 159072862 s159072862 159072862 +I1[s159072862] 159072862 s159072862 159072862 +I2[159072862, s159072862] 159072862 s159072862 159072862 +I2p[159072862] 159072862 s159072862 159072862 +PK[477218588] 477218588 s477218588 477218588 +I1[s477218588] 477218588 s477218588 477218588 +I2[477218588, s477218588] 477218588 s477218588 477218588 +I2p[477218588] 477218588 s477218588 477218588 +PK[1431655765] 1431655765 s1431655765 1431655765 +I1[s1431655765] 1431655765 s1431655765 1431655765 +I2[1431655765, s1431655765] 1431655765 s1431655765 1431655765 +I2p[1431655765] 1431655765 s1431655765 1431655765 +PK[4294967295] 4294967295 s4294967295 4294967295 +I1[s4294967295] 4294967295 s4294967295 4294967295 +I2[4294967295, s4294967295] 4294967295 s4294967295 4294967295 +I2p[4294967295] 4294967295 s4294967295 4294967295 + +TYPE BIGINT +DUMP_TABLE_BEGIN +-9223372036854775808 s-9223372036854775808 -9223372036854775808 +-3074457345618258602 s-3074457345618258602 -3074457345618258602 +-1024819115206086200 s-1024819115206086200 -1024819115206086200 +-341606371735362066 s-341606371735362066 -341606371735362066 +-113868790578454022 s-113868790578454022 -113868790578454022 +-37956263526151340 s-37956263526151340 -37956263526151340 +-1 s-1 -1 +0 s0 0 +1 s1 1 +37956263526151340 s37956263526151340 37956263526151340 +113868790578454022 s113868790578454022 113868790578454022 +341606371735362066 s341606371735362066 341606371735362066 +1024819115206086200 s1024819115206086200 1024819115206086200 +3074457345618258602 s3074457345618258602 3074457345618258602 +9223372036854775807 s9223372036854775807 9223372036854775807 +DUMP_TABLE_END +PK[-9223372036854775808] -9223372036854775808 s-9223372036854775808 -9223372036854775808 +I1[s-9223372036854775808] -9223372036854775808 s-9223372036854775808 -9223372036854775808 +I2[-9223372036854775808, s-9223372036854775808] -9223372036854775808 s-9223372036854775808 -9223372036854775808 +I2p[-9223372036854775808] -9223372036854775808 s-9223372036854775808 -9223372036854775808 +PK[-3074457345618258602] -3074457345618258602 s-3074457345618258602 -3074457345618258602 +I1[s-3074457345618258602] -3074457345618258602 s-3074457345618258602 -3074457345618258602 +I2[-3074457345618258602, s-3074457345618258602] -3074457345618258602 s-3074457345618258602 -3074457345618258602 +I2p[-3074457345618258602] -3074457345618258602 s-3074457345618258602 -3074457345618258602 +PK[-1024819115206086200] -1024819115206086200 s-1024819115206086200 -1024819115206086200 +I1[s-1024819115206086200] -1024819115206086200 s-1024819115206086200 -1024819115206086200 +I2[-1024819115206086200, s-1024819115206086200] -1024819115206086200 s-1024819115206086200 -1024819115206086200 +I2p[-1024819115206086200] -1024819115206086200 s-1024819115206086200 -1024819115206086200 +PK[-341606371735362066] -341606371735362066 s-341606371735362066 -341606371735362066 +I1[s-341606371735362066] -341606371735362066 s-341606371735362066 -341606371735362066 +I2[-341606371735362066, s-341606371735362066] -341606371735362066 s-341606371735362066 -341606371735362066 +I2p[-341606371735362066] -341606371735362066 s-341606371735362066 -341606371735362066 +PK[-113868790578454022] -113868790578454022 s-113868790578454022 -113868790578454022 +I1[s-113868790578454022] -113868790578454022 s-113868790578454022 -113868790578454022 +I2[-113868790578454022, s-113868790578454022] -113868790578454022 s-113868790578454022 -113868790578454022 +I2p[-113868790578454022] -113868790578454022 s-113868790578454022 -113868790578454022 +PK[-37956263526151340] -37956263526151340 s-37956263526151340 -37956263526151340 +I1[s-37956263526151340] -37956263526151340 s-37956263526151340 -37956263526151340 +I2[-37956263526151340, s-37956263526151340] -37956263526151340 s-37956263526151340 -37956263526151340 +I2p[-37956263526151340] -37956263526151340 s-37956263526151340 -37956263526151340 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[37956263526151340] 37956263526151340 s37956263526151340 37956263526151340 +I1[s37956263526151340] 37956263526151340 s37956263526151340 37956263526151340 +I2[37956263526151340, s37956263526151340] 37956263526151340 s37956263526151340 37956263526151340 +I2p[37956263526151340] 37956263526151340 s37956263526151340 37956263526151340 +PK[113868790578454022] 113868790578454022 s113868790578454022 113868790578454022 +I1[s113868790578454022] 113868790578454022 s113868790578454022 113868790578454022 +I2[113868790578454022, s113868790578454022] 113868790578454022 s113868790578454022 113868790578454022 +I2p[113868790578454022] 113868790578454022 s113868790578454022 113868790578454022 +PK[341606371735362066] 341606371735362066 s341606371735362066 341606371735362066 +I1[s341606371735362066] 341606371735362066 s341606371735362066 341606371735362066 +I2[341606371735362066, s341606371735362066] 341606371735362066 s341606371735362066 341606371735362066 +I2p[341606371735362066] 341606371735362066 s341606371735362066 341606371735362066 +PK[1024819115206086200] 1024819115206086200 s1024819115206086200 1024819115206086200 +I1[s1024819115206086200] 1024819115206086200 s1024819115206086200 1024819115206086200 +I2[1024819115206086200, s1024819115206086200] 1024819115206086200 s1024819115206086200 1024819115206086200 +I2p[1024819115206086200] 1024819115206086200 s1024819115206086200 1024819115206086200 +PK[3074457345618258602] 3074457345618258602 s3074457345618258602 3074457345618258602 +I1[s3074457345618258602] 3074457345618258602 s3074457345618258602 3074457345618258602 +I2[3074457345618258602, s3074457345618258602] 3074457345618258602 s3074457345618258602 3074457345618258602 +I2p[3074457345618258602] 3074457345618258602 s3074457345618258602 3074457345618258602 +PK[9223372036854775807] 9223372036854775807 s9223372036854775807 9223372036854775807 +I1[s9223372036854775807] 9223372036854775807 s9223372036854775807 9223372036854775807 +I2[9223372036854775807, s9223372036854775807] 9223372036854775807 s9223372036854775807 9223372036854775807 +I2p[9223372036854775807] 9223372036854775807 s9223372036854775807 9223372036854775807 + +TYPE BIGINT UNSIGNED +DUMP_TABLE_BEGIN +0 s0 0 +1 s1 1 +75912527052302681 s75912527052302681 75912527052302681 +227737581156908044 s227737581156908044 227737581156908044 +683212743470724133 s683212743470724133 683212743470724133 +2049638230412172401 s2049638230412172401 2049638230412172401 +6148914691236517205 s6148914691236517205 6148914691236517205 +18446744073709551615 s18446744073709551615 18446744073709551615 +DUMP_TABLE_END +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[75912527052302681] 75912527052302681 s75912527052302681 75912527052302681 +I1[s75912527052302681] 75912527052302681 s75912527052302681 75912527052302681 +I2[75912527052302681, s75912527052302681] 75912527052302681 s75912527052302681 75912527052302681 +I2p[75912527052302681] 75912527052302681 s75912527052302681 75912527052302681 +PK[227737581156908044] 227737581156908044 s227737581156908044 227737581156908044 +I1[s227737581156908044] 227737581156908044 s227737581156908044 227737581156908044 +I2[227737581156908044, s227737581156908044] 227737581156908044 s227737581156908044 227737581156908044 +I2p[227737581156908044] 227737581156908044 s227737581156908044 227737581156908044 +PK[683212743470724133] 683212743470724133 s683212743470724133 683212743470724133 +I1[s683212743470724133] 683212743470724133 s683212743470724133 683212743470724133 +I2[683212743470724133, s683212743470724133] 683212743470724133 s683212743470724133 683212743470724133 +I2p[683212743470724133] 683212743470724133 s683212743470724133 683212743470724133 +PK[2049638230412172401] 2049638230412172401 s2049638230412172401 2049638230412172401 +I1[s2049638230412172401] 2049638230412172401 s2049638230412172401 2049638230412172401 +I2[2049638230412172401, s2049638230412172401] 2049638230412172401 s2049638230412172401 2049638230412172401 +I2p[2049638230412172401] 2049638230412172401 s2049638230412172401 2049638230412172401 +PK[6148914691236517205] 6148914691236517205 s6148914691236517205 6148914691236517205 +I1[s6148914691236517205] 6148914691236517205 s6148914691236517205 6148914691236517205 +I2[6148914691236517205, s6148914691236517205] 6148914691236517205 s6148914691236517205 6148914691236517205 +I2p[6148914691236517205] 6148914691236517205 s6148914691236517205 6148914691236517205 +PK[18446744073709551615] 18446744073709551615 s18446744073709551615 18446744073709551615 +I1[s18446744073709551615] 18446744073709551615 s18446744073709551615 18446744073709551615 +I2[18446744073709551615, s18446744073709551615] 18446744073709551615 s18446744073709551615 18446744073709551615 +I2p[18446744073709551615] 18446744073709551615 s18446744073709551615 18446744073709551615 + +TYPE FLOAT +DUMP_TABLE_BEGIN +-32768 s-32768 -32768 +-10922 s-10922 -10922 +-3640 s-3640 -3640 +-1213 s-1213 -1213 +-404 s-404 -404 +-134 s-134 -134 +-1 s-1 -1 +0 s0 0 +1 s1 1 +134 s134 134 +404 s404 404 +1213 s1213 1213 +3640 s3640 3640 +10922 s10922 10922 +32768 s32768 32768 +DUMP_TABLE_END +PK[-32768] -32768 s-32768 -32768 +I1[s-32768] -32768 s-32768 -32768 +I2[-32768, s-32768] -32768 s-32768 -32768 +I2p[-32768] -32768 s-32768 -32768 +PK[-10922] -10922 s-10922 -10922 +I1[s-10922] -10922 s-10922 -10922 +I2[-10922, s-10922] -10922 s-10922 -10922 +I2p[-10922] -10922 s-10922 -10922 +PK[-3640] -3640 s-3640 -3640 +I1[s-3640] -3640 s-3640 -3640 +I2[-3640, s-3640] -3640 s-3640 -3640 +I2p[-3640] -3640 s-3640 -3640 +PK[-1213] -1213 s-1213 -1213 +I1[s-1213] -1213 s-1213 -1213 +I2[-1213, s-1213] -1213 s-1213 -1213 +I2p[-1213] -1213 s-1213 -1213 +PK[-404] -404 s-404 -404 +I1[s-404] -404 s-404 -404 +I2[-404, s-404] -404 s-404 -404 +I2p[-404] -404 s-404 -404 +PK[-134] -134 s-134 -134 +I1[s-134] -134 s-134 -134 +I2[-134, s-134] -134 s-134 -134 +I2p[-134] -134 s-134 -134 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[134] 134 s134 134 +I1[s134] 134 s134 134 +I2[134, s134] 134 s134 134 +I2p[134] 134 s134 134 +PK[404] 404 s404 404 +I1[s404] 404 s404 404 +I2[404, s404] 404 s404 404 +I2p[404] 404 s404 404 +PK[1213] 1213 s1213 1213 +I1[s1213] 1213 s1213 1213 +I2[1213, s1213] 1213 s1213 1213 +I2p[1213] 1213 s1213 1213 +PK[3640] 3640 s3640 3640 +I1[s3640] 3640 s3640 3640 +I2[3640, s3640] 3640 s3640 3640 +I2p[3640] 3640 s3640 3640 +PK[10922] 10922 s10922 10922 +I1[s10922] 10922 s10922 10922 +I2[10922, s10922] 10922 s10922 10922 +I2p[10922] 10922 s10922 10922 +PK[32768] 32768 s32768 32768 +I1[s32768] 32768 s32768 32768 +I2[32768, s32768] 32768 s32768 32768 +I2p[32768] 32768 s32768 32768 + +TYPE DOUBLE +DUMP_TABLE_BEGIN +-2147483648 s-2147483648 -2147483648 +-715827882 s-715827882 -715827882 +-238609294 s-238609294 -238609294 +-79536431 s-79536431 -79536431 +-26512143 s-26512143 -26512143 +-8837381 s-8837381 -8837381 +-1 s-1 -1 +0 s0 0 +1 s1 1 +8837381 s8837381 8837381 +26512143 s26512143 26512143 +79536431 s79536431 79536431 +238609294 s238609294 238609294 +715827882 s715827882 715827882 +2147483647 s2147483647 2147483647 +DUMP_TABLE_END +PK[-2147483648] -2147483648 s-2147483648 -2147483648 +I1[s-2147483648] -2147483648 s-2147483648 -2147483648 +I2[-2147483648, s-2147483648] -2147483648 s-2147483648 -2147483648 +I2p[-2147483648] -2147483648 s-2147483648 -2147483648 +PK[-715827882] -715827882 s-715827882 -715827882 +I1[s-715827882] -715827882 s-715827882 -715827882 +I2[-715827882, s-715827882] -715827882 s-715827882 -715827882 +I2p[-715827882] -715827882 s-715827882 -715827882 +PK[-238609294] -238609294 s-238609294 -238609294 +I1[s-238609294] -238609294 s-238609294 -238609294 +I2[-238609294, s-238609294] -238609294 s-238609294 -238609294 +I2p[-238609294] -238609294 s-238609294 -238609294 +PK[-79536431] -79536431 s-79536431 -79536431 +I1[s-79536431] -79536431 s-79536431 -79536431 +I2[-79536431, s-79536431] -79536431 s-79536431 -79536431 +I2p[-79536431] -79536431 s-79536431 -79536431 +PK[-26512143] -26512143 s-26512143 -26512143 +I1[s-26512143] -26512143 s-26512143 -26512143 +I2[-26512143, s-26512143] -26512143 s-26512143 -26512143 +I2p[-26512143] -26512143 s-26512143 -26512143 +PK[-8837381] -8837381 s-8837381 -8837381 +I1[s-8837381] -8837381 s-8837381 -8837381 +I2[-8837381, s-8837381] -8837381 s-8837381 -8837381 +I2p[-8837381] -8837381 s-8837381 -8837381 +PK[-1] -1 s-1 -1 +I1[s-1] -1 s-1 -1 +I2[-1, s-1] -1 s-1 -1 +I2p[-1] -1 s-1 -1 +PK[0] 0 s0 0 +I1[s0] 0 s0 0 +I2[0, s0] 0 s0 0 +I2p[0] 0 s0 0 +PK[1] 1 s1 1 +I1[s1] 1 s1 1 +I2[1, s1] 1 s1 1 +I2p[1] 1 s1 1 +PK[8837381] 8837381 s8837381 8837381 +I1[s8837381] 8837381 s8837381 8837381 +I2[8837381, s8837381] 8837381 s8837381 8837381 +I2p[8837381] 8837381 s8837381 8837381 +PK[26512143] 26512143 s26512143 26512143 +I1[s26512143] 26512143 s26512143 26512143 +I2[26512143, s26512143] 26512143 s26512143 26512143 +I2p[26512143] 26512143 s26512143 26512143 +PK[79536431] 79536431 s79536431 79536431 +I1[s79536431] 79536431 s79536431 79536431 +I2[79536431, s79536431] 79536431 s79536431 79536431 +I2p[79536431] 79536431 s79536431 79536431 +PK[238609294] 238609294 s238609294 238609294 +I1[s238609294] 238609294 s238609294 238609294 +I2[238609294, s238609294] 238609294 s238609294 238609294 +I2p[238609294] 238609294 s238609294 238609294 +PK[715827882] 715827882 s715827882 715827882 +I1[s715827882] 715827882 s715827882 715827882 +I2[715827882, s715827882] 715827882 s715827882 715827882 +I2p[715827882] 715827882 s715827882 715827882 +PK[2147483647] 2147483647 s2147483647 2147483647 +I1[s2147483647] 2147483647 s2147483647 2147483647 +I2[2147483647, s2147483647] 2147483647 s2147483647 2147483647 +I2p[2147483647] 2147483647 s2147483647 2147483647 + diff --git a/plugin/handler_socket/regtest/test_01_lib/test15.pl b/plugin/handler_socket/regtest/test_01_lib/test15.pl new file mode 100644 index 00000000..2205be5b --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test15.pl @@ -0,0 +1,114 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for various numeric types + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use bigint; +use hstest; + +my $numeric_types = [ + [ 'TINYINT', -128, 127 ], + [ 'TINYINT UNSIGNED', 0, 255 ], + [ 'SMALLINT', -32768, 32768 ], + [ 'SMALLINT UNSIGNED', 0, 65535 ], + [ 'MEDIUMINT', -8388608, 8388607 ], + [ 'MEDIUMINT UNSIGNED', 0, 16777215 ], + [ 'INT', -2147483648, 2147483647 ], + [ 'INT UNSIGNED', 0, 4294967295 ], + [ 'BIGINT', -9223372036854775808, 9223372036854775807 ], + [ 'BIGINT UNSIGNED', 0, 18446744073709551615 ], + [ 'FLOAT', -32768, 32768 ], + [ 'DOUBLE', -2147483648, 2147483647 ], +]; + +my $table = 'hstesttbl'; +my $dbh; +for my $rec (@$numeric_types) { + my ($typ, $minval, $maxval) = @$rec; + my @vals = (); + push(@vals, 0); + push(@vals, 1); + push(@vals, $maxval); + if ($minval != 0) { + push(@vals, -1); + push(@vals, $minval); + } + my $v1 = $minval; + my $v2 = $maxval; + for (my $i = 0; $i < 5; ++$i) { + $v1 /= 3; + $v2 /= 3; + if ($v1 != 0) { + push(@vals, int($v1)); + } + push(@vals, int($v2)); + } + @vals = sort { $a <=> $b } @vals; + print("TYPE $typ\n"); + test_one($typ, \@vals); + print("\n"); +} + +sub test_one { + my ($typ, $values) = @_; + $dbh = hstest::init_testdb(); + $dbh->do( + "create table $table (" . + "k $typ primary key, " . + "v1 varchar(512), " . + "v2 $typ, " . + "index i1(v1), index i2(v2, v1)) " . + "engine = myisam default charset = binary"); + my $hs = hstest::get_hs_connection(undef, 9999); + my $dbname = $hstest::conf{dbname}; + $hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); + $hs->open_index(2, $dbname, $table, 'i1', 'k,v1,v2'); + $hs->open_index(3, $dbname, $table, 'i2', 'k,v1,v2'); + for my $k (@$values) { + my $kstr = 's' . $k; + $hs->execute_single(1, '+', [ $k, $kstr, $k ], 0, 0); + } + dump_table(); + for my $k (@$values) { + my $kstr = 's' . $k; + my ($rk, $rv1, $rv2); + my $r; + $r = $hs->execute_single(1, '=', [ $k ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "PK[$k] $rk $rv1 $rv2\n"; + $r = $hs->execute_single(2, '=', [ $kstr ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I1[$kstr] $rk $rv1 $rv2\n"; + $r = $hs->execute_single(3, '=', [ $k, $kstr ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I2[$k, $kstr] $rk $rv1 $rv2\n"; + $r = $hs->execute_single(3, '=', [ $k ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I2p[$k] $rk $rv1 $rv2\n"; + } +} + +sub dump_table { + print "DUMP_TABLE_BEGIN\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } + print "DUMP_TABLE_END\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test16.expected b/plugin/handler_socket/regtest/test_01_lib/test16.expected new file mode 100644 index 00000000..b708b95c --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test16.expected @@ -0,0 +1,66 @@ +TYPE DATE +DUMP_TABLE_BEGIN +0000-00-00 s0000-00-00 0000-00-00 +2011-01-01 s2011-01-01 2011-01-01 +9999-12-31 s9999-12-31 9999-12-31 +DUMP_TABLE_END +PK[0000-00-00] 0000-00-00 s0000-00-00 0000-00-00 +I1[s0000-00-00] 0000-00-00 s0000-00-00 0000-00-00 +I2[0000-00-00, s0000-00-00] 0000-00-00 s0000-00-00 0000-00-00 +I2p[0000-00-00] 0000-00-00 s0000-00-00 0000-00-00 +PK[2011-01-01] 2011-01-01 s2011-01-01 2011-01-01 +I1[s2011-01-01] 2011-01-01 s2011-01-01 2011-01-01 +I2[2011-01-01, s2011-01-01] 2011-01-01 s2011-01-01 2011-01-01 +I2p[2011-01-01] 2011-01-01 s2011-01-01 2011-01-01 +PK[9999-12-31] 9999-12-31 s9999-12-31 9999-12-31 +I1[s9999-12-31] 9999-12-31 s9999-12-31 9999-12-31 +I2[9999-12-31, s9999-12-31] 9999-12-31 s9999-12-31 9999-12-31 +I2p[9999-12-31] 9999-12-31 s9999-12-31 9999-12-31 + +TYPE DATETIME +DUMP_TABLE_BEGIN +0000-00-00 00:00:00 s0 0000-00-00 00:00:00 +2011-01-01 18:30:25 s2011-01-01 18:30:25 2011-01-01 18:30:25 +DUMP_TABLE_END +PK[0] 0000-00-00 00:00:00 s0 0000-00-00 00:00:00 +I1[s0] 0000-00-00 00:00:00 s0 0000-00-00 00:00:00 +I2[0, s0] 0000-00-00 00:00:00 s0 0000-00-00 00:00:00 +I2p[0] 0000-00-00 00:00:00 s0 0000-00-00 00:00:00 +PK[2011-01-01 18:30:25] 2011-01-01 18:30:25 s2011-01-01 18:30:25 2011-01-01 18:30:25 +I1[s2011-01-01 18:30:25] 2011-01-01 18:30:25 s2011-01-01 18:30:25 2011-01-01 18:30:25 +I2[2011-01-01 18:30:25, s2011-01-01 18:30:25] 2011-01-01 18:30:25 s2011-01-01 18:30:25 2011-01-01 18:30:25 +I2p[2011-01-01 18:30:25] 2011-01-01 18:30:25 s2011-01-01 18:30:25 2011-01-01 18:30:25 + +TYPE TIME +DUMP_TABLE_BEGIN +00:00:00 s0 00:00:00 +18:30:25 s18:30:25 18:30:25 +DUMP_TABLE_END +PK[0] 00:00:00 s0 00:00:00 +I1[s0] 00:00:00 s0 00:00:00 +I2[0, s0] 00:00:00 s0 00:00:00 +I2p[0] 00:00:00 s0 00:00:00 +PK[18:30:25] 18:30:25 s18:30:25 18:30:25 +I1[s18:30:25] 18:30:25 s18:30:25 18:30:25 +I2[18:30:25, s18:30:25] 18:30:25 s18:30:25 18:30:25 +I2p[18:30:25] 18:30:25 s18:30:25 18:30:25 + +TYPE YEAR(4) +DUMP_TABLE_BEGIN +1901 s1901 1901 +2011 s2011 2011 +2155 s2155 2155 +DUMP_TABLE_END +PK[1901] 1901 s1901 1901 +I1[s1901] 1901 s1901 1901 +I2[1901, s1901] 1901 s1901 1901 +I2p[1901] 1901 s1901 1901 +PK[2011] 2011 s2011 2011 +I1[s2011] 2011 s2011 2011 +I2[2011, s2011] 2011 s2011 2011 +I2p[2011] 2011 s2011 2011 +PK[2155] 2155 s2155 2155 +I1[s2155] 2155 s2155 2155 +I2[2155, s2155] 2155 s2155 2155 +I2p[2155] 2155 s2155 2155 + diff --git a/plugin/handler_socket/regtest/test_01_lib/test16.pl b/plugin/handler_socket/regtest/test_01_lib/test16.pl new file mode 100644 index 00000000..c0c3fc55 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test16.pl @@ -0,0 +1,88 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for date/datetime types + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use bigint; +use hstest; + +my $datetime_types = [ + [ 'DATE', '0000-00-00', '2011-01-01', '9999-12-31' ], + [ 'DATETIME', 0, '2011-01-01 18:30:25' ], + [ 'TIME', 0, '18:30:25' ], + [ 'YEAR(4)', 1901, 2011, 2155 ], + # [ 'TIMESTAMP', 0, 999999999 ], # DOES NOT WORK YET +]; + +my $table = 'hstesttbl'; +my $dbh; +for my $rec (@$datetime_types) { + my ($typ, @vals) = @$rec; + print("TYPE $typ\n"); + test_one($typ, \@vals); + print("\n"); +} + +sub test_one { + my ($typ, $values) = @_; + $dbh = hstest::init_testdb(); + $dbh->do( + "create table $table (" . + "k $typ primary key, " . + "v1 varchar(512), " . + "v2 $typ, " . + "index i1(v1), index i2(v2, v1)) " . + "engine = myisam default charset = binary"); + my $hs = hstest::get_hs_connection(undef, 9999); + my $dbname = $hstest::conf{dbname}; + $hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); + $hs->open_index(2, $dbname, $table, 'i1', 'k,v1,v2'); + $hs->open_index(3, $dbname, $table, 'i2', 'k,v1,v2'); + for my $k (@$values) { + my $kstr = 's' . $k; + $hs->execute_single(1, '+', [ $k, $kstr, $k ], 0, 0); + } + dump_table(); + for my $k (@$values) { + my $kstr = 's' . $k; + my ($rk, $rv1, $rv2); + my $r; + $r = $hs->execute_single(1, '=', [ $k ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "PK[$k] $rk $rv1 $rv2\n"; + $r = $hs->execute_single(2, '=', [ $kstr ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I1[$kstr] $rk $rv1 $rv2\n"; + $r = $hs->execute_single(3, '=', [ $k, $kstr ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I2[$k, $kstr] $rk $rv1 $rv2\n"; + $r = $hs->execute_single(3, '=', [ $k ], 1, 0); + shift(@$r); + ($rk, $rv1, $rv2) = @$r; + print "I2p[$k] $rk $rv1 $rv2\n"; + } +} + +sub dump_table { + print "DUMP_TABLE_BEGIN\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } + print "DUMP_TABLE_END\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test17.expected b/plugin/handler_socket/regtest/test_01_lib/test17.expected Binary files differnew file mode 100644 index 00000000..77176d31 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test17.expected diff --git a/plugin/handler_socket/regtest/test_01_lib/test17.pl b/plugin/handler_socket/regtest/test_01_lib/test17.pl new file mode 100644 index 00000000..7c150dab --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test17.pl @@ -0,0 +1,125 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for string types + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use bigint; +use hstest; + +my $string_types = [ + [ 'CHAR(10)', undef, 1, 2, 5, 10 ], + [ 'VARCHAR(10)', undef, 1, 2, 5, 10 ], + [ 'BINARY(10)', undef, 1, 2, 5, 10 ], + [ 'VARBINARY(10)', undef, 1, 2, 5, 10 ], + [ 'CHAR(255)', undef, 1, 2, 5, 10, 100, 200, 255 ], + [ 'VARCHAR(255)', undef, 1, 2, 5, 10, 100, 200, 255 ], + [ 'VARCHAR(511)', undef, 1, 2, 5, 10, 100, 200, 511 ], + [ 'LONGTEXT', 500, 1, 2, 5, 10, 100, 200, 511 ], + [ 'LONGBLOB', 500, 1, 2, 5, 10, 100, 200, 511 ], +# [ 'VARCHAR(4096)', 500, 1, 2, 5, 10, 100, 200, 255, 256, 4095 ], +# [ 'VARCHAR(16383)', 500, 1, 2, 5, 10, 100, 200, 255, 256, 4095, 4096, 16383 ], +# [ 'VARBINARY(16383)', 500, 1, 2, 5, 10, 100, 200, 255, 256, 4095, 4096, 16383 ], +]; + +my $table = 'hstesttbl'; +my $dbh; +for my $rec (@$string_types) { + my ($typ, $keylen, @vs) = @$rec; + my @vals = (); + for my $len (@vs) { + my $s = ''; + my @arr = (); + srand(999); + # print "$len 1\n"; + for (my $i = 0; $i < $len; ++$i) { + my $v = int(rand(10)); + $arr[$i] = chr(65 + $v); + } + # print "2\n"; + push(@vals, join('', @arr)); + } + print("TYPE $typ\n"); + test_one($typ, $keylen, \@vals); + print("\n"); +} + +sub test_one { + my ($typ, $keylen, $values) = @_; + my $keylen_str = ''; + if (defined($keylen)) { + $keylen_str = "($keylen)"; + } + $dbh = hstest::init_testdb(); + $dbh->do( + "create table $table (" . + "k $typ, " . + "v1 varchar(1000), " . + "v2 $typ, " . + "primary key(k$keylen_str), " . + "index i1(v1), index i2(v2$keylen_str, v1(300))) " . + "engine = myisam default charset = latin1"); + my $hs = hstest::get_hs_connection(undef, 9999); + my $dbname = $hstest::conf{dbname}; + $hs->open_index(1, $dbname, $table, '', 'k,v1,v2'); + $hs->open_index(2, $dbname, $table, 'i1', 'k,v1,v2'); + $hs->open_index(3, $dbname, $table, 'i2', 'k,v1,v2'); + for my $k (@$values) { + my $kstr = 's' . $k; + $hs->execute_single(1, '+', [ $k, $kstr, $k ], 0, 0); + } + # dump_table(); + for my $k (@$values) { + my $kstr = 's' . $k; + my ($rk, $rv1, $rv2); + my $r; + $r = $hs->execute_single(1, '=', [ $k ], 1, 0); + shift(@$r); + check_value("$typ:PK", @$r); + $r = $hs->execute_single(2, '=', [ $kstr ], 1, 0); + shift(@$r); + check_value("$typ:I1", @$r); + $r = $hs->execute_single(3, '=', [ $k, $kstr ], 1, 0); + shift(@$r); + check_value("$typ:I2", @$r); + $r = $hs->execute_single(3, '=', [ $k ], 1, 0); + shift(@$r); + check_value("$typ:I2p", @$r); + } +} + +sub check_value { + my ($mess, $rk, $rv1, $rv2) = @_; + $rk ||= ''; + $rv1 ||= ''; + $rv2 ||= ''; + if ($rv2 ne $rk) { + print "$mess: V2 NE\n$rk\n$rv2\n"; + return; + } + if ($rv1 ne 's' . $rk) { + print "$mess: V1 NE\n$rk\n$rv1\n"; + return; + } + print "$mess: EQ\n"; +} + +sub dump_table { + print "DUMP_TABLE_BEGIN\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } + print "DUMP_TABLE_END\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test18.expected b/plugin/handler_socket/regtest/test_01_lib/test18.expected new file mode 100644 index 00000000..9e09341c --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test18.expected @@ -0,0 +1,22 @@ +HSINSERT +1 v1hs_0 +2 v1hs_1 +3 v1hs_2 +4 v1hs_3 +5 v1hs_4 +6 v1hs_5 +7 v1hs_6 +8 v1hs_7 +9 v1hs_8 +10 v1hs_9 +DUMP_TABLE +1 v1hs_0 +2 v1hs_1 +3 v1hs_2 +4 v1hs_3 +5 v1hs_4 +6 v1hs_5 +7 v1hs_6 +8 v1hs_7 +9 v1hs_8 +10 v1hs_9 diff --git a/plugin/handler_socket/regtest/test_01_lib/test18.pl b/plugin/handler_socket/regtest/test_01_lib/test18.pl new file mode 100644 index 00000000..7854642a --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test18.pl @@ -0,0 +1,63 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# tests that columns to be inserted are specified by open_index + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 10; +$dbh->do( + "create table $table (" . + "k int primary key auto_increment, " . + "v1 varchar(30), " . + "v2 varchar(30)) " . + "engine = myisam default charset = binary"); +srand(999); + +my %valmap = (); + +print "HSINSERT\n"; +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'v1'); +# inserts with auto_increment +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = 0; + my $v1 = "v1hs_" . $i; + my $v2 = "v2hs_" . $i; + my $r = $hs->execute_insert(1, [ $v1 ]); + my $err = $r->[0]; + if ($err != 0) { + my $err_str = $r->[1]; + print "$err $err_str\n"; + } else { + my $id = $r->[1]; + print "$id $v1\n"; + } +} + +undef $hs; + +dump_table(); + +sub dump_table { + print "DUMP_TABLE\n"; + my $aref = $dbh->selectall_arrayref("select k,v1,v2 from $table order by k"); + for my $row (@$aref) { + my ($k, $v1, $v2) = @$row; + $v1 = "[null]" if !defined($v1); + $v2 = "[null]" if !defined($v2); + print "$k $v1 $v2\n"; + # print "MISMATCH\n" if ($valmap{$k} ne $v); + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test19.expected b/plugin/handler_socket/regtest/test_01_lib/test19.expected new file mode 100644 index 00000000..1c37b403 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test19.expected @@ -0,0 +1,14894 @@ + +TINYINT ------------------------------------------------- + +FILTER(TINYINT) NO FILTER +code=0 rows=30 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = -128 +code=0 rows=3 +[0][0][0][-128] +[1][0][1][-128] +[2][0][2][-128] + +FILTER(TINYINT) v2 != -128 +code=0 rows=27 +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= -128 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < -128 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > -128 +code=0 rows=24 +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= -128 +code=0 rows=6 +[0][0][0][-128] +[0][9][0][NULL] +[1][0][1][-128] +[1][9][1][NULL] +[2][0][2][-128] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = -42 +code=0 rows=3 +[0][1][0][-42] +[1][1][1][-42] +[2][1][2][-42] + +FILTER(TINYINT) v2 != -42 +code=0 rows=27 +[0][0][0][-128] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= -42 +code=0 rows=24 +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < -42 +code=0 rows=6 +[0][0][0][-128] +[0][9][0][NULL] +[1][0][1][-128] +[1][9][1][NULL] +[2][0][2][-128] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > -42 +code=0 rows=21 +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= -42 +code=0 rows=9 +[0][0][0][-128] +[0][1][0][-42] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = -14 +code=0 rows=3 +[0][2][0][-14] +[1][2][1][-14] +[2][2][2][-14] + +FILTER(TINYINT) v2 != -14 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= -14 +code=0 rows=21 +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < -14 +code=0 rows=9 +[0][0][0][-128] +[0][1][0][-42] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > -14 +code=0 rows=18 +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= -14 +code=0 rows=12 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = -4 +code=0 rows=3 +[0][3][0][-4] +[1][3][1][-4] +[2][3][2][-4] + +FILTER(TINYINT) v2 != -4 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= -4 +code=0 rows=18 +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < -4 +code=0 rows=12 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > -4 +code=0 rows=15 +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= -4 +code=0 rows=15 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(TINYINT) v2 != 0 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < 0 +code=0 rows=15 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > 0 +code=0 rows=12 +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= 0 +code=0 rows=18 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = 4 +code=0 rows=3 +[0][5][0][4] +[1][5][1][4] +[2][5][2][4] + +FILTER(TINYINT) v2 != 4 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= 4 +code=0 rows=12 +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < 4 +code=0 rows=18 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > 4 +code=0 rows=9 +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= 4 +code=0 rows=21 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = 14 +code=0 rows=3 +[0][6][0][14] +[1][6][1][14] +[2][6][2][14] + +FILTER(TINYINT) v2 != 14 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= 14 +code=0 rows=9 +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < 14 +code=0 rows=21 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > 14 +code=0 rows=6 +[0][7][0][42] +[0][8][0][127] +[1][7][1][42] +[1][8][1][127] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= 14 +code=0 rows=24 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = 42 +code=0 rows=3 +[0][7][0][42] +[1][7][1][42] +[2][7][2][42] + +FILTER(TINYINT) v2 != 42 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= 42 +code=0 rows=6 +[0][7][0][42] +[0][8][0][127] +[1][7][1][42] +[1][8][1][127] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 < 42 +code=0 rows=24 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > 42 +code=0 rows=3 +[0][8][0][127] +[1][8][1][127] +[2][8][2][127] + +FILTER(TINYINT) v2 <= 42 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = 127 +code=0 rows=3 +[0][8][0][127] +[1][8][1][127] +[2][8][2][127] + +FILTER(TINYINT) v2 != 127 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][9][2][NULL] + +FILTER(TINYINT) v2 >= 127 +code=0 rows=3 +[0][8][0][127] +[1][8][1][127] +[2][8][2][127] + +FILTER(TINYINT) v2 < 127 +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][9][2][NULL] + +FILTER(TINYINT) v2 > 127 +code=0 rows=0 + +FILTER(TINYINT) v2 <= 127 +code=0 rows=30 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(TINYINT) v2 != NULL +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 >= NULL +code=0 rows=30 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[0][9][0][NULL] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[1][9][1][NULL] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] +[2][9][2][NULL] + +FILTER(TINYINT) v2 < NULL +code=0 rows=0 + +FILTER(TINYINT) v2 > NULL +code=0 rows=27 +[0][0][0][-128] +[0][1][0][-42] +[0][2][0][-14] +[0][3][0][-4] +[0][4][0][0] +[0][5][0][4] +[0][6][0][14] +[0][7][0][42] +[0][8][0][127] +[1][0][1][-128] +[1][1][1][-42] +[1][2][1][-14] +[1][3][1][-4] +[1][4][1][0] +[1][5][1][4] +[1][6][1][14] +[1][7][1][42] +[1][8][1][127] +[2][0][2][-128] +[2][1][2][-42] +[2][2][2][-14] +[2][3][2][-4] +[2][4][2][0] +[2][5][2][4] +[2][6][2][14] +[2][7][2][42] +[2][8][2][127] + +FILTER(TINYINT) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +TINYINT UNSIGNED ------------------------------------------------- + +FILTER(TINYINT UNSIGNED) NO FILTER +code=0 rows=18 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 = 0 +code=0 rows=3 +[0][0][0][0] +[1][0][1][0] +[2][0][2][0] + +FILTER(TINYINT UNSIGNED) v2 != 0 +code=0 rows=15 +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[0][5][0][NULL] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[1][5][1][NULL] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 >= 0 +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 < 0 +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 > 0 +code=0 rows=12 +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 <= 0 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 = 9 +code=0 rows=3 +[0][1][0][9] +[1][1][1][9] +[2][1][2][9] + +FILTER(TINYINT UNSIGNED) v2 != 9 +code=0 rows=15 +[0][0][0][0] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[0][5][0][NULL] +[1][0][1][0] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[1][5][1][NULL] +[2][0][2][0] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 >= 9 +code=0 rows=12 +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 < 9 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 > 9 +code=0 rows=9 +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 <= 9 +code=0 rows=9 +[0][0][0][0] +[0][1][0][9] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 = 28 +code=0 rows=3 +[0][2][0][28] +[1][2][1][28] +[2][2][2][28] + +FILTER(TINYINT UNSIGNED) v2 != 28 +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][3][0][85] +[0][4][0][255] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][3][1][85] +[1][4][1][255] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][3][2][85] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 >= 28 +code=0 rows=9 +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 < 28 +code=0 rows=9 +[0][0][0][0] +[0][1][0][9] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 > 28 +code=0 rows=6 +[0][3][0][85] +[0][4][0][255] +[1][3][1][85] +[1][4][1][255] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 <= 28 +code=0 rows=12 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 = 85 +code=0 rows=3 +[0][3][0][85] +[1][3][1][85] +[2][3][2][85] + +FILTER(TINYINT UNSIGNED) v2 != 85 +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][4][0][255] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][4][1][255] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 >= 85 +code=0 rows=6 +[0][3][0][85] +[0][4][0][255] +[1][3][1][85] +[1][4][1][255] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 < 85 +code=0 rows=12 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 > 85 +code=0 rows=3 +[0][4][0][255] +[1][4][1][255] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 <= 85 +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 = 255 +code=0 rows=3 +[0][4][0][255] +[1][4][1][255] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 != 255 +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 >= 255 +code=0 rows=3 +[0][4][0][255] +[1][4][1][255] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 < 255 +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 > 255 +code=0 rows=0 + +FILTER(TINYINT UNSIGNED) v2 <= 255 +code=0 rows=18 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 = NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 != NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 >= NULL +code=0 rows=18 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] +[2][5][2][NULL] + +FILTER(TINYINT UNSIGNED) v2 < NULL +code=0 rows=0 + +FILTER(TINYINT UNSIGNED) v2 > NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][9] +[0][2][0][28] +[0][3][0][85] +[0][4][0][255] +[1][0][1][0] +[1][1][1][9] +[1][2][1][28] +[1][3][1][85] +[1][4][1][255] +[2][0][2][0] +[2][1][2][9] +[2][2][2][28] +[2][3][2][85] +[2][4][2][255] + +FILTER(TINYINT UNSIGNED) v2 <= NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + + +SMALLINT ------------------------------------------------- + +FILTER(SMALLINT) NO FILTER +code=0 rows=30 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = -32768 +code=0 rows=3 +[0][0][0][-32768] +[1][0][1][-32768] +[2][0][2][-32768] + +FILTER(SMALLINT) v2 != -32768 +code=0 rows=27 +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= -32768 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < -32768 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > -32768 +code=0 rows=24 +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= -32768 +code=0 rows=6 +[0][0][0][-32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = -10922 +code=0 rows=3 +[0][1][0][-10922] +[1][1][1][-10922] +[2][1][2][-10922] + +FILTER(SMALLINT) v2 != -10922 +code=0 rows=27 +[0][0][0][-32768] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= -10922 +code=0 rows=24 +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < -10922 +code=0 rows=6 +[0][0][0][-32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > -10922 +code=0 rows=21 +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= -10922 +code=0 rows=9 +[0][0][0][-32768] +[0][1][0][-10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = -3640 +code=0 rows=3 +[0][2][0][-3640] +[1][2][1][-3640] +[2][2][2][-3640] + +FILTER(SMALLINT) v2 != -3640 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= -3640 +code=0 rows=21 +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < -3640 +code=0 rows=9 +[0][0][0][-32768] +[0][1][0][-10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > -3640 +code=0 rows=18 +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= -3640 +code=0 rows=12 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = -1213 +code=0 rows=3 +[0][3][0][-1213] +[1][3][1][-1213] +[2][3][2][-1213] + +FILTER(SMALLINT) v2 != -1213 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= -1213 +code=0 rows=18 +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < -1213 +code=0 rows=12 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > -1213 +code=0 rows=15 +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= -1213 +code=0 rows=15 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(SMALLINT) v2 != 0 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < 0 +code=0 rows=15 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > 0 +code=0 rows=12 +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= 0 +code=0 rows=18 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = 1213 +code=0 rows=3 +[0][5][0][1213] +[1][5][1][1213] +[2][5][2][1213] + +FILTER(SMALLINT) v2 != 1213 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= 1213 +code=0 rows=12 +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < 1213 +code=0 rows=18 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > 1213 +code=0 rows=9 +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= 1213 +code=0 rows=21 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = 3640 +code=0 rows=3 +[0][6][0][3640] +[1][6][1][3640] +[2][6][2][3640] + +FILTER(SMALLINT) v2 != 3640 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= 3640 +code=0 rows=9 +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < 3640 +code=0 rows=21 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > 3640 +code=0 rows=6 +[0][7][0][10922] +[0][8][0][32767] +[1][7][1][10922] +[1][8][1][32767] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= 3640 +code=0 rows=24 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = 10922 +code=0 rows=3 +[0][7][0][10922] +[1][7][1][10922] +[2][7][2][10922] + +FILTER(SMALLINT) v2 != 10922 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= 10922 +code=0 rows=6 +[0][7][0][10922] +[0][8][0][32767] +[1][7][1][10922] +[1][8][1][32767] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < 10922 +code=0 rows=24 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > 10922 +code=0 rows=3 +[0][8][0][32767] +[1][8][1][32767] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= 10922 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = 32768 +code=0 rows=3 +[0][8][0][32767] +[1][8][1][32767] +[2][8][2][32767] + +FILTER(SMALLINT) v2 != 32768 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 >= 32768 +code=0 rows=3 +[0][8][0][32767] +[1][8][1][32767] +[2][8][2][32767] + +FILTER(SMALLINT) v2 < 32768 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 > 32768 +code=0 rows=0 + +FILTER(SMALLINT) v2 <= 32768 +code=0 rows=30 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 != NULL +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 >= NULL +code=0 rows=30 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] +[2][9][2][NULL] + +FILTER(SMALLINT) v2 < NULL +code=0 rows=0 + +FILTER(SMALLINT) v2 > NULL +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32767] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32767] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32767] + +FILTER(SMALLINT) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +SMALLINT UNSIGNED ------------------------------------------------- + +FILTER(SMALLINT UNSIGNED) NO FILTER +code=0 rows=18 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 = 0 +code=0 rows=3 +[0][0][0][0] +[1][0][1][0] +[2][0][2][0] + +FILTER(SMALLINT UNSIGNED) v2 != 0 +code=0 rows=15 +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[0][5][0][NULL] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[1][5][1][NULL] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 >= 0 +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 < 0 +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 > 0 +code=0 rows=12 +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 <= 0 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 = 2427 +code=0 rows=3 +[0][1][0][2427] +[1][1][1][2427] +[2][1][2][2427] + +FILTER(SMALLINT UNSIGNED) v2 != 2427 +code=0 rows=15 +[0][0][0][0] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[0][5][0][NULL] +[1][0][1][0] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[1][5][1][NULL] +[2][0][2][0] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 >= 2427 +code=0 rows=12 +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 < 2427 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 > 2427 +code=0 rows=9 +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 <= 2427 +code=0 rows=9 +[0][0][0][0] +[0][1][0][2427] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 = 7281 +code=0 rows=3 +[0][2][0][7281] +[1][2][1][7281] +[2][2][2][7281] + +FILTER(SMALLINT UNSIGNED) v2 != 7281 +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][3][0][21845] +[0][4][0][65535] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][3][1][21845] +[1][4][1][65535] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][3][2][21845] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 >= 7281 +code=0 rows=9 +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 < 7281 +code=0 rows=9 +[0][0][0][0] +[0][1][0][2427] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 > 7281 +code=0 rows=6 +[0][3][0][21845] +[0][4][0][65535] +[1][3][1][21845] +[1][4][1][65535] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 <= 7281 +code=0 rows=12 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 = 21845 +code=0 rows=3 +[0][3][0][21845] +[1][3][1][21845] +[2][3][2][21845] + +FILTER(SMALLINT UNSIGNED) v2 != 21845 +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][4][0][65535] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][4][1][65535] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 >= 21845 +code=0 rows=6 +[0][3][0][21845] +[0][4][0][65535] +[1][3][1][21845] +[1][4][1][65535] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 < 21845 +code=0 rows=12 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 > 21845 +code=0 rows=3 +[0][4][0][65535] +[1][4][1][65535] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 <= 21845 +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 = 65535 +code=0 rows=3 +[0][4][0][65535] +[1][4][1][65535] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 != 65535 +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 >= 65535 +code=0 rows=3 +[0][4][0][65535] +[1][4][1][65535] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 < 65535 +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 > 65535 +code=0 rows=0 + +FILTER(SMALLINT UNSIGNED) v2 <= 65535 +code=0 rows=18 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 = NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 != NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 >= NULL +code=0 rows=18 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] +[2][5][2][NULL] + +FILTER(SMALLINT UNSIGNED) v2 < NULL +code=0 rows=0 + +FILTER(SMALLINT UNSIGNED) v2 > NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][2427] +[0][2][0][7281] +[0][3][0][21845] +[0][4][0][65535] +[1][0][1][0] +[1][1][1][2427] +[1][2][1][7281] +[1][3][1][21845] +[1][4][1][65535] +[2][0][2][0] +[2][1][2][2427] +[2][2][2][7281] +[2][3][2][21845] +[2][4][2][65535] + +FILTER(SMALLINT UNSIGNED) v2 <= NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + + +MEDIUMINT ------------------------------------------------- + +FILTER(MEDIUMINT) NO FILTER +code=0 rows=30 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = -8388608 +code=0 rows=3 +[0][0][0][-8388608] +[1][0][1][-8388608] +[2][0][2][-8388608] + +FILTER(MEDIUMINT) v2 != -8388608 +code=0 rows=27 +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= -8388608 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < -8388608 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > -8388608 +code=0 rows=24 +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= -8388608 +code=0 rows=6 +[0][0][0][-8388608] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = -2796202 +code=0 rows=3 +[0][1][0][-2796202] +[1][1][1][-2796202] +[2][1][2][-2796202] + +FILTER(MEDIUMINT) v2 != -2796202 +code=0 rows=27 +[0][0][0][-8388608] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= -2796202 +code=0 rows=24 +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < -2796202 +code=0 rows=6 +[0][0][0][-8388608] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > -2796202 +code=0 rows=21 +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= -2796202 +code=0 rows=9 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = -932067 +code=0 rows=3 +[0][2][0][-932067] +[1][2][1][-932067] +[2][2][2][-932067] + +FILTER(MEDIUMINT) v2 != -932067 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= -932067 +code=0 rows=21 +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < -932067 +code=0 rows=9 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > -932067 +code=0 rows=18 +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= -932067 +code=0 rows=12 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = -310689 +code=0 rows=3 +[0][3][0][-310689] +[1][3][1][-310689] +[2][3][2][-310689] + +FILTER(MEDIUMINT) v2 != -310689 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= -310689 +code=0 rows=18 +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < -310689 +code=0 rows=12 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > -310689 +code=0 rows=15 +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= -310689 +code=0 rows=15 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(MEDIUMINT) v2 != 0 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < 0 +code=0 rows=15 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > 0 +code=0 rows=12 +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= 0 +code=0 rows=18 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = 310689 +code=0 rows=3 +[0][5][0][310689] +[1][5][1][310689] +[2][5][2][310689] + +FILTER(MEDIUMINT) v2 != 310689 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= 310689 +code=0 rows=12 +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < 310689 +code=0 rows=18 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > 310689 +code=0 rows=9 +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= 310689 +code=0 rows=21 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = 932067 +code=0 rows=3 +[0][6][0][932067] +[1][6][1][932067] +[2][6][2][932067] + +FILTER(MEDIUMINT) v2 != 932067 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= 932067 +code=0 rows=9 +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < 932067 +code=0 rows=21 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > 932067 +code=0 rows=6 +[0][7][0][2796202] +[0][8][0][8388607] +[1][7][1][2796202] +[1][8][1][8388607] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= 932067 +code=0 rows=24 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = 2796202 +code=0 rows=3 +[0][7][0][2796202] +[1][7][1][2796202] +[2][7][2][2796202] + +FILTER(MEDIUMINT) v2 != 2796202 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= 2796202 +code=0 rows=6 +[0][7][0][2796202] +[0][8][0][8388607] +[1][7][1][2796202] +[1][8][1][8388607] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < 2796202 +code=0 rows=24 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > 2796202 +code=0 rows=3 +[0][8][0][8388607] +[1][8][1][8388607] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= 2796202 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = 8388607 +code=0 rows=3 +[0][8][0][8388607] +[1][8][1][8388607] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 != 8388607 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 >= 8388607 +code=0 rows=3 +[0][8][0][8388607] +[1][8][1][8388607] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 < 8388607 +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 > 8388607 +code=0 rows=0 + +FILTER(MEDIUMINT) v2 <= 8388607 +code=0 rows=30 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 != NULL +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 >= NULL +code=0 rows=30 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[0][9][0][NULL] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[1][9][1][NULL] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] +[2][9][2][NULL] + +FILTER(MEDIUMINT) v2 < NULL +code=0 rows=0 + +FILTER(MEDIUMINT) v2 > NULL +code=0 rows=27 +[0][0][0][-8388608] +[0][1][0][-2796202] +[0][2][0][-932067] +[0][3][0][-310689] +[0][4][0][0] +[0][5][0][310689] +[0][6][0][932067] +[0][7][0][2796202] +[0][8][0][8388607] +[1][0][1][-8388608] +[1][1][1][-2796202] +[1][2][1][-932067] +[1][3][1][-310689] +[1][4][1][0] +[1][5][1][310689] +[1][6][1][932067] +[1][7][1][2796202] +[1][8][1][8388607] +[2][0][2][-8388608] +[2][1][2][-2796202] +[2][2][2][-932067] +[2][3][2][-310689] +[2][4][2][0] +[2][5][2][310689] +[2][6][2][932067] +[2][7][2][2796202] +[2][8][2][8388607] + +FILTER(MEDIUMINT) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +MEDIUMINT UNSIGNED ------------------------------------------------- + +FILTER(MEDIUMINT UNSIGNED) NO FILTER +code=0 rows=18 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 = 0 +code=0 rows=3 +[0][0][0][0] +[1][0][1][0] +[2][0][2][0] + +FILTER(MEDIUMINT UNSIGNED) v2 != 0 +code=0 rows=15 +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[0][5][0][NULL] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[1][5][1][NULL] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 >= 0 +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 < 0 +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 > 0 +code=0 rows=12 +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 <= 0 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 = 621378 +code=0 rows=3 +[0][1][0][621378] +[1][1][1][621378] +[2][1][2][621378] + +FILTER(MEDIUMINT UNSIGNED) v2 != 621378 +code=0 rows=15 +[0][0][0][0] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[0][5][0][NULL] +[1][0][1][0] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[1][5][1][NULL] +[2][0][2][0] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 >= 621378 +code=0 rows=12 +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 < 621378 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 > 621378 +code=0 rows=9 +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 <= 621378 +code=0 rows=9 +[0][0][0][0] +[0][1][0][621378] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 = 1864135 +code=0 rows=3 +[0][2][0][1864135] +[1][2][1][1864135] +[2][2][2][1864135] + +FILTER(MEDIUMINT UNSIGNED) v2 != 1864135 +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][3][0][5592405] +[0][4][0][16777215] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][3][1][5592405] +[1][4][1][16777215] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][3][2][5592405] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 >= 1864135 +code=0 rows=9 +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 < 1864135 +code=0 rows=9 +[0][0][0][0] +[0][1][0][621378] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 > 1864135 +code=0 rows=6 +[0][3][0][5592405] +[0][4][0][16777215] +[1][3][1][5592405] +[1][4][1][16777215] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 <= 1864135 +code=0 rows=12 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 = 5592405 +code=0 rows=3 +[0][3][0][5592405] +[1][3][1][5592405] +[2][3][2][5592405] + +FILTER(MEDIUMINT UNSIGNED) v2 != 5592405 +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][4][0][16777215] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][4][1][16777215] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 >= 5592405 +code=0 rows=6 +[0][3][0][5592405] +[0][4][0][16777215] +[1][3][1][5592405] +[1][4][1][16777215] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 < 5592405 +code=0 rows=12 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 > 5592405 +code=0 rows=3 +[0][4][0][16777215] +[1][4][1][16777215] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 <= 5592405 +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 = 16777215 +code=0 rows=3 +[0][4][0][16777215] +[1][4][1][16777215] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 != 16777215 +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 >= 16777215 +code=0 rows=3 +[0][4][0][16777215] +[1][4][1][16777215] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 < 16777215 +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 > 16777215 +code=0 rows=0 + +FILTER(MEDIUMINT UNSIGNED) v2 <= 16777215 +code=0 rows=18 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 = NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 != NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 >= NULL +code=0 rows=18 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] +[2][5][2][NULL] + +FILTER(MEDIUMINT UNSIGNED) v2 < NULL +code=0 rows=0 + +FILTER(MEDIUMINT UNSIGNED) v2 > NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][621378] +[0][2][0][1864135] +[0][3][0][5592405] +[0][4][0][16777215] +[1][0][1][0] +[1][1][1][621378] +[1][2][1][1864135] +[1][3][1][5592405] +[1][4][1][16777215] +[2][0][2][0] +[2][1][2][621378] +[2][2][2][1864135] +[2][3][2][5592405] +[2][4][2][16777215] + +FILTER(MEDIUMINT UNSIGNED) v2 <= NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + + +INT ------------------------------------------------- + +FILTER(INT) NO FILTER +code=0 rows=30 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 = -2147483648 +code=0 rows=3 +[0][0][0][-2147483648] +[1][0][1][-2147483648] +[2][0][2][-2147483648] + +FILTER(INT) v2 != -2147483648 +code=0 rows=27 +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= -2147483648 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < -2147483648 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(INT) v2 > -2147483648 +code=0 rows=24 +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= -2147483648 +code=0 rows=6 +[0][0][0][-2147483648] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][9][2][NULL] + +FILTER(INT) v2 = -715827882 +code=0 rows=3 +[0][1][0][-715827882] +[1][1][1][-715827882] +[2][1][2][-715827882] + +FILTER(INT) v2 != -715827882 +code=0 rows=27 +[0][0][0][-2147483648] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= -715827882 +code=0 rows=24 +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < -715827882 +code=0 rows=6 +[0][0][0][-2147483648] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][9][2][NULL] + +FILTER(INT) v2 > -715827882 +code=0 rows=21 +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= -715827882 +code=0 rows=9 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][9][2][NULL] + +FILTER(INT) v2 = -238609294 +code=0 rows=3 +[0][2][0][-238609294] +[1][2][1][-238609294] +[2][2][2][-238609294] + +FILTER(INT) v2 != -238609294 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= -238609294 +code=0 rows=21 +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < -238609294 +code=0 rows=9 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][9][2][NULL] + +FILTER(INT) v2 > -238609294 +code=0 rows=18 +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= -238609294 +code=0 rows=12 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][9][2][NULL] + +FILTER(INT) v2 = -79536431 +code=0 rows=3 +[0][3][0][-79536431] +[1][3][1][-79536431] +[2][3][2][-79536431] + +FILTER(INT) v2 != -79536431 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= -79536431 +code=0 rows=18 +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < -79536431 +code=0 rows=12 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][9][2][NULL] + +FILTER(INT) v2 > -79536431 +code=0 rows=15 +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= -79536431 +code=0 rows=15 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][9][2][NULL] + +FILTER(INT) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(INT) v2 != 0 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < 0 +code=0 rows=15 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][9][2][NULL] + +FILTER(INT) v2 > 0 +code=0 rows=12 +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= 0 +code=0 rows=18 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(INT) v2 = 79536431 +code=0 rows=3 +[0][5][0][79536431] +[1][5][1][79536431] +[2][5][2][79536431] + +FILTER(INT) v2 != 79536431 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= 79536431 +code=0 rows=12 +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < 79536431 +code=0 rows=18 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(INT) v2 > 79536431 +code=0 rows=9 +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= 79536431 +code=0 rows=21 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][9][2][NULL] + +FILTER(INT) v2 = 238609294 +code=0 rows=3 +[0][6][0][238609294] +[1][6][1][238609294] +[2][6][2][238609294] + +FILTER(INT) v2 != 238609294 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= 238609294 +code=0 rows=9 +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < 238609294 +code=0 rows=21 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][9][2][NULL] + +FILTER(INT) v2 > 238609294 +code=0 rows=6 +[0][7][0][715827882] +[0][8][0][2147483647] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= 238609294 +code=0 rows=24 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][9][2][NULL] + +FILTER(INT) v2 = 715827882 +code=0 rows=3 +[0][7][0][715827882] +[1][7][1][715827882] +[2][7][2][715827882] + +FILTER(INT) v2 != 715827882 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 >= 715827882 +code=0 rows=6 +[0][7][0][715827882] +[0][8][0][2147483647] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 < 715827882 +code=0 rows=24 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][9][2][NULL] + +FILTER(INT) v2 > 715827882 +code=0 rows=3 +[0][8][0][2147483647] +[1][8][1][2147483647] +[2][8][2][2147483647] + +FILTER(INT) v2 <= 715827882 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][9][2][NULL] + +FILTER(INT) v2 = 2147483647 +code=0 rows=3 +[0][8][0][2147483647] +[1][8][1][2147483647] +[2][8][2][2147483647] + +FILTER(INT) v2 != 2147483647 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][9][2][NULL] + +FILTER(INT) v2 >= 2147483647 +code=0 rows=3 +[0][8][0][2147483647] +[1][8][1][2147483647] +[2][8][2][2147483647] + +FILTER(INT) v2 < 2147483647 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][9][2][NULL] + +FILTER(INT) v2 > 2147483647 +code=0 rows=0 + +FILTER(INT) v2 <= 2147483647 +code=0 rows=30 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(INT) v2 != NULL +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 >= NULL +code=0 rows=30 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(INT) v2 < NULL +code=0 rows=0 + +FILTER(INT) v2 > NULL +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(INT) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +INT UNSIGNED ------------------------------------------------- + +FILTER(INT UNSIGNED) NO FILTER +code=0 rows=18 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 = 0 +code=0 rows=3 +[0][0][0][0] +[1][0][1][0] +[2][0][2][0] + +FILTER(INT UNSIGNED) v2 != 0 +code=0 rows=15 +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 >= 0 +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 < 0 +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 > 0 +code=0 rows=12 +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 <= 0 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 = 159072862 +code=0 rows=3 +[0][1][0][159072862] +[1][1][1][159072862] +[2][1][2][159072862] + +FILTER(INT UNSIGNED) v2 != 159072862 +code=0 rows=15 +[0][0][0][0] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][0][1][0] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][0][2][0] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 >= 159072862 +code=0 rows=12 +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 < 159072862 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 > 159072862 +code=0 rows=9 +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 <= 159072862 +code=0 rows=9 +[0][0][0][0] +[0][1][0][159072862] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 = 477218588 +code=0 rows=3 +[0][2][0][477218588] +[1][2][1][477218588] +[2][2][2][477218588] + +FILTER(INT UNSIGNED) v2 != 477218588 +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][3][0][1431655765] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][3][1][1431655765] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][3][2][1431655765] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 >= 477218588 +code=0 rows=9 +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 < 477218588 +code=0 rows=9 +[0][0][0][0] +[0][1][0][159072862] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 > 477218588 +code=0 rows=6 +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 <= 477218588 +code=0 rows=12 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 = 1431655765 +code=0 rows=3 +[0][3][0][1431655765] +[1][3][1][1431655765] +[2][3][2][1431655765] + +FILTER(INT UNSIGNED) v2 != 1431655765 +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 >= 1431655765 +code=0 rows=6 +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 < 1431655765 +code=0 rows=12 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 > 1431655765 +code=0 rows=3 +[0][4][0][4294967295] +[1][4][1][4294967295] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 <= 1431655765 +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 = 4294967295 +code=0 rows=3 +[0][4][0][4294967295] +[1][4][1][4294967295] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 != 4294967295 +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 >= 4294967295 +code=0 rows=3 +[0][4][0][4294967295] +[1][4][1][4294967295] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 < 4294967295 +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 > 4294967295 +code=0 rows=0 + +FILTER(INT UNSIGNED) v2 <= 4294967295 +code=0 rows=18 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 = NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 != NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 >= NULL +code=0 rows=18 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] +[2][5][2][NULL] + +FILTER(INT UNSIGNED) v2 < NULL +code=0 rows=0 + +FILTER(INT UNSIGNED) v2 > NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][159072862] +[0][2][0][477218588] +[0][3][0][1431655765] +[0][4][0][4294967295] +[1][0][1][0] +[1][1][1][159072862] +[1][2][1][477218588] +[1][3][1][1431655765] +[1][4][1][4294967295] +[2][0][2][0] +[2][1][2][159072862] +[2][2][2][477218588] +[2][3][2][1431655765] +[2][4][2][4294967295] + +FILTER(INT UNSIGNED) v2 <= NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + + +BIGINT ------------------------------------------------- + +FILTER(BIGINT) NO FILTER +code=0 rows=30 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = -9223372036854775808 +code=0 rows=3 +[0][0][0][-9223372036854775808] +[1][0][1][-9223372036854775808] +[2][0][2][-9223372036854775808] + +FILTER(BIGINT) v2 != -9223372036854775808 +code=0 rows=27 +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= -9223372036854775808 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < -9223372036854775808 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > -9223372036854775808 +code=0 rows=24 +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= -9223372036854775808 +code=0 rows=6 +[0][0][0][-9223372036854775808] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = -3074457345618258602 +code=0 rows=3 +[0][1][0][-3074457345618258602] +[1][1][1][-3074457345618258602] +[2][1][2][-3074457345618258602] + +FILTER(BIGINT) v2 != -3074457345618258602 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= -3074457345618258602 +code=0 rows=24 +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < -3074457345618258602 +code=0 rows=6 +[0][0][0][-9223372036854775808] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > -3074457345618258602 +code=0 rows=21 +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= -3074457345618258602 +code=0 rows=9 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = -1024819115206086200 +code=0 rows=3 +[0][2][0][-1024819115206086200] +[1][2][1][-1024819115206086200] +[2][2][2][-1024819115206086200] + +FILTER(BIGINT) v2 != -1024819115206086200 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= -1024819115206086200 +code=0 rows=21 +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < -1024819115206086200 +code=0 rows=9 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > -1024819115206086200 +code=0 rows=18 +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= -1024819115206086200 +code=0 rows=12 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = -341606371735362066 +code=0 rows=3 +[0][3][0][-341606371735362066] +[1][3][1][-341606371735362066] +[2][3][2][-341606371735362066] + +FILTER(BIGINT) v2 != -341606371735362066 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= -341606371735362066 +code=0 rows=18 +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < -341606371735362066 +code=0 rows=12 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > -341606371735362066 +code=0 rows=15 +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= -341606371735362066 +code=0 rows=15 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(BIGINT) v2 != 0 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < 0 +code=0 rows=15 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > 0 +code=0 rows=12 +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= 0 +code=0 rows=18 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = 341606371735362066 +code=0 rows=3 +[0][5][0][341606371735362066] +[1][5][1][341606371735362066] +[2][5][2][341606371735362066] + +FILTER(BIGINT) v2 != 341606371735362066 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= 341606371735362066 +code=0 rows=12 +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < 341606371735362066 +code=0 rows=18 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > 341606371735362066 +code=0 rows=9 +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= 341606371735362066 +code=0 rows=21 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = 1024819115206086200 +code=0 rows=3 +[0][6][0][1024819115206086200] +[1][6][1][1024819115206086200] +[2][6][2][1024819115206086200] + +FILTER(BIGINT) v2 != 1024819115206086200 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= 1024819115206086200 +code=0 rows=9 +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < 1024819115206086200 +code=0 rows=21 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > 1024819115206086200 +code=0 rows=6 +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= 1024819115206086200 +code=0 rows=24 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = 3074457345618258602 +code=0 rows=3 +[0][7][0][3074457345618258602] +[1][7][1][3074457345618258602] +[2][7][2][3074457345618258602] + +FILTER(BIGINT) v2 != 3074457345618258602 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= 3074457345618258602 +code=0 rows=6 +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < 3074457345618258602 +code=0 rows=24 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > 3074457345618258602 +code=0 rows=3 +[0][8][0][9223372036854775807] +[1][8][1][9223372036854775807] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= 3074457345618258602 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = 9223372036854775807 +code=0 rows=3 +[0][8][0][9223372036854775807] +[1][8][1][9223372036854775807] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 != 9223372036854775807 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][9][2][NULL] + +FILTER(BIGINT) v2 >= 9223372036854775807 +code=0 rows=3 +[0][8][0][9223372036854775807] +[1][8][1][9223372036854775807] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 < 9223372036854775807 +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][9][2][NULL] + +FILTER(BIGINT) v2 > 9223372036854775807 +code=0 rows=0 + +FILTER(BIGINT) v2 <= 9223372036854775807 +code=0 rows=30 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(BIGINT) v2 != NULL +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 >= NULL +code=0 rows=30 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[0][9][0][NULL] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[1][9][1][NULL] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] +[2][9][2][NULL] + +FILTER(BIGINT) v2 < NULL +code=0 rows=0 + +FILTER(BIGINT) v2 > NULL +code=0 rows=27 +[0][0][0][-9223372036854775808] +[0][1][0][-3074457345618258602] +[0][2][0][-1024819115206086200] +[0][3][0][-341606371735362066] +[0][4][0][0] +[0][5][0][341606371735362066] +[0][6][0][1024819115206086200] +[0][7][0][3074457345618258602] +[0][8][0][9223372036854775807] +[1][0][1][-9223372036854775808] +[1][1][1][-3074457345618258602] +[1][2][1][-1024819115206086200] +[1][3][1][-341606371735362066] +[1][4][1][0] +[1][5][1][341606371735362066] +[1][6][1][1024819115206086200] +[1][7][1][3074457345618258602] +[1][8][1][9223372036854775807] +[2][0][2][-9223372036854775808] +[2][1][2][-3074457345618258602] +[2][2][2][-1024819115206086200] +[2][3][2][-341606371735362066] +[2][4][2][0] +[2][5][2][341606371735362066] +[2][6][2][1024819115206086200] +[2][7][2][3074457345618258602] +[2][8][2][9223372036854775807] + +FILTER(BIGINT) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +BIGINT UNSIGNED ------------------------------------------------- + +FILTER(BIGINT UNSIGNED) NO FILTER +code=0 rows=18 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 = 0 +code=0 rows=3 +[0][0][0][0] +[1][0][1][0] +[2][0][2][0] + +FILTER(BIGINT UNSIGNED) v2 != 0 +code=0 rows=15 +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 >= 0 +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 < 0 +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 > 0 +code=0 rows=12 +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 <= 0 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 = 683212743470724133 +code=0 rows=3 +[0][1][0][683212743470724133] +[1][1][1][683212743470724133] +[2][1][2][683212743470724133] + +FILTER(BIGINT UNSIGNED) v2 != 683212743470724133 +code=0 rows=15 +[0][0][0][0] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][0][1][0] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][0][2][0] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 >= 683212743470724133 +code=0 rows=12 +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 < 683212743470724133 +code=0 rows=6 +[0][0][0][0] +[0][5][0][NULL] +[1][0][1][0] +[1][5][1][NULL] +[2][0][2][0] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 > 683212743470724133 +code=0 rows=9 +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 <= 683212743470724133 +code=0 rows=9 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 = 2049638230412172401 +code=0 rows=3 +[0][2][0][2049638230412172401] +[1][2][1][2049638230412172401] +[2][2][2][2049638230412172401] + +FILTER(BIGINT UNSIGNED) v2 != 2049638230412172401 +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 >= 2049638230412172401 +code=0 rows=9 +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 < 2049638230412172401 +code=0 rows=9 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 > 2049638230412172401 +code=0 rows=6 +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 <= 2049638230412172401 +code=0 rows=12 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 = 6148914691236517205 +code=0 rows=3 +[0][3][0][6148914691236517205] +[1][3][1][6148914691236517205] +[2][3][2][6148914691236517205] + +FILTER(BIGINT UNSIGNED) v2 != 6148914691236517205 +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 >= 6148914691236517205 +code=0 rows=6 +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 < 6148914691236517205 +code=0 rows=12 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 > 6148914691236517205 +code=0 rows=3 +[0][4][0][18446744073709551615] +[1][4][1][18446744073709551615] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 <= 6148914691236517205 +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 = 18446744073709551615 +code=0 rows=3 +[0][4][0][18446744073709551615] +[1][4][1][18446744073709551615] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 != 18446744073709551615 +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 >= 18446744073709551615 +code=0 rows=3 +[0][4][0][18446744073709551615] +[1][4][1][18446744073709551615] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 < 18446744073709551615 +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 > 18446744073709551615 +code=0 rows=0 + +FILTER(BIGINT UNSIGNED) v2 <= 18446744073709551615 +code=0 rows=18 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 = NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 != NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 >= NULL +code=0 rows=18 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[0][5][0][NULL] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[1][5][1][NULL] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] +[2][5][2][NULL] + +FILTER(BIGINT UNSIGNED) v2 < NULL +code=0 rows=0 + +FILTER(BIGINT UNSIGNED) v2 > NULL +code=0 rows=15 +[0][0][0][0] +[0][1][0][683212743470724133] +[0][2][0][2049638230412172401] +[0][3][0][6148914691236517205] +[0][4][0][18446744073709551615] +[1][0][1][0] +[1][1][1][683212743470724133] +[1][2][1][2049638230412172401] +[1][3][1][6148914691236517205] +[1][4][1][18446744073709551615] +[2][0][2][0] +[2][1][2][683212743470724133] +[2][2][2][2049638230412172401] +[2][3][2][6148914691236517205] +[2][4][2][18446744073709551615] + +FILTER(BIGINT UNSIGNED) v2 <= NULL +code=0 rows=3 +[0][5][0][NULL] +[1][5][1][NULL] +[2][5][2][NULL] + + +FLOAT ------------------------------------------------- + +FILTER(FLOAT) NO FILTER +code=0 rows=30 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = -32768 +code=0 rows=3 +[0][0][0][-32768] +[1][0][1][-32768] +[2][0][2][-32768] + +FILTER(FLOAT) v2 != -32768 +code=0 rows=27 +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= -32768 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < -32768 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > -32768 +code=0 rows=24 +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= -32768 +code=0 rows=6 +[0][0][0][-32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = -10922 +code=0 rows=3 +[0][1][0][-10922] +[1][1][1][-10922] +[2][1][2][-10922] + +FILTER(FLOAT) v2 != -10922 +code=0 rows=27 +[0][0][0][-32768] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= -10922 +code=0 rows=24 +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < -10922 +code=0 rows=6 +[0][0][0][-32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > -10922 +code=0 rows=21 +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= -10922 +code=0 rows=9 +[0][0][0][-32768] +[0][1][0][-10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = -3640 +code=0 rows=3 +[0][2][0][-3640] +[1][2][1][-3640] +[2][2][2][-3640] + +FILTER(FLOAT) v2 != -3640 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= -3640 +code=0 rows=21 +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < -3640 +code=0 rows=9 +[0][0][0][-32768] +[0][1][0][-10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > -3640 +code=0 rows=18 +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= -3640 +code=0 rows=12 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = -1213 +code=0 rows=3 +[0][3][0][-1213] +[1][3][1][-1213] +[2][3][2][-1213] + +FILTER(FLOAT) v2 != -1213 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= -1213 +code=0 rows=18 +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < -1213 +code=0 rows=12 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > -1213 +code=0 rows=15 +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= -1213 +code=0 rows=15 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(FLOAT) v2 != 0 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < 0 +code=0 rows=15 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > 0 +code=0 rows=12 +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= 0 +code=0 rows=18 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = 1213 +code=0 rows=3 +[0][5][0][1213] +[1][5][1][1213] +[2][5][2][1213] + +FILTER(FLOAT) v2 != 1213 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= 1213 +code=0 rows=12 +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < 1213 +code=0 rows=18 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > 1213 +code=0 rows=9 +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= 1213 +code=0 rows=21 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = 3640 +code=0 rows=3 +[0][6][0][3640] +[1][6][1][3640] +[2][6][2][3640] + +FILTER(FLOAT) v2 != 3640 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= 3640 +code=0 rows=9 +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < 3640 +code=0 rows=21 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > 3640 +code=0 rows=6 +[0][7][0][10922] +[0][8][0][32768] +[1][7][1][10922] +[1][8][1][32768] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= 3640 +code=0 rows=24 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = 10922 +code=0 rows=3 +[0][7][0][10922] +[1][7][1][10922] +[2][7][2][10922] + +FILTER(FLOAT) v2 != 10922 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= 10922 +code=0 rows=6 +[0][7][0][10922] +[0][8][0][32768] +[1][7][1][10922] +[1][8][1][32768] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 < 10922 +code=0 rows=24 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > 10922 +code=0 rows=3 +[0][8][0][32768] +[1][8][1][32768] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= 10922 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = 32768 +code=0 rows=3 +[0][8][0][32768] +[1][8][1][32768] +[2][8][2][32768] + +FILTER(FLOAT) v2 != 32768 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][9][2][NULL] + +FILTER(FLOAT) v2 >= 32768 +code=0 rows=3 +[0][8][0][32768] +[1][8][1][32768] +[2][8][2][32768] + +FILTER(FLOAT) v2 < 32768 +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][9][2][NULL] + +FILTER(FLOAT) v2 > 32768 +code=0 rows=0 + +FILTER(FLOAT) v2 <= 32768 +code=0 rows=30 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(FLOAT) v2 != NULL +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 >= NULL +code=0 rows=30 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[0][9][0][NULL] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[1][9][1][NULL] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] +[2][9][2][NULL] + +FILTER(FLOAT) v2 < NULL +code=0 rows=0 + +FILTER(FLOAT) v2 > NULL +code=0 rows=27 +[0][0][0][-32768] +[0][1][0][-10922] +[0][2][0][-3640] +[0][3][0][-1213] +[0][4][0][0] +[0][5][0][1213] +[0][6][0][3640] +[0][7][0][10922] +[0][8][0][32768] +[1][0][1][-32768] +[1][1][1][-10922] +[1][2][1][-3640] +[1][3][1][-1213] +[1][4][1][0] +[1][5][1][1213] +[1][6][1][3640] +[1][7][1][10922] +[1][8][1][32768] +[2][0][2][-32768] +[2][1][2][-10922] +[2][2][2][-3640] +[2][3][2][-1213] +[2][4][2][0] +[2][5][2][1213] +[2][6][2][3640] +[2][7][2][10922] +[2][8][2][32768] + +FILTER(FLOAT) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +DOUBLE ------------------------------------------------- + +FILTER(DOUBLE) NO FILTER +code=0 rows=30 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = -2147483648 +code=0 rows=3 +[0][0][0][-2147483648] +[1][0][1][-2147483648] +[2][0][2][-2147483648] + +FILTER(DOUBLE) v2 != -2147483648 +code=0 rows=27 +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= -2147483648 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < -2147483648 +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > -2147483648 +code=0 rows=24 +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= -2147483648 +code=0 rows=6 +[0][0][0][-2147483648] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = -715827882 +code=0 rows=3 +[0][1][0][-715827882] +[1][1][1][-715827882] +[2][1][2][-715827882] + +FILTER(DOUBLE) v2 != -715827882 +code=0 rows=27 +[0][0][0][-2147483648] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= -715827882 +code=0 rows=24 +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < -715827882 +code=0 rows=6 +[0][0][0][-2147483648] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > -715827882 +code=0 rows=21 +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= -715827882 +code=0 rows=9 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = -238609294 +code=0 rows=3 +[0][2][0][-238609294] +[1][2][1][-238609294] +[2][2][2][-238609294] + +FILTER(DOUBLE) v2 != -238609294 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= -238609294 +code=0 rows=21 +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < -238609294 +code=0 rows=9 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > -238609294 +code=0 rows=18 +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= -238609294 +code=0 rows=12 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = -79536431 +code=0 rows=3 +[0][3][0][-79536431] +[1][3][1][-79536431] +[2][3][2][-79536431] + +FILTER(DOUBLE) v2 != -79536431 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= -79536431 +code=0 rows=18 +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < -79536431 +code=0 rows=12 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > -79536431 +code=0 rows=15 +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= -79536431 +code=0 rows=15 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = 0 +code=0 rows=3 +[0][4][0][0] +[1][4][1][0] +[2][4][2][0] + +FILTER(DOUBLE) v2 != 0 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= 0 +code=0 rows=15 +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < 0 +code=0 rows=15 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > 0 +code=0 rows=12 +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= 0 +code=0 rows=18 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = 79536431 +code=0 rows=3 +[0][5][0][79536431] +[1][5][1][79536431] +[2][5][2][79536431] + +FILTER(DOUBLE) v2 != 79536431 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= 79536431 +code=0 rows=12 +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < 79536431 +code=0 rows=18 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > 79536431 +code=0 rows=9 +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= 79536431 +code=0 rows=21 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = 238609294 +code=0 rows=3 +[0][6][0][238609294] +[1][6][1][238609294] +[2][6][2][238609294] + +FILTER(DOUBLE) v2 != 238609294 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= 238609294 +code=0 rows=9 +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < 238609294 +code=0 rows=21 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > 238609294 +code=0 rows=6 +[0][7][0][715827882] +[0][8][0][2147483647] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= 238609294 +code=0 rows=24 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = 715827882 +code=0 rows=3 +[0][7][0][715827882] +[1][7][1][715827882] +[2][7][2][715827882] + +FILTER(DOUBLE) v2 != 715827882 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= 715827882 +code=0 rows=6 +[0][7][0][715827882] +[0][8][0][2147483647] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < 715827882 +code=0 rows=24 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > 715827882 +code=0 rows=3 +[0][8][0][2147483647] +[1][8][1][2147483647] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= 715827882 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = 2147483647 +code=0 rows=3 +[0][8][0][2147483647] +[1][8][1][2147483647] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 != 2147483647 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 >= 2147483647 +code=0 rows=3 +[0][8][0][2147483647] +[1][8][1][2147483647] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 < 2147483647 +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 > 2147483647 +code=0 rows=0 + +FILTER(DOUBLE) v2 <= 2147483647 +code=0 rows=30 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 = NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 != NULL +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 >= NULL +code=0 rows=30 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[0][9][0][NULL] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[1][9][1][NULL] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] +[2][9][2][NULL] + +FILTER(DOUBLE) v2 < NULL +code=0 rows=0 + +FILTER(DOUBLE) v2 > NULL +code=0 rows=27 +[0][0][0][-2147483648] +[0][1][0][-715827882] +[0][2][0][-238609294] +[0][3][0][-79536431] +[0][4][0][0] +[0][5][0][79536431] +[0][6][0][238609294] +[0][7][0][715827882] +[0][8][0][2147483647] +[1][0][1][-2147483648] +[1][1][1][-715827882] +[1][2][1][-238609294] +[1][3][1][-79536431] +[1][4][1][0] +[1][5][1][79536431] +[1][6][1][238609294] +[1][7][1][715827882] +[1][8][1][2147483647] +[2][0][2][-2147483648] +[2][1][2][-715827882] +[2][2][2][-238609294] +[2][3][2][-79536431] +[2][4][2][0] +[2][5][2][79536431] +[2][6][2][238609294] +[2][7][2][715827882] +[2][8][2][2147483647] + +FILTER(DOUBLE) v2 <= NULL +code=0 rows=3 +[0][9][0][NULL] +[1][9][1][NULL] +[2][9][2][NULL] + + +DATE ------------------------------------------------- + +FILTER(DATE) NO FILTER +code=0 rows=12 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] +[2][3][2][NULL] + +FILTER(DATE) v2 = 0000-00-00 +code=0 rows=3 +[0][0][0][0000-00-00] +[1][0][1][0000-00-00] +[2][0][2][0000-00-00] + +FILTER(DATE) v2 != 0000-00-00 +code=0 rows=9 +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[0][3][0][NULL] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[1][3][1][NULL] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] +[2][3][2][NULL] + +FILTER(DATE) v2 >= 0000-00-00 +code=0 rows=9 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 < 0000-00-00 +code=0 rows=3 +[0][3][0][NULL] +[1][3][1][NULL] +[2][3][2][NULL] + +FILTER(DATE) v2 > 0000-00-00 +code=0 rows=6 +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 <= 0000-00-00 +code=0 rows=6 +[0][0][0][0000-00-00] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][3][2][NULL] + +FILTER(DATE) v2 = 2011-01-01 +code=0 rows=3 +[0][1][0][2011-01-01] +[1][1][1][2011-01-01] +[2][1][2][2011-01-01] + +FILTER(DATE) v2 != 2011-01-01 +code=0 rows=9 +[0][0][0][0000-00-00] +[0][2][0][9999-12-31] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][2][1][9999-12-31] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][2][2][9999-12-31] +[2][3][2][NULL] + +FILTER(DATE) v2 >= 2011-01-01 +code=0 rows=6 +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 < 2011-01-01 +code=0 rows=6 +[0][0][0][0000-00-00] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][3][2][NULL] + +FILTER(DATE) v2 > 2011-01-01 +code=0 rows=3 +[0][2][0][9999-12-31] +[1][2][1][9999-12-31] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 <= 2011-01-01 +code=0 rows=9 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][3][2][NULL] + +FILTER(DATE) v2 = 9999-12-31 +code=0 rows=3 +[0][2][0][9999-12-31] +[1][2][1][9999-12-31] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 != 9999-12-31 +code=0 rows=9 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][3][2][NULL] + +FILTER(DATE) v2 >= 9999-12-31 +code=0 rows=3 +[0][2][0][9999-12-31] +[1][2][1][9999-12-31] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 < 9999-12-31 +code=0 rows=9 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][3][2][NULL] + +FILTER(DATE) v2 > 9999-12-31 +code=0 rows=0 + +FILTER(DATE) v2 <= 9999-12-31 +code=0 rows=12 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] +[2][3][2][NULL] + +FILTER(DATE) v2 = NULL +code=0 rows=3 +[0][3][0][NULL] +[1][3][1][NULL] +[2][3][2][NULL] + +FILTER(DATE) v2 != NULL +code=0 rows=9 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 >= NULL +code=0 rows=12 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[0][3][0][NULL] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[1][3][1][NULL] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] +[2][3][2][NULL] + +FILTER(DATE) v2 < NULL +code=0 rows=0 + +FILTER(DATE) v2 > NULL +code=0 rows=9 +[0][0][0][0000-00-00] +[0][1][0][2011-01-01] +[0][2][0][9999-12-31] +[1][0][1][0000-00-00] +[1][1][1][2011-01-01] +[1][2][1][9999-12-31] +[2][0][2][0000-00-00] +[2][1][2][2011-01-01] +[2][2][2][9999-12-31] + +FILTER(DATE) v2 <= NULL +code=0 rows=3 +[0][3][0][NULL] +[1][3][1][NULL] +[2][3][2][NULL] + + +DATETIME ------------------------------------------------- + +FILTER(DATETIME) NO FILTER +code=0 rows=9 +[0][0][0][0000-00-00 00:00:00] +[0][1][0][2011-01-01 18:30:25] +[0][2][0][NULL] +[1][0][1][0000-00-00 00:00:00] +[1][1][1][2011-01-01 18:30:25] +[1][2][1][NULL] +[2][0][2][0000-00-00 00:00:00] +[2][1][2][2011-01-01 18:30:25] +[2][2][2][NULL] + +FILTER(DATETIME) v2 = 0 +code=0 rows=3 +[0][0][0][0000-00-00 00:00:00] +[1][0][1][0000-00-00 00:00:00] +[2][0][2][0000-00-00 00:00:00] + +FILTER(DATETIME) v2 != 0 +code=0 rows=6 +[0][1][0][2011-01-01 18:30:25] +[0][2][0][NULL] +[1][1][1][2011-01-01 18:30:25] +[1][2][1][NULL] +[2][1][2][2011-01-01 18:30:25] +[2][2][2][NULL] + +FILTER(DATETIME) v2 >= 0 +code=0 rows=6 +[0][0][0][0000-00-00 00:00:00] +[0][1][0][2011-01-01 18:30:25] +[1][0][1][0000-00-00 00:00:00] +[1][1][1][2011-01-01 18:30:25] +[2][0][2][0000-00-00 00:00:00] +[2][1][2][2011-01-01 18:30:25] + +FILTER(DATETIME) v2 < 0 +code=0 rows=3 +[0][2][0][NULL] +[1][2][1][NULL] +[2][2][2][NULL] + +FILTER(DATETIME) v2 > 0 +code=0 rows=3 +[0][1][0][2011-01-01 18:30:25] +[1][1][1][2011-01-01 18:30:25] +[2][1][2][2011-01-01 18:30:25] + +FILTER(DATETIME) v2 <= 0 +code=0 rows=6 +[0][0][0][0000-00-00 00:00:00] +[0][2][0][NULL] +[1][0][1][0000-00-00 00:00:00] +[1][2][1][NULL] +[2][0][2][0000-00-00 00:00:00] +[2][2][2][NULL] + +FILTER(DATETIME) v2 = 2011-01-01 18:30:25 +code=0 rows=3 +[0][1][0][2011-01-01 18:30:25] +[1][1][1][2011-01-01 18:30:25] +[2][1][2][2011-01-01 18:30:25] + +FILTER(DATETIME) v2 != 2011-01-01 18:30:25 +code=0 rows=6 +[0][0][0][0000-00-00 00:00:00] +[0][2][0][NULL] +[1][0][1][0000-00-00 00:00:00] +[1][2][1][NULL] +[2][0][2][0000-00-00 00:00:00] +[2][2][2][NULL] + +FILTER(DATETIME) v2 >= 2011-01-01 18:30:25 +code=0 rows=3 +[0][1][0][2011-01-01 18:30:25] +[1][1][1][2011-01-01 18:30:25] +[2][1][2][2011-01-01 18:30:25] + +FILTER(DATETIME) v2 < 2011-01-01 18:30:25 +code=0 rows=6 +[0][0][0][0000-00-00 00:00:00] +[0][2][0][NULL] +[1][0][1][0000-00-00 00:00:00] +[1][2][1][NULL] +[2][0][2][0000-00-00 00:00:00] +[2][2][2][NULL] + +FILTER(DATETIME) v2 > 2011-01-01 18:30:25 +code=0 rows=0 + +FILTER(DATETIME) v2 <= 2011-01-01 18:30:25 +code=0 rows=9 +[0][0][0][0000-00-00 00:00:00] +[0][1][0][2011-01-01 18:30:25] +[0][2][0][NULL] +[1][0][1][0000-00-00 00:00:00] +[1][1][1][2011-01-01 18:30:25] +[1][2][1][NULL] +[2][0][2][0000-00-00 00:00:00] +[2][1][2][2011-01-01 18:30:25] +[2][2][2][NULL] + +FILTER(DATETIME) v2 = NULL +code=0 rows=3 +[0][2][0][NULL] +[1][2][1][NULL] +[2][2][2][NULL] + +FILTER(DATETIME) v2 != NULL +code=0 rows=6 +[0][0][0][0000-00-00 00:00:00] +[0][1][0][2011-01-01 18:30:25] +[1][0][1][0000-00-00 00:00:00] +[1][1][1][2011-01-01 18:30:25] +[2][0][2][0000-00-00 00:00:00] +[2][1][2][2011-01-01 18:30:25] + +FILTER(DATETIME) v2 >= NULL +code=0 rows=9 +[0][0][0][0000-00-00 00:00:00] +[0][1][0][2011-01-01 18:30:25] +[0][2][0][NULL] +[1][0][1][0000-00-00 00:00:00] +[1][1][1][2011-01-01 18:30:25] +[1][2][1][NULL] +[2][0][2][0000-00-00 00:00:00] +[2][1][2][2011-01-01 18:30:25] +[2][2][2][NULL] + +FILTER(DATETIME) v2 < NULL +code=0 rows=0 + +FILTER(DATETIME) v2 > NULL +code=0 rows=6 +[0][0][0][0000-00-00 00:00:00] +[0][1][0][2011-01-01 18:30:25] +[1][0][1][0000-00-00 00:00:00] +[1][1][1][2011-01-01 18:30:25] +[2][0][2][0000-00-00 00:00:00] +[2][1][2][2011-01-01 18:30:25] + +FILTER(DATETIME) v2 <= NULL +code=0 rows=3 +[0][2][0][NULL] +[1][2][1][NULL] +[2][2][2][NULL] + + +TIME ------------------------------------------------- + +FILTER(TIME) NO FILTER +code=0 rows=9 +[0][0][0][00:00:00] +[0][1][0][18:30:25] +[0][2][0][NULL] +[1][0][1][00:00:00] +[1][1][1][18:30:25] +[1][2][1][NULL] +[2][0][2][00:00:00] +[2][1][2][18:30:25] +[2][2][2][NULL] + +FILTER(TIME) v2 = 0 +code=0 rows=3 +[0][0][0][00:00:00] +[1][0][1][00:00:00] +[2][0][2][00:00:00] + +FILTER(TIME) v2 != 0 +code=0 rows=6 +[0][1][0][18:30:25] +[0][2][0][NULL] +[1][1][1][18:30:25] +[1][2][1][NULL] +[2][1][2][18:30:25] +[2][2][2][NULL] + +FILTER(TIME) v2 >= 0 +code=0 rows=6 +[0][0][0][00:00:00] +[0][1][0][18:30:25] +[1][0][1][00:00:00] +[1][1][1][18:30:25] +[2][0][2][00:00:00] +[2][1][2][18:30:25] + +FILTER(TIME) v2 < 0 +code=0 rows=3 +[0][2][0][NULL] +[1][2][1][NULL] +[2][2][2][NULL] + +FILTER(TIME) v2 > 0 +code=0 rows=3 +[0][1][0][18:30:25] +[1][1][1][18:30:25] +[2][1][2][18:30:25] + +FILTER(TIME) v2 <= 0 +code=0 rows=6 +[0][0][0][00:00:00] +[0][2][0][NULL] +[1][0][1][00:00:00] +[1][2][1][NULL] +[2][0][2][00:00:00] +[2][2][2][NULL] + +FILTER(TIME) v2 = 18:30:25 +code=0 rows=3 +[0][1][0][18:30:25] +[1][1][1][18:30:25] +[2][1][2][18:30:25] + +FILTER(TIME) v2 != 18:30:25 +code=0 rows=6 +[0][0][0][00:00:00] +[0][2][0][NULL] +[1][0][1][00:00:00] +[1][2][1][NULL] +[2][0][2][00:00:00] +[2][2][2][NULL] + +FILTER(TIME) v2 >= 18:30:25 +code=0 rows=3 +[0][1][0][18:30:25] +[1][1][1][18:30:25] +[2][1][2][18:30:25] + +FILTER(TIME) v2 < 18:30:25 +code=0 rows=6 +[0][0][0][00:00:00] +[0][2][0][NULL] +[1][0][1][00:00:00] +[1][2][1][NULL] +[2][0][2][00:00:00] +[2][2][2][NULL] + +FILTER(TIME) v2 > 18:30:25 +code=0 rows=0 + +FILTER(TIME) v2 <= 18:30:25 +code=0 rows=9 +[0][0][0][00:00:00] +[0][1][0][18:30:25] +[0][2][0][NULL] +[1][0][1][00:00:00] +[1][1][1][18:30:25] +[1][2][1][NULL] +[2][0][2][00:00:00] +[2][1][2][18:30:25] +[2][2][2][NULL] + +FILTER(TIME) v2 = NULL +code=0 rows=3 +[0][2][0][NULL] +[1][2][1][NULL] +[2][2][2][NULL] + +FILTER(TIME) v2 != NULL +code=0 rows=6 +[0][0][0][00:00:00] +[0][1][0][18:30:25] +[1][0][1][00:00:00] +[1][1][1][18:30:25] +[2][0][2][00:00:00] +[2][1][2][18:30:25] + +FILTER(TIME) v2 >= NULL +code=0 rows=9 +[0][0][0][00:00:00] +[0][1][0][18:30:25] +[0][2][0][NULL] +[1][0][1][00:00:00] +[1][1][1][18:30:25] +[1][2][1][NULL] +[2][0][2][00:00:00] +[2][1][2][18:30:25] +[2][2][2][NULL] + +FILTER(TIME) v2 < NULL +code=0 rows=0 + +FILTER(TIME) v2 > NULL +code=0 rows=6 +[0][0][0][00:00:00] +[0][1][0][18:30:25] +[1][0][1][00:00:00] +[1][1][1][18:30:25] +[2][0][2][00:00:00] +[2][1][2][18:30:25] + +FILTER(TIME) v2 <= NULL +code=0 rows=3 +[0][2][0][NULL] +[1][2][1][NULL] +[2][2][2][NULL] + + +YEAR(4) ------------------------------------------------- + +FILTER(YEAR(4)) NO FILTER +code=0 rows=8 +[1][0][1][1901] +[1][1][1][2011] +[1][2][1][2155] +[1][3][1][NULL] +[2][0][2][1901] +[2][1][2][2011] +[2][2][2][2155] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 = 1901 +code=0 rows=2 +[1][0][1][1901] +[2][0][2][1901] + +FILTER(YEAR(4)) v2 != 1901 +code=0 rows=6 +[1][1][1][2011] +[1][2][1][2155] +[1][3][1][NULL] +[2][1][2][2011] +[2][2][2][2155] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 >= 1901 +code=0 rows=6 +[1][0][1][1901] +[1][1][1][2011] +[1][2][1][2155] +[2][0][2][1901] +[2][1][2][2011] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 < 1901 +code=0 rows=2 +[1][3][1][NULL] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 > 1901 +code=0 rows=4 +[1][1][1][2011] +[1][2][1][2155] +[2][1][2][2011] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 <= 1901 +code=0 rows=4 +[1][0][1][1901] +[1][3][1][NULL] +[2][0][2][1901] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 = 2011 +code=0 rows=2 +[1][1][1][2011] +[2][1][2][2011] + +FILTER(YEAR(4)) v2 != 2011 +code=0 rows=6 +[1][0][1][1901] +[1][2][1][2155] +[1][3][1][NULL] +[2][0][2][1901] +[2][2][2][2155] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 >= 2011 +code=0 rows=4 +[1][1][1][2011] +[1][2][1][2155] +[2][1][2][2011] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 < 2011 +code=0 rows=4 +[1][0][1][1901] +[1][3][1][NULL] +[2][0][2][1901] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 > 2011 +code=0 rows=2 +[1][2][1][2155] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 <= 2011 +code=0 rows=6 +[1][0][1][1901] +[1][1][1][2011] +[1][3][1][NULL] +[2][0][2][1901] +[2][1][2][2011] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 = 2155 +code=0 rows=2 +[1][2][1][2155] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 != 2155 +code=0 rows=6 +[1][0][1][1901] +[1][1][1][2011] +[1][3][1][NULL] +[2][0][2][1901] +[2][1][2][2011] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 >= 2155 +code=0 rows=2 +[1][2][1][2155] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 < 2155 +code=0 rows=6 +[1][0][1][1901] +[1][1][1][2011] +[1][3][1][NULL] +[2][0][2][1901] +[2][1][2][2011] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 > 2155 +code=0 rows=0 + +FILTER(YEAR(4)) v2 <= 2155 +code=0 rows=8 +[1][0][1][1901] +[1][1][1][2011] +[1][2][1][2155] +[1][3][1][NULL] +[2][0][2][1901] +[2][1][2][2011] +[2][2][2][2155] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 = NULL +code=0 rows=2 +[1][3][1][NULL] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 != NULL +code=0 rows=6 +[1][0][1][1901] +[1][1][1][2011] +[1][2][1][2155] +[2][0][2][1901] +[2][1][2][2011] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 >= NULL +code=0 rows=8 +[1][0][1][1901] +[1][1][1][2011] +[1][2][1][2155] +[1][3][1][NULL] +[2][0][2][1901] +[2][1][2][2011] +[2][2][2][2155] +[2][3][2][NULL] + +FILTER(YEAR(4)) v2 < NULL +code=0 rows=0 + +FILTER(YEAR(4)) v2 > NULL +code=0 rows=6 +[1][0][1][1901] +[1][1][1][2011] +[1][2][1][2155] +[2][0][2][1901] +[2][1][2][2011] +[2][2][2][2155] + +FILTER(YEAR(4)) v2 <= NULL +code=0 rows=2 +[1][3][1][NULL] +[2][3][2][NULL] + + +CHAR(10) ------------------------------------------------- + +FILTER(CHAR(10)) NO FILTER +code=0 rows=15 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 = B +code=0 rows=3 +[0][0][0][B +[1][0][1][B +[2][0][2][B + +FILTER(CHAR(10)) v2 != B +code=0 rows=12 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 >= B +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(CHAR(10)) v2 < B +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 > B +code=0 rows=9 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(CHAR(10)) v2 <= B +code=0 rows=6 +[0][0][0][B +[0][4][0][NULL] +[1][0][1][B +[1][4][1][NULL] +[2][0][2][B +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 = GI +code=0 rows=3 +[0][1][0][GI +[1][1][1][GI +[2][1][2][GI + +FILTER(CHAR(10)) v2 != GI +code=0 rows=12 +[0][0][0][B +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 >= GI +code=0 rows=6 +[0][1][0][GI +[0][2][0][JHFFE +[1][1][1][GI +[1][2][1][JHFFE +[2][1][2][GI +[2][2][2][JHFFE + +FILTER(CHAR(10)) v2 < GI +code=0 rows=9 +[0][0][0][B +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(CHAR(10)) v2 <= GI +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(CHAR(10)) v2 != JHFFE +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(CHAR(10)) v2 < JHFFE +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 > JHFFE +code=0 rows=0 + +FILTER(CHAR(10)) v2 <= JHFFE +code=0 rows=15 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH] +[1][3][1][FDHHDEDBHH] +[2][3][2][FDHHDEDBHH] + +FILTER(CHAR(10)) v2 != FDHHDEDBHH +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 >= FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(CHAR(10)) v2 < FDHHDEDBHH +code=0 rows=6 +[0][0][0][B +[0][4][0][NULL] +[1][0][1][B +[1][4][1][NULL] +[2][0][2][B +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 > FDHHDEDBHH +code=0 rows=6 +[0][1][0][GI +[0][2][0][JHFFE +[1][1][1][GI +[1][2][1][JHFFE +[2][1][2][GI +[2][2][2][JHFFE + +FILTER(CHAR(10)) v2 <= FDHHDEDBHH +code=0 rows=9 +[0][0][0][B +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 = NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 != NULL +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(CHAR(10)) v2 >= NULL +code=0 rows=15 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(CHAR(10)) v2 < NULL +code=0 rows=0 + +FILTER(CHAR(10)) v2 > NULL +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(CHAR(10)) v2 <= NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + + +VARCHAR(10) ------------------------------------------------- + +FILTER(VARCHAR(10)) NO FILTER +code=0 rows=15 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 = B +code=0 rows=3 +[0][0][0][B] +[1][0][1][B] +[2][0][2][B] + +FILTER(VARCHAR(10)) v2 != B +code=0 rows=12 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 >= B +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(10)) v2 < B +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 > B +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(10)) v2 <= B +code=0 rows=6 +[0][0][0][B] +[0][4][0][NULL] +[1][0][1][B] +[1][4][1][NULL] +[2][0][2][B] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 = GI +code=0 rows=3 +[0][1][0][GI] +[1][1][1][GI] +[2][1][2][GI] + +FILTER(VARCHAR(10)) v2 != GI +code=0 rows=12 +[0][0][0][B] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 >= GI +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARCHAR(10)) v2 < GI +code=0 rows=9 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(10)) v2 <= GI +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(10)) v2 != JHFFE +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(10)) v2 < JHFFE +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 > JHFFE +code=0 rows=0 + +FILTER(VARCHAR(10)) v2 <= JHFFE +code=0 rows=15 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH] +[1][3][1][FDHHDEDBHH] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(10)) v2 != FDHHDEDBHH +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 >= FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(10)) v2 < FDHHDEDBHH +code=0 rows=6 +[0][0][0][B] +[0][4][0][NULL] +[1][0][1][B] +[1][4][1][NULL] +[2][0][2][B] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 > FDHHDEDBHH +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARCHAR(10)) v2 <= FDHHDEDBHH +code=0 rows=9 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 = NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 != NULL +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(10)) v2 >= NULL +code=0 rows=15 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARCHAR(10)) v2 < NULL +code=0 rows=0 + +FILTER(VARCHAR(10)) v2 > NULL +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(10)) v2 <= NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + + +BINARY(10) ------------------------------------------------- + +FILTER(BINARY(10)) NO FILTER +code=0 rows=15 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 = B +code=0 rows=3 +[0][0][0][B +[1][0][1][B +[2][0][2][B + +FILTER(BINARY(10)) v2 != B +code=0 rows=12 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 >= B +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(BINARY(10)) v2 < B +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 > B +code=0 rows=9 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(BINARY(10)) v2 <= B +code=0 rows=6 +[0][0][0][B +[0][4][0][NULL] +[1][0][1][B +[1][4][1][NULL] +[2][0][2][B +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 = GI +code=0 rows=3 +[0][1][0][GI +[1][1][1][GI +[2][1][2][GI + +FILTER(BINARY(10)) v2 != GI +code=0 rows=12 +[0][0][0][B +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 >= GI +code=0 rows=6 +[0][1][0][GI +[0][2][0][JHFFE +[1][1][1][GI +[1][2][1][JHFFE +[2][1][2][GI +[2][2][2][JHFFE + +FILTER(BINARY(10)) v2 < GI +code=0 rows=9 +[0][0][0][B +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(BINARY(10)) v2 <= GI +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(BINARY(10)) v2 != JHFFE +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(BINARY(10)) v2 < JHFFE +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 > JHFFE +code=0 rows=0 + +FILTER(BINARY(10)) v2 <= JHFFE +code=0 rows=15 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH] +[1][3][1][FDHHDEDBHH] +[2][3][2][FDHHDEDBHH] + +FILTER(BINARY(10)) v2 != FDHHDEDBHH +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 >= FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(BINARY(10)) v2 < FDHHDEDBHH +code=0 rows=6 +[0][0][0][B +[0][4][0][NULL] +[1][0][1][B +[1][4][1][NULL] +[2][0][2][B +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 > FDHHDEDBHH +code=0 rows=6 +[0][1][0][GI +[0][2][0][JHFFE +[1][1][1][GI +[1][2][1][JHFFE +[2][1][2][GI +[2][2][2][JHFFE + +FILTER(BINARY(10)) v2 <= FDHHDEDBHH +code=0 rows=9 +[0][0][0][B +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 = NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 != NULL +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(BINARY(10)) v2 >= NULL +code=0 rows=15 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(BINARY(10)) v2 < NULL +code=0 rows=0 + +FILTER(BINARY(10)) v2 > NULL +code=0 rows=12 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH] + +FILTER(BINARY(10)) v2 <= NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + + +VARBINARY(10) ------------------------------------------------- + +FILTER(VARBINARY(10)) NO FILTER +code=0 rows=15 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 = B +code=0 rows=3 +[0][0][0][B] +[1][0][1][B] +[2][0][2][B] + +FILTER(VARBINARY(10)) v2 != B +code=0 rows=12 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 >= B +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARBINARY(10)) v2 < B +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 > B +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARBINARY(10)) v2 <= B +code=0 rows=6 +[0][0][0][B] +[0][4][0][NULL] +[1][0][1][B] +[1][4][1][NULL] +[2][0][2][B] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 = GI +code=0 rows=3 +[0][1][0][GI] +[1][1][1][GI] +[2][1][2][GI] + +FILTER(VARBINARY(10)) v2 != GI +code=0 rows=12 +[0][0][0][B] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 >= GI +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARBINARY(10)) v2 < GI +code=0 rows=9 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARBINARY(10)) v2 <= GI +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARBINARY(10)) v2 != JHFFE +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARBINARY(10)) v2 < JHFFE +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 > JHFFE +code=0 rows=0 + +FILTER(VARBINARY(10)) v2 <= JHFFE +code=0 rows=15 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH] +[1][3][1][FDHHDEDBHH] +[2][3][2][FDHHDEDBHH] + +FILTER(VARBINARY(10)) v2 != FDHHDEDBHH +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 >= FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARBINARY(10)) v2 < FDHHDEDBHH +code=0 rows=6 +[0][0][0][B] +[0][4][0][NULL] +[1][0][1][B] +[1][4][1][NULL] +[2][0][2][B] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 > FDHHDEDBHH +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARBINARY(10)) v2 <= FDHHDEDBHH +code=0 rows=9 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 = NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 != NULL +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARBINARY(10)) v2 >= NULL +code=0 rows=15 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][NULL] + +FILTER(VARBINARY(10)) v2 < NULL +code=0 rows=0 + +FILTER(VARBINARY(10)) v2 > NULL +code=0 rows=12 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] + +FILTER(VARBINARY(10)) v2 <= NULL +code=0 rows=3 +[0][4][0][NULL] +[1][4][1][NULL] +[2][4][2][NULL] + + +CHAR(255) ------------------------------------------------- + +FILTER(CHAR(255)) NO FILTER +code=0 rows=24 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = B +code=0 rows=3 +[0][0][0][B +[1][0][1][B +[2][0][2][B + +FILTER(CHAR(255)) v2 != B +code=0 rows=21 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= B +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(CHAR(255)) v2 < B +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > B +code=0 rows=18 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(CHAR(255)) v2 <= B +code=0 rows=6 +[0][0][0][B +[0][7][0][NULL] +[1][0][1][B +[1][7][1][NULL] +[2][0][2][B +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = GI +code=0 rows=3 +[0][1][0][GI +[1][1][1][GI +[2][1][2][GI + +FILTER(CHAR(255)) v2 != GI +code=0 rows=21 +[0][0][0][B +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= GI +code=0 rows=6 +[0][1][0][GI +[0][2][0][JHFFE +[1][1][1][GI +[1][2][1][JHFFE +[2][1][2][GI +[2][2][2][JHFFE + +FILTER(CHAR(255)) v2 < GI +code=0 rows=18 +[0][0][0][B +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(CHAR(255)) v2 <= GI +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(CHAR(255)) v2 != JHFFE +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE +[1][2][1][JHFFE +[2][2][2][JHFFE + +FILTER(CHAR(255)) v2 < JHFFE +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > JHFFE +code=0 rows=0 + +FILTER(CHAR(255)) v2 <= JHFFE +code=0 rows=24 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH +[1][3][1][FDHHDEDBHH +[2][3][2][FDHHDEDBHH + +FILTER(CHAR(255)) v2 != FDHHDEDBHH +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= FDHHDEDBHH +code=0 rows=12 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF + +FILTER(CHAR(255)) v2 < FDHHDEDBHH +code=0 rows=12 +[0][0][0][B +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI +[0][2][0][JHFFE +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][1][1][GI +[1][2][1][JHFFE +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][1][2][GI +[2][2][2][JHFFE +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF + +FILTER(CHAR(255)) v2 <= FDHHDEDBHH +code=0 rows=15 +[0][0][0][B +[0][3][0][FDHHDEDBHH +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=3 +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF + +FILTER(CHAR(255)) v2 != FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=9 +[0][1][0][GI +[0][2][0][JHFFE +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][1][1][GI +[1][2][1][JHFFE +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][1][2][GI +[2][2][2][JHFFE +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF + +FILTER(CHAR(255)) v2 < FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=15 +[0][0][0][B +[0][3][0][FDHHDEDBHH +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=6 +[0][1][0][GI +[0][2][0][JHFFE +[1][1][1][GI +[1][2][1][JHFFE +[2][1][2][GI +[2][2][2][JHFFE + +FILTER(CHAR(255)) v2 <= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=18 +[0][0][0][B +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=3 +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE + +FILTER(CHAR(255)) v2 != DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=15 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE + +FILTER(CHAR(255)) v2 < DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=9 +[0][0][0][B +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=12 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF + +FILTER(CHAR(255)) v2 <= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=12 +[0][0][0][B +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=3 +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(CHAR(255)) v2 != DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 >= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=18 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(CHAR(255)) v2 < DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=6 +[0][0][0][B +[0][7][0][NULL] +[1][0][1][B +[1][7][1][NULL] +[2][0][2][B +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 > DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=15 +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE + +FILTER(CHAR(255)) v2 <= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=9 +[0][0][0][B +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 = NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 != NULL +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(CHAR(255)) v2 >= NULL +code=0 rows=24 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(CHAR(255)) v2 < NULL +code=0 rows=0 + +FILTER(CHAR(255)) v2 > NULL +code=0 rows=21 +[0][0][0][B +[0][1][0][GI +[0][2][0][JHFFE +[0][3][0][FDHHDEDBHH +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][0][1][B +[1][1][1][GI +[1][2][1][JHFFE +[1][3][1][FDHHDEDBHH +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][0][2][B +[2][1][2][GI +[2][2][2][JHFFE +[2][3][2][FDHHDEDBHH +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(CHAR(255)) v2 <= NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + + +VARCHAR(255) ------------------------------------------------- + +FILTER(VARCHAR(255)) NO FILTER +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = B +code=0 rows=3 +[0][0][0][B] +[1][0][1][B] +[2][0][2][B] + +FILTER(VARCHAR(255)) v2 != B +code=0 rows=21 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= B +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(VARCHAR(255)) v2 < B +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > B +code=0 rows=18 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(VARCHAR(255)) v2 <= B +code=0 rows=6 +[0][0][0][B] +[0][7][0][NULL] +[1][0][1][B] +[1][7][1][NULL] +[2][0][2][B] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = GI +code=0 rows=3 +[0][1][0][GI] +[1][1][1][GI] +[2][1][2][GI] + +FILTER(VARCHAR(255)) v2 != GI +code=0 rows=21 +[0][0][0][B] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= GI +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARCHAR(255)) v2 < GI +code=0 rows=18 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(255)) v2 <= GI +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(255)) v2 != JHFFE +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(255)) v2 < JHFFE +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > JHFFE +code=0 rows=0 + +FILTER(VARCHAR(255)) v2 <= JHFFE +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH] +[1][3][1][FDHHDEDBHH] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(255)) v2 != FDHHDEDBHH +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= FDHHDEDBHH +code=0 rows=12 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(255)) v2 < FDHHDEDBHH +code=0 rows=12 +[0][0][0][B] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(255)) v2 <= FDHHDEDBHH +code=0 rows=15 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=3 +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(255)) v2 != FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(255)) v2 < FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=15 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARCHAR(255)) v2 <= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=18 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=3 +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] + +FILTER(VARCHAR(255)) v2 != DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=15 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] + +FILTER(VARCHAR(255)) v2 < DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=9 +[0][0][0][B] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=12 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(255)) v2 <= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=12 +[0][0][0][B] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=3 +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(VARCHAR(255)) v2 != DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 >= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=18 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(VARCHAR(255)) v2 < DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=6 +[0][0][0][B] +[0][7][0][NULL] +[1][0][1][B] +[1][7][1][NULL] +[2][0][2][B] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 > DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=15 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] + +FILTER(VARCHAR(255)) v2 <= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI +code=0 rows=9 +[0][0][0][B] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 = NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 != NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(VARCHAR(255)) v2 >= NULL +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][7][2][NULL] + +FILTER(VARCHAR(255)) v2 < NULL +code=0 rows=0 + +FILTER(VARCHAR(255)) v2 > NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGI] + +FILTER(VARCHAR(255)) v2 <= NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + + +VARCHAR(511) ------------------------------------------------- + +FILTER(VARCHAR(511)) NO FILTER +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = B +code=0 rows=3 +[0][0][0][B] +[1][0][1][B] +[2][0][2][B] + +FILTER(VARCHAR(511)) v2 != B +code=0 rows=21 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= B +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(VARCHAR(511)) v2 < B +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > B +code=0 rows=18 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(VARCHAR(511)) v2 <= B +code=0 rows=6 +[0][0][0][B] +[0][7][0][NULL] +[1][0][1][B] +[1][7][1][NULL] +[2][0][2][B] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = GI +code=0 rows=3 +[0][1][0][GI] +[1][1][1][GI] +[2][1][2][GI] + +FILTER(VARCHAR(511)) v2 != GI +code=0 rows=21 +[0][0][0][B] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= GI +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARCHAR(511)) v2 < GI +code=0 rows=18 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > GI +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(511)) v2 <= GI +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(511)) v2 != JHFFE +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= JHFFE +code=0 rows=3 +[0][2][0][JHFFE] +[1][2][1][JHFFE] +[2][2][2][JHFFE] + +FILTER(VARCHAR(511)) v2 < JHFFE +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > JHFFE +code=0 rows=0 + +FILTER(VARCHAR(511)) v2 <= JHFFE +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = FDHHDEDBHH +code=0 rows=3 +[0][3][0][FDHHDEDBHH] +[1][3][1][FDHHDEDBHH] +[2][3][2][FDHHDEDBHH] + +FILTER(VARCHAR(511)) v2 != FDHHDEDBHH +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= FDHHDEDBHH +code=0 rows=12 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(511)) v2 < FDHHDEDBHH +code=0 rows=12 +[0][0][0][B] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > FDHHDEDBHH +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(511)) v2 <= FDHHDEDBHH +code=0 rows=15 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=3 +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(511)) v2 != FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=9 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(511)) v2 < FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=15 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=6 +[0][1][0][GI] +[0][2][0][JHFFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[2][1][2][GI] +[2][2][2][JHFFE] + +FILTER(VARCHAR(511)) v2 <= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=0 rows=18 +[0][0][0][B] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=3 +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] + +FILTER(VARCHAR(511)) v2 != DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=15 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] + +FILTER(VARCHAR(511)) v2 < DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=9 +[0][0][0][B] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=12 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] + +FILTER(VARCHAR(511)) v2 <= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=0 rows=12 +[0][0][0][B] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=0 rows=3 +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(VARCHAR(511)) v2 != DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 >= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=0 rows=18 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(VARCHAR(511)) v2 < DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=0 rows=6 +[0][0][0][B] +[0][7][0][NULL] +[1][0][1][B] +[1][7][1][NULL] +[2][0][2][B] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 > DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=0 rows=15 +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] + +FILTER(VARCHAR(511)) v2 <= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=0 rows=9 +[0][0][0][B] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 = NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 != NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(VARCHAR(511)) v2 >= NULL +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(VARCHAR(511)) v2 < NULL +code=0 rows=0 + +FILTER(VARCHAR(511)) v2 > NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(VARCHAR(511)) v2 <= NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + + +LONGTEXT ------------------------------------------------- + +FILTER(LONGTEXT) NO FILTER +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(LONGTEXT) v2 = B +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != B +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= B +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < B +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > B +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= B +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = GI +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != GI +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= GI +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < GI +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > GI +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= GI +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 != DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 >= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 < DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 > DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 <= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGTEXT) v2 = NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(LONGTEXT) v2 != NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(LONGTEXT) v2 >= NULL +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(LONGTEXT) v2 < NULL +code=0 rows=0 + +FILTER(LONGTEXT) v2 > NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(LONGTEXT) v2 <= NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + + +LONGBLOB ------------------------------------------------- + +FILTER(LONGBLOB) NO FILTER +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(LONGBLOB) v2 = B +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != B +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= B +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < B +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > B +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= B +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = GI +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != GI +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= GI +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < GI +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > GI +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= GI +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= JHFFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= FDHHDEDBHH +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 != DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 >= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 < DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 > DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 <= DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA +code=2 rows=0 +[filterblob] +FILTER(LONGBLOB) v2 = NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + +FILTER(LONGBLOB) v2 != NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(LONGBLOB) v2 >= NULL +code=0 rows=24 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[0][7][0][NULL] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][7][1][NULL] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][7][2][NULL] + +FILTER(LONGBLOB) v2 < NULL +code=0 rows=0 + +FILTER(LONGBLOB) v2 > NULL +code=0 rows=21 +[0][0][0][B] +[0][1][0][GI] +[0][2][0][JHFFE] +[0][3][0][FDHHDEDBHH] +[0][4][0][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[0][5][0][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[0][6][0][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[1][0][1][B] +[1][1][1][GI] +[1][2][1][JHFFE] +[1][3][1][FDHHDEDBHH] +[1][4][1][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[1][5][1][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[1][6][1][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] +[2][0][2][B] +[2][1][2][GI] +[2][2][2][JHFFE] +[2][3][2][FDHHDEDBHH] +[2][4][2][FEFJEICICEFFADGGIEBCCGIDFJECIJHBGJGJFCCBJEBBBCAGGCHFEAAIGDIGAAIBFIHHJBGEBGDADBIIHHIJEDDDIBHIFDFIFAIF] +[2][5][2][DIEIIDGEIGAHICBIACDFGJAJBAAECEIGIDFFHFFFDDADDIHGECGEEADDAHBAHGAHGIIAFFIHAGBDAHDCAHJHFGDJIEEBJDGDEFBHDGJGHEJDHBJDIBDAGIIBGAAHCJGFBCFEDBGDIBGACBJFDFADJEDFACDCDJCIDECEHJFBGCCBJAECGEBCBFAGEICBHAHIGGDBGEFE] +[2][6][2][DHDIHIGFJIFCHGDCFCDAJIDDAAJCEIGDAFCGCECIADFFHJBEIBBIFICGHIAFJCGJCHEBDIBFBAEDHFEDFJAGDGIBHFJIEFHGJHCEDAIBJDHIFDEDCFDIIFAEEGABDIBHCGCJDCHJJICEFIJHDBGCGJHAJBHFHIHCCHDJJBJFDHCIAFAJHBAECAIBHGHIFCDAGDBHGJDFIHGJIAFBIEFHCEFFCDEAGBBCAAHGCBCIAJCBDBCGGJHJEGBAGCFAFGIBHDGDHDCBCEHIJJAIDDCICCAAIGBFIFGBGIAAFEJFGFEEJFDDGJGGDECECJIBIIDDFEAIAEJGCJCBFDAGEAAEBGHFJAHFABGHHGDFBGJGEJFADJIGGGDCCBHABJHADDHGFIIDDEABFDBFEHJCECBCFAAJCBEIHAIJDCGDGCGDFFHCDEJCGCGGEIFBDHADJEAAGDBCAJGDCFABCJGGJCEGHAHFJEJCCAIHFCAEBCHHEHIHEGICGFCAHJAEFHAFIEA] + +FILTER(LONGBLOB) v2 <= NULL +code=0 rows=3 +[0][7][0][NULL] +[1][7][1][NULL] +[2][7][2][NULL] + diff --git a/plugin/handler_socket/regtest/test_01_lib/test19.pl b/plugin/handler_socket/regtest/test_01_lib/test19.pl new file mode 100644 index 00000000..2e5363c8 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test19.pl @@ -0,0 +1,190 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for filters + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use bigint; +use hstest; + +my $numeric_types = [ + [ 'TINYINT', -128, 127 ], + [ 'TINYINT UNSIGNED', 0, 255 ], + [ 'SMALLINT', -32768, 32768 ], + [ 'SMALLINT UNSIGNED', 0, 65535 ], + [ 'MEDIUMINT', -8388608, 8388607 ], + [ 'MEDIUMINT UNSIGNED', 0, 16777215 ], + [ 'INT', -2147483648, 2147483647 ], + [ 'INT UNSIGNED', 0, 4294967295 ], + [ 'BIGINT', -9223372036854775808, 9223372036854775807 ], + [ 'BIGINT UNSIGNED', 0, 18446744073709551615 ], + [ 'FLOAT', -32768, 32768 ], + [ 'DOUBLE', -2147483648, 2147483647 ], +]; +my $datetime_types = [ + [ 'DATE', '0000-00-00', '2011-01-01', '9999-12-31' ], + [ 'DATETIME', 0, '2011-01-01 18:30:25' ], + [ 'TIME', 0, '18:30:25' ], + [ 'YEAR(4)', 1901, 2011, 2155 ], + # [ 'TIMESTAMP', 0, 999999999 ], # DOES NOT WORK YET +]; +my $string_types = [ + [ 'CHAR(10)', undef, 1, 2, 5, 10 ], + [ 'VARCHAR(10)', undef, 1, 2, 5, 10 ], + [ 'BINARY(10)', undef, 1, 2, 5, 10 ], + [ 'VARBINARY(10)', undef, 1, 2, 5, 10 ], + [ 'CHAR(255)', undef, 1, 2, 5, 10, 100, 200, 255 ], + [ 'VARCHAR(255)', undef, 1, 2, 5, 10, 100, 200, 255 ], + [ 'VARCHAR(511)', undef, 1, 2, 5, 10, 100, 200, 511 ], + [ 'LONGTEXT', 500, 1, 2, 5, 10, 100, 200, 511 ], # NOT SUPPORTED YET + [ 'LONGBLOB', 500, 1, 2, 5, 10, 100, 200, 511 ], # NOT SUPPORTED YET +# [ 'VARCHAR(4096)', 500, 1, 2, 5, 10, 100, 200, 255, 256, 4095 ], +# [ 'VARCHAR(16383)', 500, 1, 2, 5, 10, 100, 200, 255, 256, 4095, 4096, 16383 ], +# [ 'VARBINARY(16383)', 500, 1, 2, 5, 10, 100, 200, 255, 256, 4095, 4096, 16383 ], +]; + +for my $rec (@$numeric_types) { + my ($typ, $minval, $maxval) = @$rec; + my @vals = (); + push(@vals, 0); + push(@vals, $maxval); + if ($minval != 0) { + push(@vals, $minval); + } + my $v1 = $minval; + my $v2 = $maxval; + for (my $i = 0; $i < 3; ++$i) { + $v1 /= 3; + $v2 /= 3; + push(@vals, int($v1)); + push(@vals, int($v2)); + } + my %vm = map { $_ => 1 } @vals; + @vals = sort { $a <=> $b } keys %vm; + push(@vals, undef); + test_one($typ, undef, \@vals); +} + +for my $rec (@$datetime_types) { + my ($typ, @vals) = @$rec; + push(@vals, undef); + test_one($typ, undef, \@vals); +} + +for my $rec (@$string_types) { + my ($typ, $keylen, @vs) = @$rec; + my @vals = (); + srand(999); + for my $len (@vs) { + my $s = ''; + my @arr = (); + # print "$len 1\n"; + for (my $i = 0; $i < $len; ++$i) { + my $v = int(rand(10)); + $arr[$i] = chr(65 + $v); + } + # print "2\n"; + push(@vals, join('', @arr)); + } + push(@vals, undef); + test_one($typ, $keylen, \@vals); +} + +my $hs; + +sub test_one { + my ($typ, $keylen, $values) = @_; + print "\n$typ -------------------------------------------------\n\n"; + my $keylen_str = ''; + if (defined($keylen)) { + $keylen_str = "($keylen)"; + } + my $dbh = hstest::init_testdb(); + my $table = 'hstesttbl'; + my $tablesize = 3; + $dbh->do( + "create table $table " . + "(k1 int not null, k2 int not null, " . + "v1 int not null, v2 $typ default null, " . + "primary key (k1, k2) ) engine = innodb"); + my $sth = $dbh->prepare("insert ignore into $table values (?,?,?,?)"); + for (my $i = 0; $i < $tablesize; ++$i) { + my $j = 0; + for my $v (@$values) { + $sth->execute($i, $j, $i, $v); + ++$j; + } + } + $hs = hstest::get_hs_connection(undef, 9999); + my $dbname = $hstest::conf{dbname}; + $hs->open_index(1, $dbname, $table, '', 'k1,k2,v1,v2', 'v2'); + my $minval = $values->[0]; + # select * ... where (k1, k2) >= ('', $minval) + exec_multi( + 4, "FILTER($typ) NO FILTER", + [ 1, '>=', [ '', $minval ], 1000, 0 ] + ); + for my $v (@$values) { + my $vstr = defined($v) ? $v : 'NULL'; + # select * ... where (k1, k2) >= ('', $minval) and v2 = $v + exec_multi( + 4, "FILTER($typ) v2 = $vstr", + [ 1, '>=', [ '', $minval ], 1000, 0, undef, undef, [ [ 'F', '=', 0, $v ] ] ] + ); + # select * ... where (k1, k2) >= ('', $minval) and v2 != $v + exec_multi( + 4, "FILTER($typ) v2 != $vstr", + [ 1, '>=', [ '', $minval ], 1000, 0, undef, undef, [ [ 'F', '!=', 0, $v ] ] ] + ); + # select * ... where (k1, k2) >= ('', $minval) and v2 >= $v + exec_multi( + 4, "FILTER($typ) v2 >= $vstr", + [ 1, '>=', [ '', $minval ], 1000, 0, undef, undef, [ [ 'F', '>=', 0, $v ] ] ] + ); + # select * ... where (k1, k2) >= ('', $minval) and v2 < $v + exec_multi( + 4, "FILTER($typ) v2 < $vstr", + [ 1, '>=', [ '', $minval ], 1000, 0, undef, undef, [ [ 'F', '<', 0, $v ] ] ] + ); + # select * ... where (k1, k2) >= ('', $minval) and v2 > $v + exec_multi( + 4, "FILTER($typ) v2 > $vstr", + [ 1, '>=', [ '', $minval ], 1000, 0, undef, undef, [ [ 'F', '>', 0, $v ] ] ] + ); + # select * ... where (k1, k2) >= ('', $minval) and v2 <= $v + exec_multi( + 4, "FILTER($typ) v2 <= $vstr", + [ 1, '>=', [ '', $minval ], 1000, 0, undef, undef, [ [ 'F', '<=', 0, $v ] ] ] + ); + } + undef $hs; +} + +sub exec_multi { + my $width = shift(@_); + my $mess = shift(@_); + print "$mess\n"; + my $mres = $hs->execute_multi(\@_); + for my $res (@$mres) { + my $code = shift(@$res); + my $nrows = $code == 0 ? scalar(@$res) / $width : 0; + print "code=$code rows=$nrows\n"; + my $i = 0; + for my $fld (@$res) { + $fld = 'NULL' if !defined($fld); + print "[$fld]"; + if (++$i >= $width) { + print "\n"; + $i = 0; + } + } + print "\n"; + } +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test20.expected b/plugin/handler_socket/regtest/test_01_lib/test20.expected new file mode 100644 index 00000000..996f6387 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test20.expected @@ -0,0 +1,2 @@ +open_index 1st r=1 +open_index 2nd r=0 diff --git a/plugin/handler_socket/regtest/test_01_lib/test20.pl b/plugin/handler_socket/regtest/test_01_lib/test20.pl new file mode 100644 index 00000000..96307e0a --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test20.pl @@ -0,0 +1,33 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for a bug that table mdl is not released when open_index is failed + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $dbname = $hstest::conf{dbname}; +my $table = 'hstesttbl'; + +$dbh->do("drop table if exists $table"); + +my $hs = hstest::get_hs_connection(); +my $r = $hs->open_index(1, $dbname, $table, '', 'k,v'); # fails +print "open_index 1st r=$r\n"; +undef $hs; + +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); + +$hs = hstest::get_hs_connection(); +$r = $hs->open_index(1, $dbname, $table, '', 'k,v'); # success +print "open_index 2nd r=$r\n"; + diff --git a/plugin/handler_socket/regtest/test_01_lib/test21.expected b/plugin/handler_socket/regtest/test_01_lib/test21.expected new file mode 100644 index 00000000..1d78f805 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test21.expected @@ -0,0 +1,11 @@ +HS +k10 v704-10 +k30 v52-30 +k40 v878-40 +k50 v682-50 +SQL +k10 v704-10 +k30 v52-30 +k40 v878-40 +k50 v682-50 +END diff --git a/plugin/handler_socket/regtest/test_01_lib/test21.pl b/plugin/handler_socket/regtest/test_01_lib/test21.pl new file mode 100644 index 00000000..34e9d439 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test21.pl @@ -0,0 +1,58 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for 'IN' + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, v varchar(30) not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . "-" . $i; + $sth->execute($k, $v); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v'); +my $vs = [ 'k10', 'k20x', 'k30', 'k40', 'k50' ]; +# select k,v from $table where k in $vs +my $r = $hs->execute_single(1, '=', [ '' ], 10000, 0, undef, undef, undef, + 0, $vs); +shift(@$r); +print "HS\n"; +my $len = scalar(@$r) / 2; +for (my $i = 0; $i < $len; ++$i) { + my $k = $r->[$i * 2]; + my $v = $r->[$i * 2 + 1]; + print "$k $v\n"; +} + +print "SQL\n"; +my $aref = $dbh->selectall_arrayref( + "select k,v from $table where k in ('k10', 'k20x', 'k30', 'k40', 'k50') " + . "order by k"); +for my $row (@$aref) { + my ($k, $v) = @$row; + print "$k $v\n"; +} +print "END\n"; + diff --git a/plugin/handler_socket/regtest/test_01_lib/test22.expected b/plugin/handler_socket/regtest/test_01_lib/test22.expected new file mode 100644 index 00000000..5ad2bfae --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test22.expected @@ -0,0 +1,9 @@ +HS +k10 v704-10 1 +k30 v52-30 1 +k50 v682-50 1 +SQL +k10 v704-10 1 +k30 v52-30 1 +k50 v682-50 1 +END diff --git a/plugin/handler_socket/regtest/test_01_lib/test22.pl b/plugin/handler_socket/regtest/test_01_lib/test22.pl new file mode 100644 index 00000000..370d16d6 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test22.pl @@ -0,0 +1,61 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for 'IN' and filters + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, " . + "v varchar(30) not null, v2 int not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . "-" . $i; + my $v2 = ($i / 10) % 2; + $sth->execute($k, $v, $v2); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v,v2', 'v2'); +my $vs = [ 'k10', 'k20x', 'k30', 'k40', 'k50' ]; +# select k,v,v2 from $table where k in $vs +my $r = $hs->execute_single(1, '=', [ '' ], 10000, 0, undef, undef, + [['F', '=', 0, '1']], 0, $vs); +shift(@$r); +print "HS\n"; +my $len = scalar(@$r) / 3; +for (my $i = 0; $i < $len; ++$i) { + my $k = $r->[$i * 3]; + my $v = $r->[$i * 3 + 1]; + my $v2 = $r->[$i * 3 + 2]; + print "$k $v $v2\n"; +} + +print "SQL\n"; +my $aref = $dbh->selectall_arrayref( + "select k,v,v2 from $table where k in ('k10', 'k20x', 'k30', 'k40', 'k50') " + . "and v2 = '1' order by k"); +for my $row (@$aref) { + my ($k, $v, $v2) = @$row; + print "$k $v $v2\n"; +} +print "END\n"; + diff --git a/plugin/handler_socket/regtest/test_01_lib/test23.expected b/plugin/handler_socket/regtest/test_01_lib/test23.expected new file mode 100644 index 00000000..16ed1884 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test23.expected @@ -0,0 +1,101 @@ +HS +k0 v102-0 0 +k1 v635-1 0 +k10 MOD 1 +k11 v751-11 1 +k12 v367-12 1 +k13 v400-13 1 +k14 v397-14 1 +k15 v170-15 1 +k16 v719-16 1 +k17 v734-17 1 +k18 v587-18 1 +k19 v494-19 1 +k2 v803-2 0 +k20 v523-20 0 +k21 v954-21 0 +k22 v433-22 0 +k23 v820-23 0 +k24 v283-24 0 +k25 v837-25 0 +k26 v205-26 0 +k27 v415-27 0 +k28 v545-28 0 +k29 v583-29 0 +k3 v925-3 0 +k30 MOD 1 +k31 v323-31 1 +k32 v614-32 1 +k33 v679-33 1 +k34 v805-34 1 +k35 v451-35 1 +k36 v115-36 1 +k37 v269-37 1 +k38 v218-38 1 +k39 v617-39 1 +k4 v775-4 0 +k40 v878-40 0 +k41 v345-41 0 +k42 v512-42 0 +k43 v969-43 0 +k44 v408-44 0 +k45 v291-45 0 +k46 v858-46 0 +k47 v953-47 0 +k48 v710-48 0 +k49 v142-49 0 +k5 v537-5 0 +k50 MOD 1 +k51 v934-51 1 +k52 v621-52 1 +k53 v965-53 1 +k54 v574-54 1 +k55 v204-55 1 +k56 v298-56 1 +k57 v134-57 1 +k58 v983-58 1 +k59 v444-59 1 +k6 v592-6 0 +k60 v144-60 0 +k61 v152-61 0 +k62 v187-62 0 +k63 v215-63 0 +k64 v8-64 0 +k65 v697-65 0 +k66 v651-66 0 +k67 v280-67 0 +k68 v701-68 0 +k69 v537-69 0 +k7 v414-7 0 +k70 v413-70 1 +k71 v69-71 1 +k72 v86-72 1 +k73 v822-73 1 +k74 v670-74 1 +k75 v370-75 1 +k76 v806-76 1 +k77 v688-77 1 +k78 v26-78 1 +k79 v66-79 1 +k8 v590-8 0 +k80 v802-80 0 +k81 v171-81 0 +k82 v557-82 0 +k83 v847-83 0 +k84 v777-84 0 +k85 v730-85 0 +k86 v987-86 0 +k87 v115-87 0 +k88 v646-88 0 +k89 v496-89 0 +k9 v302-9 0 +k90 v120-90 1 +k91 v684-91 1 +k92 v374-92 1 +k93 v65-93 1 +k94 v370-94 1 +k95 v174-95 1 +k96 v828-96 1 +k97 v867-97 1 +k98 v759-98 1 +k99 v703-99 1 diff --git a/plugin/handler_socket/regtest/test_01_lib/test23.pl b/plugin/handler_socket/regtest/test_01_lib/test23.pl new file mode 100644 index 00000000..d9bd0381 --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test23.pl @@ -0,0 +1,53 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for 'IN', filters, and modifications + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (k varchar(30) primary key, " . + "v varchar(30) not null, v2 int not null) " . + "engine = innodb"); +srand(999); + +my %valmap = (); + +my $sth = $dbh->prepare("insert into $table values (?,?,?)"); +for (my $i = 0; $i < $tablesize; ++$i) { + my $k = "k" . $i; + my $v = "v" . int(rand(1000)) . "-" . $i; + my $v2 = ($i / 10) % 2; + $sth->execute($k, $v, $v2); + $valmap{$k} = $v; +} + +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(1, $dbname, $table, '', 'k,v,v2', 'v2'); +$hs->open_index(2, $dbname, $table, '', 'v', 'v2'); +my $vs = [ 'k10', 'k20x', 'k30', 'k40', 'k50' ]; +# update $table set v = 'MOD' where k in $vs and v2 = '1' +my $r = $hs->execute_single(2, '=', [ '' ], 10000, 0, 'U', [ 'MOD' ], + [['F', '=', 0, '1']], 0, $vs); +$r = $hs->execute_single(1, '>=', [ '' ], 10000, 0); +shift(@$r); +print "HS\n"; +my $len = scalar(@$r) / 3; +for (my $i = 0; $i < $len; ++$i) { + my $k = $r->[$i * 3]; + my $v = $r->[$i * 3 + 1]; + my $v2 = $r->[$i * 3 + 2]; + print "$k $v $v2\n"; +} + diff --git a/plugin/handler_socket/regtest/test_01_lib/test24.expected b/plugin/handler_socket/regtest/test_01_lib/test24.expected new file mode 100644 index 00000000..5d07e01b --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test24.expected @@ -0,0 +1,2 @@ +HS +0 0 diff --git a/plugin/handler_socket/regtest/test_01_lib/test24.pl b/plugin/handler_socket/regtest/test_01_lib/test24.pl new file mode 100644 index 00000000..f4e3bb3f --- /dev/null +++ b/plugin/handler_socket/regtest/test_01_lib/test24.pl @@ -0,0 +1,35 @@ +#!/usr/bin/env perl + +# vim:sw=2:ai + +# test for issue #78 + +BEGIN { + push @INC, "../common/"; +}; + +use strict; +use warnings; +use hstest; + +my $dbh = hstest::init_testdb(); +my $table = 'hstesttbl'; +my $tablesize = 100; +$dbh->do( + "create table $table (" . + "id bigint(20) not null auto_increment, " . + "t1 timestamp not null default current_timestamp, " . + "primary key (id)" . + ") engine = innodb"); +srand(999); + +my %valmap = (); + +my $hs = hstest::get_hs_connection(undef, 9999); +my $dbname = $hstest::conf{dbname}; +$hs->open_index(0, $dbname, $table, 'PRIMARY', 'id,t1'); +my $res = $hs->execute_single(0, '+', [ 321 ], 0, 0); +die $hs->get_error() if $res->[0] != 0; +print "HS\n"; +print join(' ', @$res) . "\n"; + |