From 618c68f9c2cbf5f29f3cafe7330a78120deccb0e Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Fri, 12 Jun 2026 23:24:09 +0000 Subject: [PATCH 01/19] Normalize test queries These updates to the test suite slightly relax SQL comparisons so that non-semantic differences in output from the query parser backend will still be considered valid. This will allow for testing multiple parser backends. --- src/qproc/testQueryAnaAggregation.cc | 7 +-- src/qproc/testQueryAnaGeneral.cc | 28 ++++++---- src/qproc/testQueryAnaOrderBy.cc | 8 ++- src/tests/ParserNormalization.h | 82 ++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 src/tests/ParserNormalization.h diff --git a/src/qproc/testQueryAnaAggregation.cc b/src/qproc/testQueryAnaAggregation.cc index a2b3f3ee78..1736b97b78 100644 --- a/src/qproc/testQueryAnaAggregation.cc +++ b/src/qproc/testQueryAnaAggregation.cc @@ -34,8 +34,6 @@ // System headers #include -// Third-party headers - // Boost unit test header #define BOOST_TEST_MODULE QueryAnaAggregation #include @@ -48,6 +46,7 @@ #include "query/QueryContext.h" #include "query/SelectStmt.h" #include "sql/SqlConfig.h" +#include "tests/ParserNormalization.h" #include "tests/QueryAnaFixture.h" using lsst::qserv::mysql::MySqlConfig; @@ -89,7 +88,7 @@ BOOST_AUTO_TEST_CASE(Aggregate) { BOOST_REQUIRE(ss.hasGroupBy()); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - BOOST_CHECK_EQUAL(expPar, parallel); + CHECK_EQUAL_NORMALIZED(expPar, parallel); } BOOST_AUTO_TEST_CASE(Avg) { @@ -111,7 +110,7 @@ BOOST_AUTO_TEST_CASE(Avg) { BOOST_CHECK(!context->hasSubChunks()); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - BOOST_CHECK_EQUAL(expPar, parallel); + CHECK_EQUAL_NORMALIZED(expPar, parallel); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/qproc/testQueryAnaGeneral.cc b/src/qproc/testQueryAnaGeneral.cc index 5cd6711350..828eb07b61 100644 --- a/src/qproc/testQueryAnaGeneral.cc +++ b/src/qproc/testQueryAnaGeneral.cc @@ -62,6 +62,7 @@ #include "query/SecIdxRestrictor.h" #include "query/SelectStmt.h" #include "sql/SqlConfig.h" +#include "tests/ParserNormalization.h" #include "tests/QueryAnaFixture.h" using lsst::qserv::StringPair; @@ -87,7 +88,7 @@ char const* const NOT_EVALUABLE_MSG = "AnalysisError:Query involves " "partitioned table joins that Qserv does not know how to evaluate " "using only partition-local data"; -} +} // namespace //////////////////////////////////////////////////////////////////////// // CppParser basic tests //////////////////////////////////////////////////////////////////////// @@ -110,7 +111,7 @@ BOOST_AUTO_TEST_CASE(TrivialSub) { BOOST_CHECK(!context->needsMerge); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - BOOST_CHECK_EQUAL(expected, parallel); + CHECK_EQUAL_NORMALIZED(expected, parallel); } BOOST_AUTO_TEST_CASE(NoContext) { @@ -240,9 +241,9 @@ BOOST_AUTO_TEST_CASE(RestrictorNeighborCount) { // DEBUG // std::copy(first.queries.begin(), first.queries.end(), std::ostream_iterator(std::cout, // "\n\n")); - BOOST_CHECK_EQUAL(first->queries[0], expected_100_subchunk_core); + CHECK_EQUAL_NORMALIZED(first->queries[0], expected_100_subchunk_core); BOOST_REQUIRE(numQueries > 1); - BOOST_CHECK_EQUAL(first->queries[1], expected_100_subchunk_overlap); + CHECK_EQUAL_NORMALIZED(first->queries[1], expected_100_subchunk_overlap); BOOST_REQUIRE_EQUAL(first->subChunkIds.size(), 3u); BOOST_CHECK_EQUAL(first->subChunkIds[0], 100000); BOOST_CHECK_EQUAL(first->subChunkIds[1], 100010); @@ -271,7 +272,7 @@ BOOST_AUTO_TEST_CASE(Triple) { // SelectStmt const& ss = qs->getStmt(); BOOST_CHECK(context); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - BOOST_CHECK_EQUAL(parallel, expected); + CHECK_EQUAL_NORMALIZED(parallel, expected); auto first = qs->buildChunkQuerySpec(qs->makeQueryTemplates(), *qs->cQueryBegin()); BOOST_REQUIRE_EQUAL(first->subChunkIds.size(), 3u); BOOST_CHECK_EQUAL(first->subChunkIds[0], 100000); @@ -375,13 +376,18 @@ BOOST_DATA_TEST_CASE(ObjectSourceJoin_ScisqlRestrictor, SCISQL_RESTRICTOR_TEST_C BOOST_REQUIRE(context->areaRestrictors); BOOST_CHECK_EQUAL(context->areaRestrictors->size(), 1U); auto restrictorFunc = context->areaRestrictors->front(); - BOOST_CHECK_EQUAL(*restrictorFunc, *queryData.expectedRestrictor); + + std::ostringstream os1, os2; + os1 << *restrictorFunc; + os2 << *queryData.expectedRestrictor; + + CHECK_EQUAL_NORMALIZED(os1.str(), os2.str()); } else { BOOST_CHECK_EQUAL(nullptr, context->areaRestrictors); } BOOST_CHECK_EQUAL(nullptr, context->secIdxRestrictors); std::string actual = queryAnaHelper.buildFirstParallelQuery(); - BOOST_CHECK_EQUAL(actual, queryData.expectedStmt); + CHECK_EQUAL_NORMALIZED(actual, queryData.expectedStmt); } BOOST_AUTO_TEST_CASE(ScisqlWrongNumberOfParameters) { @@ -1014,7 +1020,7 @@ BOOST_AUTO_TEST_CASE(FuncExprPred) { qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns( {{"LSST", {{"Object", {"objectId", "ra_Test", "decl_Test", "gFlux_PS", "rFlux_PS"}}}}})); queries = queryAnaHelper.getInternalQueries(qsTest, stmt); - BOOST_CHECK_EQUAL(queries[0], expected); + CHECK_EQUAL_NORMALIZED(queries[0], expected); } BOOST_AUTO_TEST_SUITE_END() @@ -1055,7 +1061,7 @@ BOOST_AUTO_TEST_CASE(MatchTableWithWhere) { std::shared_ptr qs = queryAnaHelper.buildQuerySession(qsTest, stmt); std::string actual = queryAnaHelper.buildFirstParallelQuery(false); - BOOST_CHECK_EQUAL(actual, expected); + CHECK_EQUAL_NORMALIZED(actual, expected); } BOOST_AUTO_TEST_SUITE_END() @@ -1389,9 +1395,9 @@ BOOST_AUTO_TEST_CASE(Case01_1081) { int numQueries = first->queries.size(); BOOST_CHECK_EQUAL(numQueries, 2); BOOST_REQUIRE(numQueries > 0); - BOOST_CHECK_EQUAL(first->queries[0], expected_100_subchunk_core); + CHECK_EQUAL_NORMALIZED(first->queries[0], expected_100_subchunk_core); BOOST_REQUIRE(numQueries > 1); - BOOST_CHECK_EQUAL(first->queries[1], expected_100_subchunk_overlap); + CHECK_EQUAL_NORMALIZED(first->queries[1], expected_100_subchunk_overlap); // JOIN syntax, "is NULL" syntax BOOST_REQUIRE_EQUAL(first->subChunkIds.size(), 3u); BOOST_CHECK_EQUAL(first->subChunkIds[0], 100000); diff --git a/src/qproc/testQueryAnaOrderBy.cc b/src/qproc/testQueryAnaOrderBy.cc index a5d2b91747..bc520b8f8d 100644 --- a/src/qproc/testQueryAnaOrderBy.cc +++ b/src/qproc/testQueryAnaOrderBy.cc @@ -46,6 +46,7 @@ #include "qproc/QuerySession.h" #include "query/SelectStmt.h" #include "sql/SqlConfig.h" +#include "tests/ParserNormalization.h" #include "tests/QueryAnaHelper.h" #include "tests/testKvMap.h" @@ -213,16 +214,17 @@ BOOST_DATA_TEST_CASE(OrderByTest, DATA, data) { auto querySession = queryAnaHelper.buildQuerySession(qsTest, data.stmt); BOOST_REQUIRE_NO_THROW( - BOOST_CHECK_EQUAL(queryAnaHelper.buildFirstParallelQuery(), data.expectedParallel)); + CHECK_EQUAL_NORMALIZED(queryAnaHelper.buildFirstParallelQuery(), data.expectedParallel)); if (querySession->needsMerge()) { - BOOST_CHECK_EQUAL(querySession->getMergeStmt()->getQueryTemplate().sqlFragment(), data.expectedMerge); + CHECK_EQUAL_NORMALIZED(querySession->getMergeStmt()->getQueryTemplate().sqlFragment(), + data.expectedMerge); } else { BOOST_CHECK_EQUAL(data.expectedMerge.empty(), true); BOOST_CHECK_EQUAL(querySession->getMergeStmt(), nullptr); } - BOOST_CHECK_EQUAL(querySession->getResultOrderBy(), data.expectedProxyOrderBy); + CHECK_EQUAL_NORMALIZED(querySession->getResultOrderBy(), data.expectedProxyOrderBy); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/ParserNormalization.h b/src/tests/ParserNormalization.h new file mode 100644 index 0000000000..16d8bfb007 --- /dev/null +++ b/src/tests/ParserNormalization.h @@ -0,0 +1,82 @@ +/* + * LSST Data Management System + * + * This product includes software developed by the + * LSST Project (http://www.lsst.org/). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +/** + * @file + * + * @brief Temporary helpers for comparing semantically equivalent parser output. + * + * WARNING: these helper functions are intended to normalize SQL strings from different parser backends, but + * are simplistic in nature (e.g., basic string replacement to achieve normalization). Consider this a + * temporary compatibility layer to allow multiple parser backends to coexist during our transition to a new + * parser backend. + * + * @todo Remove these functions and restore original test behavior to reflect the new parser backend. Leaving + * this compatibility layer is liable to result in bugs down the line due to its simplistic normalization + * process. The alternative would be to write a production-grade SQL normalizer, but it's doubtful that would + * be worth the engineering effort as we're unlikely to need to change the parser backend in the near future. + */ + +#ifndef LSST_QSERV_TESTS_PARSERNORMALIZATION_H +#define LSST_QSERV_TESTS_PARSERNORMALIZATION_H + +// System headers +#include +#include +#include +#include +#include + +// Third-party headers +#include "boost/algorithm/string.hpp" + +// TODO: simplest path for migrating away from this helper will be to delete the macro below. +#define CHECK_EQUAL_NORMALIZED(actual, expected) \ + BOOST_CHECK_EQUAL(::lsst::qserv::tests::normalizeParserEquivalentSql(actual), \ + ::lsst::qserv::tests::normalizeParserEquivalentSql(expected)) + +namespace lsst::qserv::tests { + +inline std::string normalizeNumericLiterals(std::string const& value) { + static std::regex const numericLiteral( + R"((^|[^A-Za-z0-9_`\.])([+-]?(?:(?:[0-9]+\.[0-9]*|\.[0-9]+|[0-9]+)(?:[eE][+-]?[0-9]+)?))(?=$|[^A-Za-z0-9_`\.]))"); + std::string result; + std::string::const_iterator last = value.begin(); + for (std::sregex_iterator i(value.begin(), value.end(), numericLiteral), end; i != end; ++i) { + std::smatch const& match = *i; + result.append(last, match[1].first); + result += match[1].str(); + + std::string const token = match[2].str(); + if (token.find_first_of(".eE") == std::string::npos) { + result += token; + } else { + std::ostringstream os; + os << std::setprecision(std::numeric_limits::max_digits10) << std::stod(token); + result += os.str(); + } + last = match[2].second; + } + result.append(last, value.end()); + return result; +} + +inline std::string normalizeParserEquivalentSql(std::string value) { + boost::replace_all(value, "INNER JOIN", "JOIN"); + boost::replace_all(value, "<>", "!="); + boost::replace_all(value, " ASC", ""); + return normalizeNumericLiterals(value); +} + +} // namespace lsst::qserv::tests + +#endif // LSST_QSERV_TESTS_PARSERNORMALIZATION_H \ No newline at end of file From 03403cd20593d749eb84f8f7fa2c0208d1a08355 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Mon, 15 Jun 2026 21:58:56 +0000 Subject: [PATCH 02/19] TEMPORARY: add hyrise source to extern This will be moved out of the qserv source tree later, but allows us to keep this branch self-contained as changes land in the parser and adapter layers. --- extern/hyrise_sql_parser/.clang-format | 87 + .../.github/workflows/ci.yml | 111 + extern/hyrise_sql_parser/.gitignore | 53 + extern/hyrise_sql_parser/CMakeLists.txt | 42 + extern/hyrise_sql_parser/LICENSE | 21 + extern/hyrise_sql_parser/Makefile | 172 + extern/hyrise_sql_parser/README.md | 63 + extern/hyrise_sql_parser/benchmark/README.md | 14 + .../hyrise_sql_parser/benchmark/benchmark.cpp | 28 + .../benchmark/benchmark_utils.cpp | 44 + .../benchmark/benchmark_utils.h | 41 + .../benchmark/parser_benchmark.cpp | 87 + .../hyrise_sql_parser/benchmark/queries.cpp | 47 + extern/hyrise_sql_parser/benchmark/queries.h | 56 + extern/hyrise_sql_parser/docs/.gitignore | 1 + extern/hyrise_sql_parser/docs/README.md | 14 + extern/hyrise_sql_parser/docs/basic-usage.md | 70 + extern/hyrise_sql_parser/docs/dev-docs.md | 63 + .../docs/known-limitations.md | 18 + .../hyrise_sql_parser/docs/syntax-support.md | 53 + .../docs/technical_documentation.pdf | Bin 0 -> 284530 bytes extern/hyrise_sql_parser/example/.gitignore | 1 + extern/hyrise_sql_parser/example/Makefile | 6 + extern/hyrise_sql_parser/example/example.cpp | 41 + extern/hyrise_sql_parser/format.sh | 24 + extern/hyrise_sql_parser/src/SQLParser.cpp | 74 + extern/hyrise_sql_parser/src/SQLParser.h | 35 + .../hyrise_sql_parser/src/SQLParserResult.cpp | 82 + .../hyrise_sql_parser/src/SQLParserResult.h | 94 + .../hyrise_sql_parser/src/parser/.gitignore | 2 + extern/hyrise_sql_parser/src/parser/Makefile | 39 + .../src/parser/bison_parser.cpp | 6281 +++++++++++++++++ .../src/parser/bison_parser.h | 386 + .../src/parser/bison_parser.y | 1547 ++++ .../src/parser/flex_lexer.cpp | 5720 +++++++++++++++ .../hyrise_sql_parser/src/parser/flex_lexer.h | 739 ++ .../hyrise_sql_parser/src/parser/flex_lexer.l | 308 + .../src/parser/keywordlist_generator.py | 46 + .../src/parser/parser_typedef.h | 33 + .../src/parser/sql_keywords.txt | 163 + .../src/sql/AlterStatement.h | 40 + extern/hyrise_sql_parser/src/sql/ColumnType.h | 43 + .../src/sql/CreateStatement.cpp | 152 + .../src/sql/CreateStatement.h | 103 + .../src/sql/DeleteStatement.h | 23 + .../hyrise_sql_parser/src/sql/DropStatement.h | 25 + .../src/sql/ExecuteStatement.h | 20 + .../src/sql/ExportStatement.h | 26 + extern/hyrise_sql_parser/src/sql/Expr.cpp | 339 + extern/hyrise_sql_parser/src/sql/Expr.h | 253 + .../src/sql/ImportExportOptions.h | 46 + .../src/sql/ImportStatement.h | 25 + .../src/sql/InsertStatement.h | 26 + .../src/sql/PrepareStatement.cpp | 12 + .../src/sql/PrepareStatement.h | 22 + .../src/sql/SQLStatement.cpp | 24 + .../hyrise_sql_parser/src/sql/SQLStatement.h | 51 + .../src/sql/SelectStatement.h | 116 + .../hyrise_sql_parser/src/sql/ShowStatement.h | 23 + extern/hyrise_sql_parser/src/sql/Table.h | 70 + .../src/sql/TransactionStatement.h | 21 + .../src/sql/UpdateStatement.h | 27 + .../hyrise_sql_parser/src/sql/statements.cpp | 442 ++ extern/hyrise_sql_parser/src/sql/statements.h | 18 + .../hyrise_sql_parser/src/util/sqlhelper.cpp | 509 ++ extern/hyrise_sql_parser/src/util/sqlhelper.h | 40 + .../test/auto_query_file_test.cpp | 97 + .../hyrise_sql_parser/test/prepare_tests.cpp | 84 + .../test/queries/queries-bad.sql | 112 + .../test/queries/queries-good.sql | 122 + .../test/queries/tpc-h-01.sql | 9 + .../test/queries/tpc-h-02.sql | 10 + .../test/queries/tpc-h-03.sql | 7 + .../test/queries/tpc-h-04.sql | 6 + .../test/queries/tpc-h-05.sql | 9 + .../test/queries/tpc-h-06.sql | 5 + .../test/queries/tpc-h-07.sql | 11 + .../test/queries/tpc-h-08.sql | 10 + .../test/queries/tpc-h-09.sql | 10 + .../test/queries/tpc-h-10.sql | 9 + .../test/queries/tpc-h-11.sql | 10 + .../test/queries/tpc-h-12.sql | 10 + .../test/queries/tpc-h-13.sql | 8 + .../test/queries/tpc-h-14.sql | 5 + .../test/queries/tpc-h-15.sql | 15 + .../test/queries/tpc-h-16.sql | 9 + .../test/queries/tpc-h-17.sql | 4 + .../test/queries/tpc-h-18.sql | 7 + .../test/queries/tpc-h-19.sql | 9 + .../test/queries/tpc-h-20.sql | 8 + .../test/queries/tpc-h-21.sql | 11 + .../test/queries/tpc-h-22.sql | 9 + .../hyrise_sql_parser/test/select_tests.cpp | 1322 ++++ extern/hyrise_sql_parser/test/sql_asserts.h | 19 + extern/hyrise_sql_parser/test/sql_parser.cpp | 44 + extern/hyrise_sql_parser/test/sql_tests.cpp | 793 +++ extern/hyrise_sql_parser/test/test.sh | 102 + .../test/thirdparty/microtest/microtest.h | 207 + extern/hyrise_sql_parser/test/tpc_h_tests.cpp | 111 + 99 files changed, 22406 insertions(+) create mode 100644 extern/hyrise_sql_parser/.clang-format create mode 100644 extern/hyrise_sql_parser/.github/workflows/ci.yml create mode 100644 extern/hyrise_sql_parser/.gitignore create mode 100644 extern/hyrise_sql_parser/CMakeLists.txt create mode 100644 extern/hyrise_sql_parser/LICENSE create mode 100644 extern/hyrise_sql_parser/Makefile create mode 100644 extern/hyrise_sql_parser/README.md create mode 100644 extern/hyrise_sql_parser/benchmark/README.md create mode 100644 extern/hyrise_sql_parser/benchmark/benchmark.cpp create mode 100644 extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp create mode 100644 extern/hyrise_sql_parser/benchmark/benchmark_utils.h create mode 100644 extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp create mode 100644 extern/hyrise_sql_parser/benchmark/queries.cpp create mode 100644 extern/hyrise_sql_parser/benchmark/queries.h create mode 100644 extern/hyrise_sql_parser/docs/.gitignore create mode 100644 extern/hyrise_sql_parser/docs/README.md create mode 100644 extern/hyrise_sql_parser/docs/basic-usage.md create mode 100644 extern/hyrise_sql_parser/docs/dev-docs.md create mode 100644 extern/hyrise_sql_parser/docs/known-limitations.md create mode 100644 extern/hyrise_sql_parser/docs/syntax-support.md create mode 100644 extern/hyrise_sql_parser/docs/technical_documentation.pdf create mode 100644 extern/hyrise_sql_parser/example/.gitignore create mode 100644 extern/hyrise_sql_parser/example/Makefile create mode 100644 extern/hyrise_sql_parser/example/example.cpp create mode 100644 extern/hyrise_sql_parser/format.sh create mode 100644 extern/hyrise_sql_parser/src/SQLParser.cpp create mode 100644 extern/hyrise_sql_parser/src/SQLParser.h create mode 100644 extern/hyrise_sql_parser/src/SQLParserResult.cpp create mode 100644 extern/hyrise_sql_parser/src/SQLParserResult.h create mode 100644 extern/hyrise_sql_parser/src/parser/.gitignore create mode 100644 extern/hyrise_sql_parser/src/parser/Makefile create mode 100644 extern/hyrise_sql_parser/src/parser/bison_parser.cpp create mode 100644 extern/hyrise_sql_parser/src/parser/bison_parser.h create mode 100644 extern/hyrise_sql_parser/src/parser/bison_parser.y create mode 100644 extern/hyrise_sql_parser/src/parser/flex_lexer.cpp create mode 100644 extern/hyrise_sql_parser/src/parser/flex_lexer.h create mode 100644 extern/hyrise_sql_parser/src/parser/flex_lexer.l create mode 100644 extern/hyrise_sql_parser/src/parser/keywordlist_generator.py create mode 100644 extern/hyrise_sql_parser/src/parser/parser_typedef.h create mode 100644 extern/hyrise_sql_parser/src/parser/sql_keywords.txt create mode 100644 extern/hyrise_sql_parser/src/sql/AlterStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/ColumnType.h create mode 100644 extern/hyrise_sql_parser/src/sql/CreateStatement.cpp create mode 100644 extern/hyrise_sql_parser/src/sql/CreateStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/DeleteStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/DropStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/ExecuteStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/ExportStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/Expr.cpp create mode 100644 extern/hyrise_sql_parser/src/sql/Expr.h create mode 100644 extern/hyrise_sql_parser/src/sql/ImportExportOptions.h create mode 100644 extern/hyrise_sql_parser/src/sql/ImportStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/InsertStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp create mode 100644 extern/hyrise_sql_parser/src/sql/PrepareStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/SQLStatement.cpp create mode 100644 extern/hyrise_sql_parser/src/sql/SQLStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/SelectStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/ShowStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/Table.h create mode 100644 extern/hyrise_sql_parser/src/sql/TransactionStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/UpdateStatement.h create mode 100644 extern/hyrise_sql_parser/src/sql/statements.cpp create mode 100644 extern/hyrise_sql_parser/src/sql/statements.h create mode 100644 extern/hyrise_sql_parser/src/util/sqlhelper.cpp create mode 100644 extern/hyrise_sql_parser/src/util/sqlhelper.h create mode 100644 extern/hyrise_sql_parser/test/auto_query_file_test.cpp create mode 100644 extern/hyrise_sql_parser/test/prepare_tests.cpp create mode 100644 extern/hyrise_sql_parser/test/queries/queries-bad.sql create mode 100644 extern/hyrise_sql_parser/test/queries/queries-good.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-01.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-02.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-03.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-04.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-05.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-06.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-07.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-08.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-09.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-10.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-11.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-12.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-13.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-14.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-15.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-16.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-17.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-18.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-19.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-20.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-21.sql create mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-22.sql create mode 100644 extern/hyrise_sql_parser/test/select_tests.cpp create mode 100644 extern/hyrise_sql_parser/test/sql_asserts.h create mode 100644 extern/hyrise_sql_parser/test/sql_parser.cpp create mode 100644 extern/hyrise_sql_parser/test/sql_tests.cpp create mode 100644 extern/hyrise_sql_parser/test/test.sh create mode 100644 extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h create mode 100644 extern/hyrise_sql_parser/test/tpc_h_tests.cpp diff --git a/extern/hyrise_sql_parser/.clang-format b/extern/hyrise_sql_parser/.clang-format new file mode 100644 index 0000000000..685d73a054 --- /dev/null +++ b/extern/hyrise_sql_parser/.clang-format @@ -0,0 +1,87 @@ +--- +Language: Cpp +AccessModifierOffset: -1 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: true +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: true +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: true +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 120 +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IncludeCategories: + - Regex: '^<.*\.h>' + Priority: 1 + - Regex: '^<.*' + Priority: 2 + - Regex: '.*' + Priority: 3 +IndentCaseLabels: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: false +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Left +ReflowComments: false +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Auto +TabWidth: 8 +UseTab: Never +... diff --git a/extern/hyrise_sql_parser/.github/workflows/ci.yml b/extern/hyrise_sql_parser/.github/workflows/ci.yml new file mode 100644 index 0000000000..d9122e3b5d --- /dev/null +++ b/extern/hyrise_sql_parser/.github/workflows/ci.yml @@ -0,0 +1,111 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + +jobs: + build: + name: ${{matrix.name}} + runs-on: ${{matrix.os}} + container: ${{matrix.container}} + env: + CC: ${{matrix.cc}} + CXX: ${{matrix.cxx}} + defaults: + run: + shell: bash + strategy: + fail-fast: false + matrix: + include: + - name: gcc-6 + cc: gcc-6 + cxx: g++-6 + os: ubuntu-latest + container: ubuntu:18.04 + + - name: gcc-14 + cc: gcc-14 + cxx: g++-14 + os: ubuntu-latest + container: ubuntu:24.04 + # We need relaxed builds for debug mode with current GCC versions, see #218. + build_options: "relaxed_build=on" + + - name: clang-19 + cc: clang-19 + cxx: clang++-19 + os: ubuntu-latest + container: ubuntu:24.04 + + - name: clang-macOS + cc: clang + cxx: clang++ + os: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + if: matrix.name != 'gcc-6' + + - name: Checkout (Ubuntu 18.04) + if: matrix.name == 'gcc-6' + # Recent versions of Github's checkout action do not run on older Ubuntu versions because they use a too recent + # Node.js version. Thus, we have to checkout the code manually. + # Doing so is a bit tricky when it comes to PRs from forks (see #249 for details). The general idea here is that + # we access Github's context information for the event triggering the action's execution and use some details on + # the PR's HEAD if given. Otherwise (for executions due to main branch updates), we still use the provided + # environment variables. + run: | + apt-get update + apt-get install -y git + git config --global --add safe.directory '*' + git clone $(awk -v a=${{github.event.pull_request.head.repo.clone_url}} -v b="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}" 'BEGIN { if (a == "") { print b } else { print a } }') . + git checkout $GITHUB_HEAD_REF + + - name: Setup (macOS) + if: matrix.name == 'clang-macOS' + run: | + brew install bison flex + echo "BISON=$(brew --prefix bison)/bin/bison" >> $GITHUB_ENV + echo "FLEX=$(brew --prefix flex)/bin/flex" >> $GITHUB_ENV + + - name: Setup (Ubuntu) + if: matrix.name != 'clang-macOS' + run: | + apt-get update + apt-get install --no-install-recommends -y bison flex ${CC} ${CXX} make valgrind + echo "BISON=bison" >> $GITHUB_ENV + echo "FLEX=flex" >> $GITHUB_ENV + + - name: System Information + run: | + awk -v a=$(uname) 'BEGIN { a == "Linux" ? system("cat /etc/issue") : system("sw_vers") }' + ${CC} --version + ${CXX} --version + ${BISON} --version + ${FLEX} --version + awk -v a=$(uname) 'BEGIN { if (a == "Linux") system("valgrind --version") }' + + - name: Build Parser + run: | + make -j $(nproc) + BISON=${BISON} FLEX=${FLEX} make test + make test_example + + - name: Build Parser and Lexer from Scratch + run: | + BISON=${BISON} FLEX=${FLEX} make cleanall + BISON=${BISON} FLEX=${FLEX} make -j $(nproc) + BISON=${BISON} FLEX=${FLEX} make test + make test_example + + - name: Build Parser and Lexer from Scratch (Debug) + run: | + BISON=${BISON} FLEX=${FLEX} make cleanall + BISON=${BISON} FLEX=${FLEX} make -j $(nproc) mode=debug ${{matrix.build_options}} + BISON=${BISON} FLEX=${FLEX} make test + make test_example diff --git a/extern/hyrise_sql_parser/.gitignore b/extern/hyrise_sql_parser/.gitignore new file mode 100644 index 0000000000..489d517475 --- /dev/null +++ b/extern/hyrise_sql_parser/.gitignore @@ -0,0 +1,53 @@ +build/ +utils/ +bin/ +lib-test/ + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# IDE +.idea/ + +# CMAKE +cmake-build-debug/ + +*.cpp.orig +*.h.orig + +# Vim Swap Files +*.swp + +*.csv + +# macOS compilation dirs +*.dSYM +.DS_STORE + +.vscode/* diff --git a/extern/hyrise_sql_parser/CMakeLists.txt b/extern/hyrise_sql_parser/CMakeLists.txt new file mode 100644 index 0000000000..1ac66bff1f --- /dev/null +++ b/extern/hyrise_sql_parser/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.12) + +project(hyrise_sql_parser + LANGUAGES CXX +) + +add_library(sqlparser STATIC) +add_library(hyrise_sql_parser::sqlparser ALIAS sqlparser) + +target_compile_features(sqlparser PUBLIC cxx_std_17) +set_target_properties(sqlparser PROPERTIES + POSITION_INDEPENDENT_CODE ON +) + +target_include_directories(sqlparser PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +target_sources(sqlparser PRIVATE + src/SQLParser.cpp + src/SQLParserResult.cpp + src/parser/bison_parser.cpp + src/parser/flex_lexer.cpp + src/sql/CreateStatement.cpp + src/sql/Expr.cpp + src/sql/PrepareStatement.cpp + src/sql/SQLStatement.cpp + src/sql/statements.cpp + src/util/sqlhelper.cpp +) + +set_source_files_properties( + src/parser/bison_parser.cpp + PROPERTIES COMPILE_OPTIONS "-Wno-unused-but-set-variable;-Wno-free-nonheap-object" +) + +set_source_files_properties( + src/parser/flex_lexer.cpp + PROPERTIES COMPILE_OPTIONS "-Wno-sign-compare;-Wno-register" +) + +install(TARGETS sqlparser) diff --git a/extern/hyrise_sql_parser/LICENSE b/extern/hyrise_sql_parser/LICENSE new file mode 100644 index 0000000000..92b3a42844 --- /dev/null +++ b/extern/hyrise_sql_parser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012-2017 Hasso-Plattner-Institut + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extern/hyrise_sql_parser/Makefile b/extern/hyrise_sql_parser/Makefile new file mode 100644 index 0000000000..4b036045a9 --- /dev/null +++ b/extern/hyrise_sql_parser/Makefile @@ -0,0 +1,172 @@ +all: library + +####################################### +############# Directories ############# +####################################### +BIN = bin +SRC = src +SRCPARSER = src/parser + +INSTALL = /usr/local + +###################################### +############ Compile Mode ############ +###################################### +# Set compile mode to -g or -O3. +# Debug mode: make mode=debug + +mode ?= release +MODE_LOG = "" +OPT_FLAG = +ifeq ($(mode), debug) + OPT_FLAG = -g + MODE_LOG = "Building in \033[1;31mdebug\033[0m mode" +else + OPT_FLAG = -O3 + MODE_LOG = "Building in \033[0;32mrelease\033[0m mode ('make mode=debug' for debug mode)" +endif + +GMAKE = make mode=$(mode) + + + +####################################### +############### Library ############### +####################################### +NAME := sqlparser +PARSER_CPP = $(SRCPARSER)/bison_parser.cpp $(SRCPARSER)/flex_lexer.cpp +PARSER_H = $(SRCPARSER)/bison_parser.h $(SRCPARSER)/flex_lexer.h +LIB_CFLAGS = -std=c++17 $(OPT_FLAG) + +relaxed_build ?= "off" +ifeq ($(relaxed_build), on) + $(warning $(NAME) will be built with most compiler warnings deactivated. This is fine if you want to test $(NAME) but will become an issue when you want to contribute code.) +else + LIB_CFLAGS += -Wall -Werror + # Clang: ensure files end with newline. Missing final newlines here triggered + # -Wnewline-eof warnings in downstream projects (e.g., Hyrise). + ifneq (,$(findstring clang,$(shell $(CXX) --version 2>/dev/null))) + LIB_CFLAGS += -Wnewline-eof + endif +endif + +static ?= no +ifeq ($(static), yes) + LIB_BUILD = lib$(NAME).a + LIBLINKER = $(AR) + LIB_LFLAGS = rs +else + LIB_BUILD = lib$(NAME).so + LIBLINKER = $(CXX) + LIB_CFLAGS += -fPIC + LIB_LFLAGS = -shared -o +endif +LIB_CPP = $(sort $(shell find $(SRC) -name '*.cpp' -not -path "$(SRCPARSER)/*") $(PARSER_CPP)) +LIB_H = $(shell find $(SRC) -name '*.h' -not -path "$(SRCPARSER)/*") $(PARSER_H) +LIB_ALL = $(shell find $(SRC) -name '*.cpp' -not -path "$(SRCPARSER)/*") $(shell find $(SRC) -name '*.h' -not -path "$(SRCPARSER)/*") +LIB_OBJ = $(LIB_CPP:%.cpp=%.o) + +library: $(LIB_BUILD) + +$(LIB_BUILD): $(LIB_OBJ) + $(LIBLINKER) $(LIB_LFLAGS) $(LIB_BUILD) $(LIB_OBJ) + +# The auto-generated code from bison and flex contains some parts the compiler complains about with -Wall. +$(SRCPARSER)/flex_lexer.o: $(SRCPARSER)/flex_lexer.cpp $(SRCPARSER)/bison_parser.cpp + $(CXX) $(LIB_CFLAGS) -c -o $@ $< -Wno-sign-compare -Wno-unneeded-internal-declaration -Wno-register +$(SRCPARSER)/bison_parser.o: $(SRCPARSER)/bison_parser.cpp + $(CXX) $(LIB_CFLAGS) -c -o $@ $< -Wno-unused-but-set-variable + +%.o: %.cpp $(PARSER_CPP) $(LIB_H) + $(CXX) $(LIB_CFLAGS) -c -o $@ $< + +$(SRCPARSER)/bison_parser.cpp: $(SRCPARSER)/bison_parser.y + $(GMAKE) -C $(SRCPARSER)/ bison_parser.cpp + +$(SRCPARSER)/flex_lexer.cpp: $(SRCPARSER)/flex_lexer.l + $(GMAKE) -C $(SRCPARSER)/ flex_lexer.cpp + +$(SRCPARSER)/bison_parser.h: $(SRCPARSER)/bison_parser.cpp +$(SRCPARSER)/flex_lexer.h: $(SRCPARSER)/flex_lexer.cpp + +clean: + rm -f lib$(NAME).a lib$(NAME).so + rm -rf $(BIN) + find $(SRC) -type f -name '*.o' -delete + +cleanparser: + $(GMAKE) -C $(SRCPARSER)/ clean + +cleanall: clean cleanparser + +install: + cp $(LIB_BUILD) $(INSTALL)/lib/$(LIB_BUILD) + rm -rf $(INSTALL)/include/hsql + cp -r src $(INSTALL)/include/hsql + find $(INSTALL)/include/hsql -not -name '*.h' -type f | xargs rm + + + +####################################### +############## Benchmark ############## +####################################### +BM_BUILD = $(BIN)/benchmark +BM_CFLAGS = -std=c++17 -Wall -Isrc/ -L./ $(OPT_FLAG) +BM_PATH = benchmark +BM_CPP = $(shell find $(BM_PATH)/ -name '*.cpp') +BM_ALL = $(shell find $(BM_PATH)/ -name '*.cpp' -or -name '*.h') + +benchmark: $(BM_BUILD) + +run_benchmarks: benchmark + ./$(BM_BUILD) --benchmark_counters_tabular=true + # --benchmark_filter="abc + +save_benchmarks: benchmark + ./$(BM_BUILD) --benchmark_format=csv > benchmarks.csv + +$(BM_BUILD): $(BM_ALL) $(LIB_BUILD) + @mkdir -p $(BIN)/ + $(CXX) $(BM_CFLAGS) $(BM_CPP) -o $(BM_BUILD) -lbenchmark -lpthread -lsqlparser -lstdc++ -lstdc++fs + + + +######################################## +############ Test & Example ############ +######################################## +TEST_BUILD = $(BIN)/tests +TEST_CFLAGS = -std=c++1z -Wall -Werror -Isrc/ -Itest/ -L./ $(OPT_FLAG) +TEST_CPP = $(shell find test/ -name '*.cpp') +TEST_ALL = $(shell find test/ -name '*.cpp') $(shell find test/ -name '*.h') +EXAMPLE_SRC = $(shell find example/ -name '*.cpp') $(shell find example/ -name '*.h') + +test: $(TEST_BUILD) + bash test/test.sh + +$(TEST_BUILD): $(TEST_ALL) $(LIB_BUILD) + @mkdir -p $(BIN)/ + $(CXX) $(TEST_CFLAGS) $(TEST_CPP) -o $(TEST_BUILD) -lsqlparser -lstdc++ + +test_example: + $(GMAKE) -C example/ + LD_LIBRARY_PATH=./ \ + ./example/example "SELECT * FROM students WHERE name = 'Max Mustermann';" + +test_format: + @! astyle --options=astyle.options $(LIB_ALL) | grep -q "Formatted" + @! astyle --options=astyle.options $(TEST_ALL) | grep -q "Formatted" + + + +######################################## +################# Misc ################# +######################################## + +format: + astyle --options=astyle.options $(LIB_ALL) + astyle --options=astyle.options $(TEST_ALL) + astyle --options=astyle.options $(EXAMPLE_SRC) + +log_mode: + @echo $(MODE_LOG) + diff --git a/extern/hyrise_sql_parser/README.md b/extern/hyrise_sql_parser/README.md new file mode 100644 index 0000000000..dde5724673 --- /dev/null +++ b/extern/hyrise_sql_parser/README.md @@ -0,0 +1,63 @@ +C++ SQL Parser +========================= +[![Build Status](https://github.com/hyrise/sql-parser/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/hyrise/sql-parser/actions?query=branch%3Amain) + + +This is a SQL Parser for C++. It parses the given SQL query into C++ objects. +It has been developed for integration in [Hyrise](https://github.com/hyrise/hyrise), but can be used perfectly well in other environments as well. + +In March 2015 we've also written a short paper outlining discussing some development details and the integration into our database Hyrise. You can find the paper [here](docs/technical_documentation.pdf). + + +## Usage + +**Note:** You can also find a detailed usage description [here](docs/basic-usage.md). + +To use the SQL parser in your own projects you simply have to follow these few steps. + + 1. Download the [latest release here](https://github.com/hyrise/sql-parser/releases) + 2. Compile the library `make` to create `libsqlparser.so` + 3. *(Optional, Recommended)* Run `make install` to copy the library to `/usr/local/lib/` + 4. Run the tests `make test` to make sure everything worked + 5. Include the `SQLParser.h` from `src/` (or from `/usr/local/lib/hsql/` if you installed it) and link the library in your project + 6. Take a look at the [example project here](https://github.com/hyrise/sql-parser/tree/main/example) + +```cpp +#include "hsql/SQLParser.h" + +/* ... */ + +{ + // Basic Usage Example + + const std::string query = "..."; + hsql::SQLParserResult result; + hsql::SQLParser::parse(query, &result); + + if (result.isValid() && result.size() > 0) { + const hsql::SQLStatement* statement = result.getStatement(0); + + if (statement->isType(hsql::kStmtSelect)) { + const auto* select = static_cast(statement); + /* ... */ + } + } +} +``` + +Quick Links: + + * [SQLParser.h](src/SQLParser.h) + * [SQLParserResult.h](src/SQLParserResult.h) + * [SelectStatement.h](src/sql/SelectStatement.h) + +## How to Contribute + +**[Developer Documentation](docs/)** + +We strongly encourage you to contribute to this project! If you want to contribute to this project there are several options. If you've noticed a bug or would like an improvement let us know by creating a [new issue](https://github.com/hyrise/sql-parser/issues). If you want to develop a new feature yourself or just improve the quality of the system, feel free to fork the reposistory and implement your changes. Open a pull request as soon as your done and we will look over it. If we think it's good then your pull request will be merged into this repository. + + +## License + +HYRISE sql-parser is licensed as open source after the MIT License which is declared in the LICENSE file of this project. diff --git a/extern/hyrise_sql_parser/benchmark/README.md b/extern/hyrise_sql_parser/benchmark/README.md new file mode 100644 index 0000000000..6c038baa0c --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/README.md @@ -0,0 +1,14 @@ +# Benchmark + +This directory contains the scripts to execute benchmarks of the parser. We use [Google Benchmark](https://github.com/google/benchmark) to define and run benchmarks. + +## Install Google Benchmark + +```bash +cmake -DCMAKE_BUILD_TYPE=Release + +make + +make install +``` + diff --git a/extern/hyrise_sql_parser/benchmark/benchmark.cpp b/extern/hyrise_sql_parser/benchmark/benchmark.cpp new file mode 100644 index 0000000000..e1435504b8 --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/benchmark.cpp @@ -0,0 +1,28 @@ +#include "benchmark/benchmark.h" + +#include "benchmark_utils.h" +#include "queries.h" + +int main(int argc, char** argv) { + // Create parse and tokenize benchmarks for TPC-H queries. + const auto tpch_queries = getTPCHQueries(); + for (const auto& query : tpch_queries) { + std::string p_name = query.first + "-parse"; + benchmark::RegisterBenchmark(p_name.c_str(), &BM_ParseBenchmark, query.second); + std::string t_name = query.first + "-tokenize"; + benchmark::RegisterBenchmark(t_name.c_str(), &BM_TokenizeBenchmark, query.second); + } + + // Create parse and tokenize benchmarks for all queries in sql_queries array. + for (unsigned i = 0; i < sql_queries.size(); ++i) { + const auto& query = sql_queries[i]; + std::string p_name = getQueryName(i) + "-parse"; + benchmark::RegisterBenchmark(p_name.c_str(), &BM_ParseBenchmark, query.second); + + std::string t_name = getQueryName(i) + "-tokenize"; + benchmark::RegisterBenchmark(t_name.c_str(), &BM_TokenizeBenchmark, query.second); + } + + benchmark::Initialize(&argc, argv); + benchmark::RunSpecifiedBenchmarks(); +} diff --git a/extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp b/extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp new file mode 100644 index 0000000000..27fb66c4ee --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp @@ -0,0 +1,44 @@ +#include "benchmark_utils.h" + +#include +#include + +#include "SQLParser.h" + +size_t getNumTokens(const std::string& query) { + std::vector tokens; + hsql::SQLParser::tokenize(query, &tokens); + return tokens.size(); +} + +void BM_TokenizeBenchmark(benchmark::State& st, const std::string& query) { + st.counters["num_tokens"] = getNumTokens(query); + st.counters["num_chars"] = query.size(); + + while (st.KeepRunning()) { + std::vector tokens(512); + hsql::SQLParser::tokenize(query, &tokens); + } +} + +void BM_ParseBenchmark(benchmark::State& st, const std::string& query) { + st.counters["num_tokens"] = getNumTokens(query); + st.counters["num_chars"] = query.size(); + + while (st.KeepRunning()) { + hsql::SQLParserResult result; + hsql::SQLParser::parse(query, &result); + if (!result.isValid()) { + std::cout << query << std::endl; + std::cout << result.errorMsg() << std::endl; + st.SkipWithError("Parsing failed!"); + } + } +} + +std::string readFileContents(const std::string& file_path) { + std::ifstream t(file_path.c_str()); + std::string text((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + return text; +} diff --git a/extern/hyrise_sql_parser/benchmark/benchmark_utils.h b/extern/hyrise_sql_parser/benchmark/benchmark_utils.h new file mode 100644 index 0000000000..7eb54d8090 --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/benchmark_utils.h @@ -0,0 +1,41 @@ +#ifndef __BENCHMARK_UTILS_H__ +#define __BENCHMARK_UTILS_H__ + +#include "benchmark/benchmark.h" + +size_t getNumTokens(const std::string& query); + +void BM_TokenizeBenchmark(benchmark::State& st, const std::string& query); + +void BM_ParseBenchmark(benchmark::State& st, const std::string& query); + +std::string readFileContents(const std::string& file_path); + + + + +#define TIME_DIFF(end, start)\ + std::chrono::duration_cast>(end - start); + +#define NOW()\ + std::chrono::high_resolution_clock::now(); + +#define PARSE_QUERY_BENCHMARK(name, query)\ + static void name(benchmark::State& st) {\ + BM_ParseBenchmark(st, query);\ + }\ + BENCHMARK(name); + +#define TOKENIZE_QUERY_BENCHMARK(name, query)\ + static void name(benchmark::State& st) {\ + BM_TokenizeBenchmark(st, query);\ + }\ + BENCHMARK(name); + + +#define BENCHMARK_QUERY(test_name, query)\ + TOKENIZE_QUERY_BENCHMARK(test_name##Tokenize, query)\ + PARSE_QUERY_BENCHMARK(test_name##Parse, query) + + +#endif \ No newline at end of file diff --git a/extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp b/extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp new file mode 100644 index 0000000000..47928f0a7b --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp @@ -0,0 +1,87 @@ + +#include +#include +#include "benchmark/benchmark.h" + +#include "SQLParser.h" +#include "parser/bison_parser.h" +#include "parser/flex_lexer.h" + +#include "benchmark_utils.h" + +// Benchmark the influence of increasing size of the query, while +// the number of tokens remains unchanged. +static void BM_CharacterCount(benchmark::State& st) { + const size_t querySize = st.range(0); + + // Base query has size of 18 characters. + std::string query = "SELECT %name% FROM test;"; + + const uint pad = querySize - 18; + const std::string filler = std::string(pad, 'a'); + query.replace(7, 6, filler); + + st.counters["num_tokens"] = getNumTokens(query); + st.counters["num_chars"] = query.size(); + while (st.KeepRunning()) { + hsql::SQLParserResult result; + hsql::SQLParser::parse(query, &result); + } +} +BENCHMARK(BM_CharacterCount) + ->RangeMultiplier(1 << 2) + ->Ranges({{1 << 5, 1 << 15}, + {5, 5}}); + +// Benchmark the influence of increasing number of tokens, while +// the number of characters remains unchanged. +static void BM_ConditionalTokens(benchmark::State& st) { + const size_t targetSize = st.range(0); + const size_t numTokens = st.range(1); + + // Base query contains 6 tokens. + std::string query = "SELECT * FROM test"; + + // Create conditional. + std::stringstream condStream; + size_t missingTokens = numTokens - 4; + if (missingTokens > 0) { + condStream << " WHERE a"; + missingTokens -= 2; + + while (missingTokens > 0) { + condStream << " AND a"; + missingTokens -= 2; + } + } + + query += condStream.str(); + + if (targetSize >= query.size()) { + const size_t pad = targetSize - query.size(); + const std::string filler = std::string(pad, 'a'); + query.replace(7, 1, filler); + + } else { + // Query can't be the same length as in the other benchmarks. + // Running this will result in unusable data. + fprintf(stderr, "Too many tokens. Query too long for benchmark char limit (%lu > %lu).\n", + query.size(), targetSize); + return; + } + + st.counters["num_tokens"] = getNumTokens(query); + st.counters["num_chars"] = query.size(); + while (st.KeepRunning()) { + hsql::SQLParserResult result; + hsql::SQLParser::parse(query, &result); + if (!result.isValid()) st.SkipWithError("Parsing failed!"); + } +} +BENCHMARK(BM_ConditionalTokens) + ->RangeMultiplier(1 << 2) + ->Ranges({{1 << 14, 1 << 14}, + {1 << 2, 1 << 11}}); + + + diff --git a/extern/hyrise_sql_parser/benchmark/queries.cpp b/extern/hyrise_sql_parser/benchmark/queries.cpp new file mode 100644 index 0000000000..f26187d4d3 --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/queries.cpp @@ -0,0 +1,47 @@ +#include "queries.h" + +#include +#include +#include +#include + +#include "benchmark_utils.h" + +namespace filesystem = std::filesystem; + +std::string getQueryName(unsigned i) { + if (sql_queries[i].first.empty()) { + std::string name = "#" + std::to_string(i + 1); + return name; + } + return std::string("") + sql_queries[i].first; +} + +std::vector getQueriesFromDirectory(const std::string& dir_path) { + std::regex query_file_regex("\\.sql$"); + std::vector files; + + for (auto& entry : filesystem::directory_iterator(dir_path)) { + if (filesystem::is_regular_file(entry)) { + std::string path_str = filesystem::path(entry); + + if (std::regex_search(path_str, query_file_regex)) { + files.push_back(path_str); + } + } + } + + std::sort(files.begin(), files.end()); + + std::vector queries; + for (const std::string& file_path : files) { + const filesystem::path p(file_path); + const std::string query = readFileContents(file_path); + queries.emplace_back(p.filename(), query); + } + return queries; +} + +std::vector getTPCHQueries() { + return getQueriesFromDirectory("test/queries/"); +} diff --git a/extern/hyrise_sql_parser/benchmark/queries.h b/extern/hyrise_sql_parser/benchmark/queries.h new file mode 100644 index 0000000000..357bee61fc --- /dev/null +++ b/extern/hyrise_sql_parser/benchmark/queries.h @@ -0,0 +1,56 @@ +#ifndef __QUERIES_H__ +#define __QUERIES_H__ + +#include +#include + +typedef std::pair SQLQuery; + +// name, query +static std::vector sql_queries = { + {"Q1", "SELECT * FROM test;"}, + {"Q2", "SELECT a, b AS address FROM (SELECT * FROM test WHERE c < 100 AND b > 3) t1 WHERE a < 10 AND b < 100;"}, + {"Q3", "SELECT \"left\".a, \"left\".b, \"right\".a, \"right\".b FROM table_a AS \"left\" JOIN table_b AS \"right\" ON \"left\".a = \"right\".a;"}, + {"Q4", "" +"SELECT" +" l_orderkey," +" SUM(l_extendedprice * (1 - l_discount)) AS revenue," +" o_orderdate," +" o_shippriority" +" FROM" +" customer," +" orders," +" lineitem" +" WHERE" +" c_mktsegment = '%s'" +" and c_custkey = o_custkey" +" and l_orderkey = o_orderkey" +" and o_orderdate < '%s'" +" and l_shipdate > '%s'" +" GROUP BY" +" l_orderkey," +" o_orderdate," +" o_shippriority" +" ORDER BY" +" revenue DESC," +" o_orderdate;" +}, + + {"LongSelectList26", "SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;"}, + {"LongSelectElement26", "SELECT abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy FROM test;"}, + {"LongSelectList52", "SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;"}, + {"LongSelectElement52", "SELECT abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy FROM test;"}, + {"TwoSelects", "SELECT * FROM test; SELECT age, street AS address FROM data;"}, + {"ExecuteNoParams", "EXECUTE procedure;"}, + {"Execute2Params", "EXECUTE procedure(11, 'test');"}, + {"Execute10Params", "EXECUTE procedure(11, 'test', 5.6, 4.2, 'abc', 6, 7, 8, 9, 10000);"}, + // {"name", "query"}, +}; + +std::string getQueryName(unsigned i); + +std::vector getQueriesFromDirectory(const std::string& dir_path); + +std::vector getTPCHQueries(); + +#endif diff --git a/extern/hyrise_sql_parser/docs/.gitignore b/extern/hyrise_sql_parser/docs/.gitignore new file mode 100644 index 0000000000..a3925495ee --- /dev/null +++ b/extern/hyrise_sql_parser/docs/.gitignore @@ -0,0 +1 @@ +__doxygen__/ \ No newline at end of file diff --git a/extern/hyrise_sql_parser/docs/README.md b/extern/hyrise_sql_parser/docs/README.md new file mode 100644 index 0000000000..81d1e117c9 --- /dev/null +++ b/extern/hyrise_sql_parser/docs/README.md @@ -0,0 +1,14 @@ +Documentation +============= + +Internal Links: + + * [Developer Documentation](dev-docs.md) + * [Supported SQL Queries](syntax-support.md) + * [Known Limitations & Missing Features](known-limitations.md) + * [Basic Usage](basic-usage.md) + + +External Resources: + + * [Original Dev-Paper (2015)](http://torpedro.com/paper/HyriseSQL-03-2015.pdf) diff --git a/extern/hyrise_sql_parser/docs/basic-usage.md b/extern/hyrise_sql_parser/docs/basic-usage.md new file mode 100644 index 0000000000..350ff59b22 --- /dev/null +++ b/extern/hyrise_sql_parser/docs/basic-usage.md @@ -0,0 +1,70 @@ +Using the Library +======================= + +Using the SQL parser library is very simple. First step will be to download and build the library. Either get the latest sources from the repository or download the latest release. The only requirement is a modern C++ compiler. Versions that are definitely working are gcc 4.8 and clang 3.4, but older versions might work also or only need small modifications. To build it simply go into the directory and run + +``` +make # creates libsqlparser.so +make install # copies the library to /usr/local/lib/ +``` +To include it in your own code you only need to include one header file: SQLParser.h. The entire framework is wrapped in the namespace hsql. To parse a SQL string you have to call the static method `hsql::SQLParser::parseSQLString(std::string query)`. + +The `parseSQLString` method will return an object of type `SQLParserResult*`. When the query was valid SQL the result will contain a list of `SQLStatement` objects that represent the statements in your query. To check whether the query was valid, you can check the `result->isValid` flag. The successfully parsed statements are stored at `result->statements` which is of type `std::vector`. + +This is a list of the currently available statement types, each being a subclass of `SQLStatement`: + +``` +CreateStatement +DeleteStatement +DropStatement +ExecuteStatement +ImportStatement +PrepareStatement +SelectStatement +UpdateStatement +``` + +To find out what type of statement a certain `SQLStatement` is, you can check the `stmt->type()`, which will return an enum value. This `enum StatementType` is defined in `SQLStatement.h`. There you can see all the available values. Some of these do not match to statement classes though, because they are not implemented yet. + +Probably the best way to get familiar with the properties is to look at the class definitions itself in the repository here. The statement definitions are simply structs holding the data from the query. You could also take a look at the utility code in `sqlhelper.cpp` which contains code that prints information about statements to the console. + +## Example Code + +example.cpp + +``` +// include the sql parser +#include "SQLParser.h" + +int main(int argc, char *argv[]) { + if (argc <= 1) { + fprintf(stderr, "Usage: ./example \"SELECT * FROM test;\"\n"); + return -1; + } + std::string query = argv[1]; + + // parse a given query + hsql::SQLParserResult* result = hsql::SQLParser::parseSQLString(query); + + // check whether the parsing was successful + if (result->isValid) { + printf("Parsed successfully!\n"); + printf("Number of statements: %lu\n", result->size()); + // process the statements... + } else { + printf("The SQL string is invalid!\n"); + return -1; + } + + return 0; +} +``` + +Makefile + +``` +CFLAGS = -std=c++11 -lstdc++ -Wall -I../src/ -L../ + +all: + $(CXX) $(CFLAGS) example.cpp -o example -lsqlparser +``` diff --git a/extern/hyrise_sql_parser/docs/dev-docs.md b/extern/hyrise_sql_parser/docs/dev-docs.md new file mode 100644 index 0000000000..00050dd065 --- /dev/null +++ b/extern/hyrise_sql_parser/docs/dev-docs.md @@ -0,0 +1,63 @@ +Developer Documentation +======================= + +## Basic Requirements + +**Requirements for development:** + * gcc 4.8+ (or clang 3.4+) + * [bison](https://www.gnu.org/software/bison/) (v3.0.2+) + * [flex](http://flex.sourceforge.net/) (v2.5.5+) + +First step to extending this parser is cloning the repository `git clone git@github.com:hyrise/sql-parser.git` and making sure everything works by running the following steps: + +```bash +make parser # builds the bison parser and flex lexer +make library # builds the libsqlparser.so +make test # runs the tests with the library +``` + +Rerun these steps whenever you change part of the parse. To execute the entire pipeline automatically you can run: + +```bash +make cleanall # cleans the parser build and library build +make test # build parser, library and runs the tests +``` + + +## Developing New Functionality + +This section contains information about how to extend this parser with new functionalities. + + +### Implementing a new Statement + +Create a new file and class in `src/sql/` or extend any of the existing Statements. Every statement needs to have the base class SQLStatement and needs to call its super constructor with its type. If you're defining a new statement type, you need to define a new StatementType in `SQLStatement.h`. + +It is important that you create an appropriate constructor for your statement that zero-initializes all its pointer variables and that you create an appropriate destructor. + +Finally you will need to include your new file in `src/sql/statements.h`. + + +### Extending the Grammar + +Related files: +``` +src/parser/bison_parser.y +src/parser/flex_lexer.l +src/parser/keywordlist_generator.py +src/parser/sql_keywords.txt +``` + +To extend the grammar the file you will mostly have to deal with is the bison grammar definition in `src/parser/bison_parser.y`. + +If you're extending an existing statement, skip to the non-terminal definition for that statement. I.e. for an InsertStatement the non-terminal insert_statement. + +If you're defining a new statement, you will need to define your type in the \%union directive `hsql::ExampleStatement example_stmt`. Next you need to associate this type with a non-terminal `\%type example_statement`. Then you have to define the non-terminal `example_statement`. Look the other non-terminals for statements to figure out how. + + + +## Implementing Tests + +All test related files are in `test/`. Take a look to see how tests are implemented. + + diff --git a/extern/hyrise_sql_parser/docs/known-limitations.md b/extern/hyrise_sql_parser/docs/known-limitations.md new file mode 100644 index 0000000000..0c91b044ab --- /dev/null +++ b/extern/hyrise_sql_parser/docs/known-limitations.md @@ -0,0 +1,18 @@ +Known Limitations & Missing Features +==================================== + +This page contains an overview of known missing limitations and missing features in our SQL parser project. In general, we would like to see all of these features being supported at some point. If you are particularly interested in a specific feature, feel free to contribute to this project through a pull request. + +### Completely Missing Statement Types + + * EXPLAIN + * EXPORT + * RENAME + * ALTER + +Additionally, there are a lot of statement types that are specific to certain database systems. Supporting all of these is not on our roadmap, but if someone implements support for such a statement, we can also integrate it. + +### Other SQL Limitations + + * Tables names ignore the schema name (see grammar rule `table_name`). This affects, for example, `INSERT, IMPORT, DROP, DELETE`. + * Column data types only support `INT, DOUBLE, TEXT`. diff --git a/extern/hyrise_sql_parser/docs/syntax-support.md b/extern/hyrise_sql_parser/docs/syntax-support.md new file mode 100644 index 0000000000..59d08b9404 --- /dev/null +++ b/extern/hyrise_sql_parser/docs/syntax-support.md @@ -0,0 +1,53 @@ +Supported SQL Queries +===================== + +This page contains a short list of queries that can be correctly parsed with our parser. If you are interested in finding out if a certain feature is supported, it is probably the easiest to checkout the repository and try the example project or check our [list of known limitations](known-limitations.md). Also the file [queries-good.sql](../test/queries/queries-good.sql) shows a list of queries which are parsable with the current version. + + +## Select Statements + +We implement a broad support for the most common elements for `SELECT` statements. Following are a few examples of basic constructs that are supported. + +```sql +SELECT name, city, * + FROM students AS t1 JOIN students AS t2 ON t1.city = t2.city + WHERE t1.grade < 2.0 AND + t2.grade > 2.0 AND + t1.city = 'Frohnau' + ORDER BY t1.grade DESC; + +SELECT city, AVG(grade) AS average, + MIN(grade) AS best, MAX(grade) AS worst + FROM students + GROUP BY city; +``` + +## Data Definition & Modification + +**Create Tables** +```sql +CREATE TABLE students ( + name TEXT, + student_number INTEGER, + city TEXT, + grade DOUBLE +); +``` + +**Update and Delete** +```sql +UPDATE students SET name='Max Mustermann' WHERE name = 'Ralf Mustermann'; + +DELETE FROM students WHERE name = 'Max Mustermann'; +``` + + +## Prepared Statements + +The definition and execution of prepared statements is supported using the following syntax. + +```sql +PREPARE select_test FROM 'SELECT * FROM customer WHERE c_name = ?;'; + +EXECUTE select_test('Max Mustermann'); +``` diff --git a/extern/hyrise_sql_parser/docs/technical_documentation.pdf b/extern/hyrise_sql_parser/docs/technical_documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a3cf62263a90d12e1f589e47b71be82460a5786 GIT binary patch literal 284530 zcma%ib&wU;*DW>yZXmeJ%yoCabKTwD-Cb}G1b2507F>h7Tae%c!r-3Z{^t8Vsjuq2 zKVDZ?S9jMryHE8wz4zK{uZHTyQY;Zi1wj9}bmS_4Rzs-C1(P*wHUO`VWMk!c4TV6U z*ZgM#;H8OlIZ~{_OVfdJL>vj_!Vv(M3n-O~kw6B}=lWKsYHr=OjkiAA-c0%W>yb%K z7J4H`>k6zZ3)JkXeFFW5cD#o5nwANT+4o=Hu3BwsfNc5s)RXLR;opKq`iVaeTQYaW z+(!>~tzYunzt118|MrDTr;l#_8-qk&Se?7OvWB$-8En_F`Nk)67yi6&@3`le27Eg9 z-gorVJG z@JjcIneX>x*1&W)v(?QG0mH1ho_WI)hDRNrQ(EqtIDh`byCD49 z?>hI?X6$s=F15PLQA05_hCo9u?;Gnobl>)^3l4pIg*o`L=eAy_rk;0yKX>DdV)>u< zv#IT;^G@rBnUUXokHBl$`;dwIeNkw7p`#ReX3m3v_sN6XZ1wB-`_0*{_LhV#7a1#7 zEvv&Tj4R)rZ_@V+DSg>+EVPR##W5TP43k|zg zvJY)rGIqq4W9?S)kR7qTW_H*T!zt~UE3S?9jn;MCzhI929Z$`#+1wh-yY;}aXiv`% zjB^?K(uGy;!^cKn-sK$LwQfM`zWJH|&~QHoZmUg)=3@T6v+6#Fzmn7M#NFSY-+mZP zpP#Jz?Q)xzqyIR&pw$cd;7{$I96I!!rXPcL9N*pzvv~GAQQ$G0nVI-I_QYPk&iy784PLCSvuL*0XyF2f~g`w@&vpdVOz} z{d2!}V@PL4k06XQjoQguIBIRGEA8yx!LKlCuz_)m`rXK0(Gy1wbRh}B_>rm(H&3kV z_O*E-GU;*KQ6swiHD&L#rl~Q!-ms-ZXu&a8bBEh2Hgul%{OpXG%UgbE@|IiJZP@X? ze`M3B9hbbLS1zBmv4vw=>lT;SVAtM15ZU-o^WYTBwYSZ%3(;ez4}Z0m~KFy+JyNYH^JD8e4s?IXZae;UrP(XQO)F70vc9 zI_m4+b?EBhAJ6cg44ea>13wb)zOFfU!q2^v|NhgxdN8Eh-S}i!2VwWAkvnzsD93Sa zJGJnf%bZ@!xidmFwCl|3v)z}p{$lvG(}$ls!#*&-QNh-ad|idIR8f>7o16YjAUc<|&F1GRgkhbXj{IT5iXqOJnzp1Y(RPDcCZVb85 zoGtFqf9d4*OO6Cb^qtuD)c7xd#orLVZ0n0lk2`vN=xfX>MHl6pJK95ir)>z%xWict z_#oM{XWpz+p8yx@<}~f>@-1KYY^AZcFMRi8_QIA6FE?yzKy6EXJuv_17r6gGi_iCq zym`C2)}5XD?}NZa;nxet$E_an4%ue5yd!3&cf-N(i8-Bp!5<)}E-j(DYcWSXAI}aO zzWoa{WGTXj_uaGW<$+;xR2^kV-|`;8aDOXE5E#r=n$XluzMxvZMU31LBG0e=rAN1e z_HEASfv@`-ST^8EUz;|6e%SF&dMliR-rYC0``w8z4q@Y;)zn7b@t%r_VFy?3|eyJic~nrzW;T_gDXAp*lqipZ+85`ZXgqnOX$YebfGWOblFH12s}66j2K_7^Mv_WMTf|GKIC zceG-|?aUqC)Dg4)NsL%X^{T3?6y5Wy%Ni_A{2@XZ}Uy_umN(KTaw-WtWz{+q2lZ z(@M5^x?1NL+ciVPo54){X3R zed?kM3S-=f;h1$CCbTceU}h`2!zOI_l{^ zdTg@8L6D=(>j8JsO}>LupQgCe}*lYTV>1*1Tgaf7>%+Jv8y#bh@h8 zPFm)CFnl5)52=Zk%RSoP>Bb?~aAUDjWmyj+>Lj63mq(nRUDl^2Ga zkIWPf*t&54$fcoVTDuei-C8G*1v|_|oSoZc@i#i!p&MouDQkLje?P{bP8F;k(6mt8#vCV#2SF`rfqMHNm{eo^KFi*F&YBBTEIVtX$ z`25hnAJ{(T+Fa>RTIGna6ib}+HHd+qM{GZb*Pg-*137bVuiRZVj@PNKM-s&!!9-0| zl9w8vIIn+C-RuJuFBJZfqva&0xEEHspC7t?^yTkW`LX@uTtcuJmD=0SnjzVmx)z*u zV9c?3ZD#c-jOn%^c6rBWF)f3A9@jN`cX`K{AFC$pZe$v}tL8}S_Js+({;Iy&WW&fE z79KP)v0z`pp#^r@m!42^_OBW8pzZ0z{`U`OcaS50zeN_Eo-qE_dY1UmioaLZaZU%` z_3cM>TcN>dbAuN=_*)KeF8$W$#rq+xpMM#)Zdi{U&p%PR zduyrvm(6T={2WfTdHb9Xd&V@Q{3Q;|d5pf}8edg?E$2{t*L~;IEcd>G0K(P}^Op{-n^?VY)TzmR&(1w%hpuelxdWMa_r=erXFW5ls`46kEpyFo{uRF3 zC2D<|@I?N!*`UvbzaRd)_TEAEfR*w(_fNk7;EGl5CV)3>siS^;skDlE{1A2ux=zhL zN}c-MST%E><}qn_s`2J8TY(++q59YLJPv66^2m$#i#CXpQzxCA2VIu!{G@mFx8|z; zarpZuqiRlFiY?r9>gwx$qfZ>8u1u@uj z;Q}Vs$js~>J__B*y8c|ZpP0yQYW%;Tx2=v{>x7)uyvL9Uw52l_jlXvR)^_XYdnaL| zUe++EiXi5njo2Nu%!A$Mx!b0;xU^gOD6=c$&5daMadXeK;c03W0D^GpMds}lmHl-5~F;=(=G%*mo+6PL1+VS^MW$2L~mF>SAo)Pb` z#`$V@Fn`~2^S)Mac>Zb}8EQkKpbcr;e^(hjw;CEi%WD7Vc;sKr>O0jE@u*9<*z=Kn zPk}C1hu-`=v7r{oC0K*|8n5egrTr4kw|NI2Q zpW$qiw>GreNj`P4?emX6bzd<`eEr?1!lqC(E*#Q8x~uQz-scv;qC+x++uiH1;=qcI zGeLp655eI%-2E5MsgJ6gK#kwMnD35P7R-M4$lbV7CvH)rCKj6bPoLPcK0$-4u{kpr+`m2hsO#sGs|ltdfTe|9My%ww!s}na#nuoooUsO`ML9guGGl% zyCa51rjs`u+q_xcVdT-2w#S#P2lCYu`UDq}uTrRc-aeT>;^m&U^Izl_dsZ}`k$Q&G zOlrKw=gz{%y|q2TAG)*cTXl!z+DWS~4PCJAU>B-8u)XR7VGl!8mAxLzRi>@o-tK+> zSa>6MyzK>1J-F0rx*x~AFJ4g0in(O~a-ILX%`O1Cg_jVb-W;lImvm3vcTftwxdZTH- zqfOqje3**kVH`o@?Gr%qj~kH|O9`Mx%-5dJ;`h-Ab6 zD`T%etIzfUMEd`o_LG@p%KvZL|Eu$9>BiAE-(Tz-c3Y@XH)Gs+C9fuLTFQ9B*ceL8 znZ0vCbMXT4GRXc0e#_hSFTeGA&!04``}Q6a`}W^8vj4N^pWB~(5&QeunX#{yjekU+ zC)o^X1#q2CFKCizdv3;!PW$#Wn?g7N=t*ca`yS79_~W0nIRkI({xJGm-wVPO?r{$W zR9@fxvWv1HBA7hl{Idtyjw2MU;pDl?1s&T&sh=6&*X?X|w&TW@58G^YbUu4~p`@30 z+x%3O?=re!_H3{=cWURZ)b-3Yn+E&geP(mn)BD}y2lzvV#QmVPi6m)UvwH(=ROxyw zJq$5*y6zm%+W;MCJ>-yIFjcR9Mzbt7}`19nFfj3=zd`2UgJ0~uJNGya zc$su;@;#+>9aip^`nv@%A?oma>bVX_9R9jzAHs)MYu7vHSSr1v&%T`9y6#2Q)^5#* z=anA>w<0^PF*-~hf1}^353>e*iu0;=znC>&+Odbq(G@mQQTur2T9f}GwbAoAw+5O1 z?ZbMq_vPy86A~|$MWhY(L)pD2pIQ#<^~aO%PY%ese(lk3K=&ujR^5C-d-1D(_?{-a zzkl1);Bd<+s6eyI_ny~Z<<@z7oE6WK$4|P4*+2BL{kI6)n*R3k z$*n71+a|RCqxnAz?NgSir%fJJnAA)%0yKYL->;wIAnAn`CRg9DZ?D9D3~l~+$RWP_ zhvMOkA@K>d(pKojBf3^K@)DJunl>7H@o3LquW-y?i_iBRD-eI5hHFy!=MU?^m#`h= z8M|xoC0C%qvfS;rXSRLXK6C%BfqRA{k#x)Vl~ZP|?)-puye(;pq31H|+CMss`{O+R zblWx87maD!IC=c{DS(mxKCU`3XZGMlx8sA(yz21%+wpxln3=gv&_4R@bISVy{%zpX zw-=`jk{)~TV!CTa@ND|*lAf-?dxq=R{&6wNs<9P9)10rqyqess@1Jii1M#7Ep1v=4 z#-=Y{ePH_4x!xgc^pK5@CDl*z&u84NS)+MivyHv7q)iQvk+5YIfHkE_diBkLRoI)G z+9-<_aRV=`!OL21k4x$l?g0~<%xDx2Po{MfJbrfT z{K-{o+(GZPep}nTm~(a1k;eOHHo5cU)BFYl2n`^qx2w}O(`2c;iK0zm+2S9Mn0g@* zMRXe}OWb+ZrzKN+St{XpE$#11RWY@C@rWzMzphTdzG3)H{)`157?E*r#|=f^U{dvs zL*e}k~+ zvllFf9!1T0+3o2zB{7%iA=6%73$Zaw+@SkINmpTrl2-zcsp=m zTs9T!W4KFuhTeF+zOnEU7J7+t1=syc~R&EWt*jooa{OGXs8f5n1?^mr? zoA`UxDAr5{h8WHRp2b(tyY^`5oj)H%U7dJ;^ESnq5x>=HwH;xnpaV`^ zYS@^#vU;fmy;*RLnr)n5v_8I+@VXoDX&d;u4L4rajQd^QPVpCTH$B{GQH`=q%ZBe} ze(Ux6&qgD=jcWh%+7b4Tvj^>9o)XdS=jImQ{(0%bvZZ&c?saay>e{&v&4T=sbi$|} zeea4|G-$fbU$eRD(d4`LN;9y3%^1Yo*qC&~bNj{2uk<;7(Cy4i>OWs!J)oTM3>TzZ z--8MQ16KEyu6uN-%Z^`F{7xTs95{F1aN$$=#kFH2sGYmT-gNl7``|g(7x#jDyJ*!J z(D+6s2=|ZAbz+2q#_A4Iw7rSAJF4@UwUlm@WuJDRy?()o!RD#hqGZaS1=W5=F z%^li|9vFW0`dZ^ww^m15#pYgnJ9go6Wg|uVd&>%jyf>hJXUwLNXoi4UJH4EXfvUq@Ku|M&aL2SMk& z=w>3k!xYSkCBIVkJPUIMmXI3y-W~8pbKsM!UyTIQ&U8H5gt!8^EW8o*{(x%oL$$>jr0_&*QIBs1nZQf;lEa+hVmBQ z@8%Qx)oU+5Va~-b;GUjby`fHQ-|bw2K9+< zM`*EWmE1O2a=Kexj|8P)YM;HoOba{CX_~t{NBu$BWz%%vmaR`VHoVDN=y*AB_WDcn ze*K&&X}>Q#xqh_#`RnwISVP6}@4$mU+!bwK_;BcG%dj1*Uv+MAjGh0v?JRb)6VI@l zYTgKjeSG<$V1|BKIO_uLTn^dg&i*Cd`Kk-W34Iq_+xjB9<>801@7T&0KOOid0Dijn z_Q2Ahzs3){-@ntPb*)Z*We)5=DA;C&Yo~4SZ^UUs*h9{2ssT4$ZFvkCH_rNN(^s=s zZ|Q5C{;q_RPUUv^IS_F*aZDcn^umnp6Bp9}p-oUk(+zhEe-4p%-RAt)$XT)QdZ5SA z1{0(WzHD33`ct=|>+!d}d-t}P6)a8r*r4tACLbn%ssMuqzdGOS%d{7(pT0*cpS;Bl z`u6SLL-%Xs=;?EKeShpc=a1Z?bLGk2-UIQ>WiojerGu06$G_+ThMl z)7ziE@R;vwG;hq~4b#SdT;hMy@T8^9{$FtoHf)~(TDx&iWcT*%L*L|n34;3_x;dw3 z>++PDzlyGPBkr2fPTl5i+a^Tuo^i{Ywg2t*OBZMJXP zAaKm5Sc|RKXIvPCgxs01yaqed>6rC#9&-MV?!d1ns|V^&Q^;kb3K*CiIO zuH?LV^V^d<)6=6q3k3~k3=#gk1J$HiuyupAbI+`9yz<-+UuNH!L7lA;*xnu=KlJoB z=`r5>)<;}A$h;wwV~*t;c6>Z1a{m_STJtN}-*(~<>O{>4Y`1&<2ogrz5;tw&$}tN)vx-Tz8(Pvy8T({Ylw!C<6BMdGhqB( z3cRQFTc6>#H~;$dd-sY>pon~ zZ%C(`fl+f)(}%a#tbM&EhIk{osbz+F8|;#W(mfFLYOqee_TNQ>rd28`C=M)2BvEiv1z$a%WNc z?uGD$ce8C1o@b!VM^Q28_{_}3N+aV0&0i}<{<5dN8hK{@_^VRtyG!q;C{f0b{6&9p z1>W!q_D?@_`x2P{{X$LoX8u{#L3^7&Y?5Pyf3ko6@~q>+o)@<$cfoTz>Rz|mHs@RI z$`fJgCczx3Z`n^X(&zoV?0d}cyRTMFoV2g8;x2Ri)2g=P!>gU@T3tKt6KO@^Oh!Uw0Nzvymj81{ znk#1N>-F`=|Fj?i@Orbvj;k-=N3?-Vqy~Y*;Y0C2v0TC@GBJGpRs9}L1Y*TNri3pS z1KCovzH^|Q$Yp)`VlEUZm2mlR6#2gl=>xHdwvq|fs{#JEZACVk6DLCD8X~iPfJOjb zD9rV#aS`e-Xk=;)nNIKk@Wx0fS1Hz8`;WvxUvJnHDc87a@bx-`8oW8ur(A&uJ*|Uyl_D{_7~z)Zn%MHP$o$FHo3jqJebjKe7aF z{q}!k3?vePM*lww1{Ypn5-Ai6>i-lm{C7cv=f5c$WI-S#9h7q=F|CWusCB5*2uMtu zMjFI|K#HxE^AQfd$Q%GB3>>T7$5uyWUO&VuiEtQDwH>J=qE%4`i6YZcu`wK2MKS_# zLYtNo;xoyiJdm0SAk6MsO-dW*fY3}5EU%CgLTrnhgQqLf_99jhrD)NKES$zKT0~`M zk%@ANN;E2zl7~r4mJ-(MfB?d!0+DUydcmP$JfkBPDm)>wNDTYNnKruANfN8IPF7PXhRZK4&LHANq zcuvustq>GgfUgLr_*1o6bh5x;7QxyINFNbs5F|WDO4L}2ObktEp^%u_yggKMMG{Ul z0;>y!PjY(Ijr9^kJ7CEWJs!tvowaR zkQV0T2soHT7l9!Y0kjW7cG<{q6b$L(%0QAVwaFEi)D(v1qoWGSjhnw$=;a zS@k4P0TiLZsVIyh>IJD_B1DNsV5TEUWy%4j$jwSURBPkOYgrD8%%argEis&ghBxGW zFc2uDNBc!Kq8%Aw0P*r%1PLgxl=4t5+AJkH#BP6_7>qzPgpkuKWRn~)D-5Xg`3Y%y zpbX`){1jGBlft^xX10oz5-6szP7?`U(L;+F zz7M4b2t7(R9i0to`96bLm*Rn=Y>ieNA_c@uA&NqkaSV2AT zD=)g8WmK6*GuIk&5~)1xYj}4zki=R+USNu@lQ!dPbJZyK9Xoctm6*+iiG6AV@(( z?H+>BD$5H~)`FZTK(ciexe^yESb=n@9;?yi~69@Xx#MfJcW zO6G-^QXCvJ6_K(CQEFHmk5PjPlNEvF_$)3Y4(U;s)87sjA}rF>`YgE&+ph4-G|r6EpEetc(V&p!cQB-RQZ^UQ>xo{3E+oXrb(sJ+q)tdw zIZ-AHqDb92dMHFpZ~-Yw4(`(Nuq3)Uf(O%6OdyG@g7`=wHxjLatAQqz(nY2z^>(+y zV0UHeDMSb;0gM+CLbz0n(h5|Gpp?LHGoX4nS{c*o0QquM!*u1eUS2{%!Q}N)GMBH+ zf`bw^%x^=RL^-OBN+@R%#S%UsLn??c6~`+@VTc7nEmbelcvxzz8kBJ{1CCryXfp}` zIy1S}pN?t`E+dx&!EmyQa#RvD3h;6p$eeMM(jXC7!9n0cB8Xf>Fj{h8licBkx)JfB z-T{l39U-tBAA`X~G6`8w5(NOpghOD6S}ZZAO`q302#5qHkj7B(#bgYXfJ6u)y)SAM zGYf%&Eybc>=uu9>Ws`aGIYu_FuQd{du`sHZPNvblC5Tr~PXX9kvP6(G!IkQKJgL!W zQ#N4MVF#m$(u6q8hgb_fWz;}rR&p$N%kLShQVY^_sDwmK>%t3fFg7xP5ANFZ}lk*bi=$-#Px3A|SA z&4vm-FVU^kiX=&z1WHy#c&rF64^ROGyTn?8*1G|r zLK&m@?ZB)G991b(94Qosv8gMukc49jB5Z66K845-vpf|Rqpg=Ypu_Q!Q^q6c{Lr+~ zVzd^JG`=-V5Ce!-GD3{ zkQ|CR%4bUA-T+cmi9|IvBn|F`(jp=ql2?*J01Q|JALe;OdA1ZUwwY;quv!XDI+Up> zD1?BqvP63z4B{a8Mw`u4E|_vADhj%_OB?L<9LE*BXsE&ve-p*ht`1(RWo84^LiHO_OJ zoDqB6W-vwqX0A`@%2;w`zEnV`GUN$j-0V?SGCVLnuQrO)){>1z63J~^x;`Wj)AI!o zzzfm~XmXbwVRa!jN~#|R$Hz$)GK=jnQhCIpPna?KqBazY;>Qq*K87Qxvg4?Tvcp2H zKn3Y&IFd7IEVe?y?@>#3=M}&Jsz5!8pXuiZ$d4l!Hc@h!jHu5E>LZ04#F^4zmtQK&231ARdtI(@hI)w))hhbDHhZk(g}mIp$v-@7Yad)nYaue zl&R9HtfvBIXbdGG4`hbBkY#nzfQ4z;e2X#{tq(tJFaXP!x#NC19G&Jc-S8w!LX+x+ zaV-U8fGQ-aV8wxmL{JoT1g>Xe^hI-!U8I+ga;A!luh`>sTm){2Nvv5}GNeNSgLz*G z08U0jB|KGLz-R(-2VD=BKvMxKky*eSP^6Sg?czJ_Nt&JH#-d^bm)e0UrI5IY*^jj0 zQ#3mz6rtjMA#K3mK_-x5KSBY3Mtf?x|`)3St?A0*j0(wNo+Rfa&Cgwo8)ITOH8 z1z~j}sd_p}DMZ#!ggg+g6-4l2p#zdZgg_QOE{)>)q##_9tpyZhsGJgjqUVl9EA z5=lG`Y*MRpdbkv{+nE)iivc}|RSzU!C6^A1Cs^?qn}(U8=I~HMOqwoA=ox9&p2bHj zY$ny=2S~{|s>!8xGLadf6<3U*xo8&26v(MvVQY%vR&nhvel1vGbwese1Uf@9<|$Nq z3?7hISn(n*ZpFkUSw5DROZ#LlF2zX&&@F1d-{lFig24dYtLDb-wK!%|g zMAa4*Jb#g1|4cfOi^|&Yig1WWi$_Ficu<`~YCxtOPnU9#(ZLM9QYHZO3a}d*6qKQP ztki%@Q9%%F8kB~p*~TQ88rFHrEI*f)P_YX%nT&u@1!0CQeq9WobShC<)}000lE84(KHD0*t_o2iU48qadqwE7Os@ zPE63KkQqfBE-1Q{S-1*W$|nsFY6$~E8gf~6Ekeaa(g~`N#Dg!P(ZoQ&0nf1kDh?6^ zr<4L52*)b|N4!j(5P_y)90^8{1>@yJK)whK^XGzLj*}?H`0OYuEv_T0IZ&DsZ=^C= zltPqYw9>%*xXTQ&3&8+?l4mi*5~Qq+C9~2*U}9};BxRM0fer>WPH_t~5Vi$ff?-p* z5WWa15k-ZFQD?Sivltq|<>FaTmRuNA4hF5fIE+EWQvph)iY`WG^%AFvn3FpLNw-&^ z$5kjgHVf-lhRqr@luoHgL<$f_;f!hILAf>JBZ4&upVy1EpdbQCTo{b%1^%MLO$cEN z03V+fjxj8`EDz{SN}=_5$qQz25easjDNP`(REx2~4E+KevwOJf9d4n>5%NVsLIh1(HuO$Lqf;=crLMWsTLIS}G7|hv%3?xQS z6T8j9O&(Ncw4IZtaT$_q%D($9x7%Q{28grW-dG%Wy`a;Ou;a9JTVYoQfC z5-KYQygEvKGLvH?%oeL1L<@0TWe62-P+%1-FDhn11NJ!D?{`AH@Q6tX zqQ(sI5Fn3ApiwzJIIZQHz&e$HQZ}=lEN0%578ELGzTeL@r;8kMeYYS;ZxZG)YB3OH z#_?2Wd_>5p&7EVy(O&57ozI58WA~NZ?Ll zJWI~Yxkz}5h~bd}A~ZQ4C17e*WeG+DGbJfpb;TrLdT}0NM#4hl@fB}c5DkbKQg;{! zPC&{eCKm-SXaR8?P+5$`C=slRN#Kb&+JMf;q@Omr2SjKMJA zX{Ib?;o$-lgPjMI>r2WoP3l9DwE+px!qpeC0DfF9fIGb8Fiy+SBwQ>PRIMz4L{?Qq z#z(P1bRNQwf(fWWAw(c$YREnak{IA3QU*CXACcl{PP~j_a1&EBKGQ=1TJS!ACT)YV zC>0K$K=!aQ2rf5m!6o1+jur>vFk$MruAq#j+#I&mTy#byDV_!DOZdbplPgmM$1P$c z8U#aH0~Dh%U<((qEFC~ev|0)NiWM%$$lNj;nb!mt$7L;j-rY!bRMB#WC#^51jud+smg>*EMGFAv~e(53zl0nBsowi)$|G737gKydWy) z)Cq+o8?H7;PfIy+eo4d5B>W(}9Ert?O$i}RWQ6jmFcRIRvIGGNk%$e9P_39!-cNIT z^+gCFD1%n)NEDZ;R=8OtRgj%QMZ`&*79HhNJwzBgR>*;o1(T2{m%*{&I0xb@+JzVt ztDY3AkO5hsim!4|;mC~7F2q;ZA*6+*!1x5x|G<7++Ga8HxRJDuNG1@=k_26D;Yq?K zkp>dO3fUn73I)lEP0TnDV=mfqC2#-`qp2vcxKDzFskvGRDV*|%`QB8(S+Z2Hfh^KV z;Onwz2%|(I(;fH}#}PK=I5<|Al|+VFDS63CC}FgAOh!hflAuVqAPgWga7m^T>81d6 zaK3=xCV~n`MLlBVq_A=dhDr8N>X&&Ejml>WaSM&*3Mh?WnTUc=;8g}J-ibs;ogo(o zlr<{S{*06b1jP7wJjzEAg_RMT(dma`(Qv!P?34x|D42s7$Qz|hPu312E2$N%6)krO zy$NqtM|4G!0wu+-M+Gbpoy{Old+wAd0sfYN=jiV zngtFiF+}o8fbGMAumEkDTub(p5?p?;{!P|rAZk4@UQB|-c_b?uuZ_~VRyo(HDMCsX z1sxPqN77kt!p=ZbO(cAn8Sv&Q6(J?+V~Xk{ZW@wL0+13g#zRV*%!D8jEtYeOgs9w~ z)`qlfM}lb)n_!6uKdDocX?Q-k63db~a3O{z=kY@ziNFM7)71iFLc$cufhH(XEm8&n zARkXApq;@hCsMdpVY*yN3yLX=E&)Q@gA!}TRX-w#-yh=&Apil?;WcKhG!O>sp?P!3 z5Q+!#KwK6Ut2T=_AS8Zb#D`4zoTL!4fV5!XNORId(SWI@0IGyDCV2szGfndfovskU zWAxe50297q5m;4v0TaXnTKIGlnu_7pqYI~x%O*Ipa${140;x;23YZiT5@)E|usq1g zN+ao_EMinZWvT>KrNqdJtZ*)Gu~YZ}u_MDwXe1h5I*CzxS^5f<1jAuc9wUO3@kepN zBv7PBGu0Ij#7+`%G-x+4UI9y#7MndoqhvxBkwk~f>jD9mzY-WTAP#aXPgZsb&e}aawDiDUO+yF)i#ZZ`+;?oOc z2)Dt&$7zs76Tm?($J8(lj8mlRlVO(}Pskv{TA&!IVdeNaQjuK@62NgU#Th{m!eAXu zj$!13Np8xM!wAxqC?ZYeV_E2I8R24yEI3dtpy-6l!v3&bN#Ya*LXcU(&6PozD2h(Q znu!Fz6O7Wyi4`M+Rg|)^W^}I5{U(;HfW&sE`2%!AXW|wGg7;iNc^{$gGix!NP5EPd&zhkQjL# zJnP3uRZ)baz_bg+Wjp{3ix=Q-um=J%`D%UjA3VCi;|ZKarH&a((;~_g0;pitQoxL2 zDCw$)Tr_$tBhZ#oFg#crpx^^RBGDp=+KQB51Saq$1Aux@U2B3wm?{r0!og5f|DxD2qUHZGC61stN>9Ssr9_KdY)O}fjPumNVMr<)u`WIYQj5-9a#1Y79^M3Ds;%7iru&^n{LqIN^cb^!?Fv0JsQ`g)t(;t+t1 zVi=|vWs#8agu)k$A+&~If?R=Mk$f%Q7*6=}wFnm?U;rZd0<;p470TV76kcdFhoG(q zf=0p%>=d-ui_lsqzCxZIEs_r-SGqi?BApye1dM*0L6>&>*y4I=TRnwCA^J;bgu$Q_ zA*fskq7p_Bk!H9-%vZ$i3AKytsV_nb@&GwZZBfef5?+K5W7+Mgk^z%ZGab4d+Q>s{ zL{b)m>oF@Ruo%^cKtb!P%N38oN{kC|QLabI2ttW5nuAyCXOQFybut`-0AQwE#1iD% z{6@Yo>z3HTDX2H?TYW$oytfD|M@jMcAW*_ib49oci9mqU($e+JQ;BQ} z@F7g3FK)A;7;!5>KvhMHI2AD=<5PkTdR*(|DBTsBxu|xtD+C`gm`TJ{?gZUh!~_6l zalP+wq>w%#mZEd$lc`*RS3*UkL9U|Wb|gwc1W=DcDO1H9AD%99Nntrj6s5qyVip^t zqIh{EVabW$Bcmk=UxeX^!~iK*8qC<)4wW(PV4=kk9;jA=_9OGCfIYzzgkeD~*P|?J zFd`j?nf3Z>Gi*;uYLo_42}m?-lbRe6n5H_=(=d4J} z<_bq{%)0$WKUU!6Y9&b>kEwPRfPn}K=?p`;GARY>Wf2`A}SEe zj0F`in>og)E&B@KT2Hjh;-<0)5Re3jC=g6$jKzjSB?&FWU?G)JF+a0ZCf7qry)7fB zt8`(QJCxL5c@{mzYRM~9dM78(Pmq|rdX~h1!~GB9&ZApZDBHq)e#P^c5D5kp1JMYW z5KzDbiXcc34Bh(ewX0cUyvBQt8r44eUfFxCIlnp0C$od;?nr&ysTFmIK9$ep)Evot z9*R|^v>0^HXe(|g#&vb+sudCMne(K4DRm3;NkmfjUH6*ML;7)_r)*QU#0*TO;gJ<9 z!sdxTTF_|};Y}oMW2e$Wo^P)4n(GlJyuK+?OnZ~UD|X=8^;{bX-K&rdjq_Wt&I-@6 z-){bTtNJ^*uz5Zi=u7*hO~3*H#p0&849-Mp^J&qa;dEFuKJt<0gO)chrlon8-gE?D zJaMnV3(unYW*d9eU-FLB<)-EcjsEm}`xPiOZy>8tv zGjWK#>*pi0L3ZmB>|nd{JJzRkX;+_aO>g=5T&Sqxmc=q*?nl37-1XmTjBPTDfPy^e z@KQ!xHab@Lo|E@d8}3h{cjz|3Kdx!7TVh}3l~eLp{08{+|m{Q-kHge~bp%vX% zKozswlBr&eHj6=x8WX?7*=~rc@BWb8`)}BHGA?<_t0Nj8dE`CZ_2RoPh5jKJ05^&q z+E{$k&pf;tok{&W?iQ{=`&&06-aSfp2=+Fxwa#FxS~)wfhEF1jI66!1j}61`2A*|R zx9M#NjMk;qnc9heXwcbmT3@UD`Qx8y_{S&J+g_cAhBBJ$`7X2^m3wULc_mS=b;;lS ze(XEEgK5Nh5^krODT`$hmf69xcqavQ(Bj~<_p6FoqyAe~n8^ST%Mc!vgSJtRqUaVkx<)kIx8tHbKz9teaf;yZ6H_5R40?JXVvM>*8f zp63mQeWo=`5E*tlQRh8}AN8g@KOA+gbYb)tbXle6h8NOs$|7eeB!&YA>!1`S-jMv; zMazEHbmu?x9p4AvLDF-MEB?gplr@-w#b~qVjpAkBrS4I=w>AgOVFulzQ2W^Dep$Wa zZLAuGy}Q-#9$4Zo*oVzUI%Uzc6I{2PLBDw%(Cia!X}_QIE`CvW=(_f1 z+*QRNw3ozHg=^QY1-kR2aPEh!kNw)iimz>QkK-XJjtLJKD6gXbs`oxd@IKM~@3D^) zFTH*_5csyl8`KcyoQ@V%A*jV;rqZ>*C`vsXI`>|Rvu>@Pm+_muy-6UWO@^)M z?o=sswCXZ(#v3U?gy%*Z4r+KZ)2ofd9L=%#w>{SHdw6S1H?6cX5+2I>P&SHCqXBMo zzI_;es>b9Cu0Q?jonCV%m=b#~V+L`t%yrH#HK_~A2+eDq(xU{pipK&GBb~f+S|y7v zez9IQE)#sP)F3qM6s_VD8v{tCgrvyHzHqzytV7nac5bZ8cO5y?6MY8=jEj!fs}*AnHIu&F;XM%~*oj{Mv88mUG%XD_M|v6=>q`UO z1<1NzEUpXY;nA~yE7%J2cKo6PRNX~x8nzc<;G`q=CvQciF@u)P3!TmP0^6%@Rt$XJ zpMOR*YYYmajENx5vQLy5ZZtyRZ0K~lyLhIdGdF3jv?7}`XYmk1 zZ~=aAc(ghw;WM#WJ4jWai5U4|&&r~{CcSG9iR&~!oP2zmaQ(}9yX5 zR%81Pk)!2Olnd*+*oG}Dq!+zSe$;PEf3drMSF!sCc3LMr^Z=Lw8>42shF(gqb}^4v zt}Zg@z@7Nw7rVfLfAQ4fg@ASuvK}dN{7^cdvek~RU=oZI$&mbVWb(cK1?l3d*cgRu zVfmxl+pB?TR#T>o+0A8xtdSYqN*=eS&U#Ic?Qezk@bi`>zO#yGHJ1CB{@D}mbkD91_=Pv| zQR3$GSUB(y_5JdDqrEIFZsbLGy|B;UnFhQhHV#p)PAF5&NuQ zsl7fodn}{qOXSb{a28DL$+lmqIO77D&poqnXvU|Px?vS&XD{9K zZFa=#upsy(K8A>O${o6+d9NUYg;kuiufOkZ0K1xt9~StdM!WUnyjt;SWP_4fkL?ILcGc%_7% zffv>8Ej%LZQy;&XBx5}AH z4W+sqZh|=5-wU($IS;~HnalBhV%=)XL*35b!5q8Ycders)T2oy2)axr)Dde{8@@Y5 z$S16PqlQtZw-naHN+{6Gx&QhYqe{(Un)!tY{uatlEUkC?v8}ni`quJr+|T5~c^tfg zuN*DV@*uvI;xixSSpW?V%%97AU}-hbbp{U(MlhP0JjYj?14oA4C8Z7Y!hUD@qfbVi z{X*pd4EAEB^Y}SF)eYi7yI0Vdspb0OCGk5DbDQ#k`90l;SV79yesIiwt;gnaqY2u& zR!P<_>&k1|%SyM?(Y>?|h3C8Pp%3-*BR92%bCgxe zVKUYC!la$a74l`NzNrMw!uFVysr@1!xitGwckEQU>yskQT>c_yF>efux5C#l52Fy< z)uO5h?MiV%=)=QngUeI2n&Hfh(Vqb4oA(V}88hm;d$s$W8p6riVN4|ZpJ}T`yYEe2 z$QvgaoCB&IlZ5jaFEwgA3Sx<@QLZ&z?=~m?OktynuQ&W046obg1qi*wr(B;af;3i| znAASNNz_9f2F+(4e4_GIff(v*0xYuI$#nf-w&)Mq;H9RRf4(H$UZ`|KynVYJ{<|+$ z;X!K&2#aa1U|O?iE|}fb;y0~_`>vQJ3jlOB-;0L(hX8-_Zmnvb{ssd3WuacV&!5t4 zh-@mwqih40Z#%SR{^oB zk4&oLb}ivyc1fJ9 zVS59y2VZR7xBuS6vNuCJtT`>Z-g4s^yH`}>ym2-8Zoyj7y4cBIvyIccf&`XNt1Xp) zBv={TRN2`S9?2biR_K=smC|ik4Dy5gHnQ68?%&HQX7$Kbir?Drj`PG3a-s;Y1oEc+ zRbQlOqVX;hEP%z9bEnqMpBuWdHM@Z>y?+_{qf9!iEPAU$zku)P3ND79<@N9+IUd1K zw7k8HJTX^^>A;4{ZiuvV|CZBuONw)-lJ_jbfUGMV83>EfP z3;o-8jqUTnAi?9P$JVZ}J}$*BrXGb60rfL%0R&+mKixy29*nmA;7wj07Ahf5zg)f3 z8{lRc;8mXOfW_S-D%s%@6N7=_s||5`<9Ln%ipo^f#lIfG#s)P1_9rHR?jpUWQ(@ey za;2m>^)_qV=PqwzfzHs|U?XZ^ZfM()H6xia06 zgasD?i}~hmRA))_)<2%w+Z6EH+%jMtTAjT3PT}sJq{{O)@ybYHxW%B#&l++5p8xHa zj*Xjxsk2m1?fC;;O~uI@ogw2*HXVH~Zm5JWbElIc@cweLPN&hCB(FbyqYI-Aj4x>C^K4ZH4uSCGeYdwX2~Y$j zQYEZ`&d8OF^rqa!NOevPvrn(@qb{x*KiqG_LllV)|iinF33{kCnDr=F92v=Jy#!UhZNztyu#C&gr%2hBAS>GDC>2TBcM2ms$ zquVFiGX$7*9;;}@7K72QT{Xm4!7cSR4t6k(;yL@9T7})Us>QS2f%dg@Gn?D{_Dt4> z$K3RW1D|~VsSOT|BPil0kG2Lco2}*s9RR?yvS+QvV8b50vCeQhv4Bk`ndfVl5zn7) zL6%K*-Itbk>{!2j07Y&3=USgBd?$0!pSNYmz4frSUM720RbFp^5=SnL>S$DmZTI_Z zZjM=ta(W1ir}7CxxvEcIbB6}7efrc%C02!)Kj49CPKJ-Rqz zR)w32BCFPSAixc}Nm6@Ysv1wM*s;Yz;$E5vQiK@gG;d$Zz40mwcZn-uH*b?rJgF53gh9Gh@5_+y=nnt}U$6*+NSZ=kzqp!@-Ms>pQ_s z*)B}>iwkIo0Izo<>_XFOQbw`}SGZ@k<=>CUDx>J#U$kw>r9GDiajL9yDgch{p4GeN z?)NK2rRyJ{Us?CaXUhsZbCRV4b%X3zbN=>I@1bN})3h4%>Vid&Pufmywe)V>d(q!2 zz2P-7UfIr0>{e?H^-FoH$}2u-z?Y5wa;(*0R&sLvWG@Jv?RHhQ?%dU|q|6Q&{oN@i zJGh{(DYq-K`h3RRZ6v+9cV;8}=ByP?GEtxO_Lb@2Iq9Joy?t(SNTbNF z7IP(mIvMxxW^WOm-fuLk=6)V*n9>67of1!(eVsLHsvp&qF{2%n#9qK)kaOZWQKIzo5oBm!YvMWw4rAd5XYUq{&p{qJ1m^r1#PAqWltJ~(f-cp&}iCfd<(D1rhXl*ZWVtQ6)>+>+G;idSlJ%Y zi{{5EBEORHb+*;M^w{yHEvs3##RO2==K^>_2Xu7Nc4B(G;rtm|o%S6Sx9;=hoaxre zJ<%!`=rw;S?mudrl`RH z3VpsPrW>8sKe{l!nDgQBeIihqLes_{QB9YhQ6=x;(#bnLGcPdeLf~*nqa)fa>hG#| zqvPW+U6kAjRwR!*KmJsqR)3AfqX~hABf3$qW`}h#abc|>4@>Xohbu9=ZM-}jx)%=H zUbQ|2sxR>UD->H58!i~E!58Gl0a+!;F{7eKXYqiSav zek#)M+S#@~Fb;nn48IkO*tIoAN~adFJwNxksVKsqT4w*Ii6ya1_*6S&G)#O`>&4!# zoLb~)1iCFfY&Tu+4t==7a_6G*16tGOQ`fN3J=)&LxOr|1mHwdTz&Dxt>}CgI`&DsF zI|+p@(ah0qvvL6e3WUkTVQ^YOPgOpv9dO)hlb7V`^e$Pztl6TS0luf*$)@=0S2kAZ zmCq6^J}qHwyG5p80}rn(>*b~Gr;Af`QRz>PWiu`{7-*SR`wRR&82VVDuFX=#@jeZO z1K=x}-OZljB>WLw6cg^Ud*%F^E3`QG!tfESZHygIl%)!#%^Fqud7nKxd}Rdzc4*aP zjj3Re0L2m~6<(Kz{Iu9#HN>=;PgT6w_8Qdh{=4uNyxKIBra^{P@>uD72CpmLX>+1} z%d%Ce06N8J1!DU|iZ0GY8aF7p(<&wBYZQn1pd=kFy?7@BdAVkTt;c%sHQ?EDBnzP~R z%iDov45j@civ)^{;rEPlszW*>{Vgwl@c%kp z1mST%x?iJlbUtiz)i-Vz8=m=GYb6zNrX}5~!=?lG+Zic+i9{Mnfeals>;Ue?d-KVn zn;8g_nO6f~(+33u@wRJQOTw?dYahCIB1eX1Z&!u~tA*T;bx!)LnYuss3rk)|K#Z03 zP3Jd+07%sa=|DH4b|7Eby*riiu->z8tx3PV1&is$$;Uz=}9TI?a1kt2SI;6t#kcajG$!F-_O;? z?D6-;^kli39ZH9GlXO_u-#b6KPOFDieE`cbvUL>s2@!{*vQw7#_TQ-zzRBoyNZKe~ z`uJnB7aX;hU;mYsvT=~kKqjTR%BheI*5BiHlGJzRL>v(>#^=elaQyiIHK>?S1$hL) z^E#U}O4Q9QxL0$8}N`9%HzviTIkut_#T_% z^?Qdut6@EyVq+*`H`uX*BFNvXz0ko^_GcJt%%{rIy(=V}A|;CbGB9h}9s7}o`#G0- zA=bK9My>|Pl6ZyKpr*a=w$4r~G1luAgzm9Q+LK$9b+(HYwtY{wPa|)IVy@&AfG{TY z&h6g07HYFOQk^anyZO4kDO>bHDo*9kZMm-uY69ZKs?|H6L6WQd;|gC19EYrNe1GI@ z3QT)vR(%~6rZ4=JDm`l5MuH>Xvhm_F4zz;Q_kP01Ys(|9)h*E&6(5S%+G?Gv(WcqL*PZ%7nNQC`Rm_ET z*XWvcx$;o-JyJ<;Qv@Qhgzx|s@2>u=BD**>f>vRozO{&`EB^VtCRfu@QnK`3`U}o< z3hXrDbS&l#!i{S|hnk~DYy6yNwew^z9rU~l9V9fJ0IGf8h#!@uJD)MPHYN2W&X^0$ z6S}SJr}613jNG$b1Ce_$U{Uk#M8N*$?O`~76Mx*9c+bdwS^1zi|F?xGV9W2Q-wyvK zQ{>|uJ4Lrvmbwgy1?T2uaHIu>LCFH%55eP4_-#}^oc<7ow5V#07pJ({FG|BNWeG|yRK61wwkHO`+Q2msUt3}5n5Y?EHH#0mojLu>4iqyg4 zaCxhJj^BZ1v%0Yrgt0W)_y3}M z>z+)KpfW5KB#;XjF@bBk=Iykzx8=7{6bJ;ChQ#17>E9c?as{YEeP0}K47;EP&Ume6 z?b+y3qq^PH)(hBd(<1A!->b!oEHDqm25NruL0ekf`Ju=Tg3YvjAt%vPn|1F;Y`K#1 zb8~pO#uUEaz3Wn=oLm!%7`PGE8dfK(TgUmExbJ6>cTi5975n=X%G<{US?Hj$Q6IV| z$7^Ea7C!m*9s<7yH)Ut!q_4fWe;67o$xZu_ztihzMJ?jPX&ul5|H4l=iNAlvlWSYK^i&%}tNKTN zyG!mYRD9D2<}ri2^1Vms1frE6OYNI*DvxdjjdS0{1?(Ys>l~!YHM>9=+5a`h#%`tE zcPfTI%6|SX`!iH@EAEoxK}Z_N45OgDFtq}R+%cO=@KJfDCVM{+5^}Lp@6xeG{(Os| zMcT7s2s9(So0asT>maK)2=M-6Oz6yCNuE#4L`+^8f#vIY{sdRmsLzX3hSl5u8r zT1F%2&f%SX-1MfK?0IkejW3^j>72e{_PS-ud$zuvV32cY^sdEbj_knfuKuD*7#s6@ z9TmGgZ)>@~{`3yr)3~WeL*={`laHz8d$;P0OI-Ky3ifYPoQ{q=$>}9#JxVkvUR>~! zH$O}oTjY4ouR*`d$fVq|7%IhfAhyb#9TTrlDJfYLZsH=Vc&pOkt8ra#KCaDvqsyvO zQnmScl)tzme}m{Y1Eg_N2#IY=G7qh`8U3Xb1;uaT%s=UqmASu91-tv4wFNjw!I*)G zYk`Q!pOUp&cJBv9kkZuSqHcy>x3U7&2)p2##Ok9Sm!Gzkz7X0AeRkYCsqMH{(;CA% zu_^|Q>iao<`eV1vudJQ8etwxR@vqasW9r-cOdW2QvCaLc7nE`vmR)WEM#oF}Q=17D zQk$OR?xdu(5WM^qL#eZBNGScb6@K{OUEEXkX&6YksC&lSzgW`|Z~Z|BQK1 z&}}rjyL+8qo_@i%Vm75|@OV9L9=5pysu9dlg(`UNe}o{nwaauoh$i7l9`GPR!GZkC zr?`$xq1ojdj+&}Ck3t~A-O1=L4j=QmpW=*GQSDVyT}H>x_0#AYi=97CjQSTqOpi_9 zxVo9f7q#zm6Nqke`QE6*Zt)^`YK=f}z#m}EA30s z;0!ztBlt^tgWGfW+g|-Gqk`b|-VD}mSO>UWZQ#z?B}KF1Nd(q(EI?zbUn`B@xAM6* zcd)Yn>N(_X*CSn5`dh73ilnLuS8d?pb@%t7-9(3bwhPP1pFVfZ?dDn9P@`?J_Fz{= z|9Y(k5O-NWf$oomZ$s2Trf^yf<<^=Lh5a0$7mez##UC9}Tb1v$VNjxZhm-kK@ ze+CagfPl&lwi$o-KHoi}BL%vxjW6E^!d7Ee2bOCsOF=mXnBYn>RTP$ox8JJGI~mIG z<>Fx0TGY$BeXlQvZ9(?RTo}MJtDq28@nbkj@-8phkY64?wzmlwboqpD{JoaAh$u%m zjQe~e&K<3{8ELj%Xz4X+X?Lcr{R>g~CD|Tb*V_#K0pMpJ;@ej>>C*ZH9smbCo6pwg z&uWwJkMe84cx_&b6dIGIYUxfGZG0cvKqYFF^xv9enh zlGUUDf)LG03!;Y?_`G{<%?jzQ&+ihk5a-Nh zRzsT41|IO`6m$lrm?b%r-5CF z34VB%yV|0;AcBE96G|yH!nTsCPyD`pFV{8stFIM;xzUfmb}PS0kyCN{92j6ZLu4Rb z0_^hS^=hx*=%G?WHokAswqy(Sf_!ugbfIMeGT^E{6xU z!(ww%YNXV@Fdv_`&nSzXD730<{&t@UbCf$3bzAWnlg1zsC$>amcd9CR3t=uYgRM;}zV z$f%=)DyUk>yAF-o1#UM_7ZF!+^Y~bxPMp)dv2gQ7q8NZk(FlT{Q=A1%@>%(NQHzrg?&KTO6kv=6 zj-ifGV-m>RPw-0=7ut_|gn#Xc*F99`C+4<&$G+<_CnMd9%;&2~Aa|NT`Gf*`cNR8c zl65!sM0m8o1--T1W?@g}WoPGXEV2IgF5 zz39&4MmkgLXRx=7e0L6wTRVmBZJFHm%pFg(gO;o}-kN9N&gNNerW3h5or9b2Hm^@@ z;KU~bBmg!xxoBTRru$z0)#RUDsSNfljJUW*3X|8v6gs8)v*k?xEMsuXbUW?L!ghXB zn_zA{6ae)1!<8E*J;AU%nfLmu!O{N1bn)A1HVrAJ5)hthROnYwD+6SzIL0_=zsf*m z61FT~%(W67o(RpJ$aa1BSsie<`An2?fcFy39M@v!r3ejvM zH8PvuUy|-@1c77*TSgA!Uk_9DY4>a;67Pgk6bD&(*vR41xf=fQ@OF@8L@1Sz&s;w5 z2J3#NpI7g0VY6ct&m)0t3eGymP9rE#N9*^yJ6ss!(FfGniRwo7!})$ayt;d5lwoc0+O`1Mcs#|`3_T`8&w9TPB|}g9wQ{AQ$_l*ip+*)7 z3P4Lm#mIN2{`Z*O%A?kqDvIxXUz#;2aXILLV!V1C3&pAKj@4Rb_9w4O9>;X4vR6;Z znp20?pPu3TF_g?rPRXwGLvDf()+p*)#?vvV>R)6CxdRgP3k$@F)$>Cp#zJEK^ zQ$5x;)kXF9HR=vm7>Drtuas@S6KKH`yUXFSxnIXth}YWB^yo#E{)7kh7uUwB+;eO3 zdi9*Kg%&@h-|GU&q;73f4tThOj>o0JoZ)uu*LW8OeR7GTP<|p+d-KW`afFs1X1>UU zJ20eWa&?;V&XY)(i!iJ-b(ChaPL8dHo+hos(;g)0f*@mkk_oqK3byXR=jztT3FO4w z035QIiCDD=!PjK%z8vnYza40%3st!ob}JJPd3A(GJ6t4{TSO64+XRbCSGuZk5&bKZ zsn@vY*TcYmx61>_e&q^1er(oH)oAp`!{v&ux{aPnEn)?=fG$w~OSCG2?(E!Nn`M1o zzZg4h?5x3ecv_zwsB}1e`lRQ|FLTse_o0gV*QrQXc4mkmA~p%m-LRG?#WHiC=7+1- zD;2g`vuPeohblj!z(05HRS=6X0sJ2IK8L#5NgqluNtymu z2h{-_Nqv%WH|>V2`vOTpWzTdeAlWzBeZ0PS52iP&x+t^&r?{!?n(#8G zr&AlGv6`Gxw1Q~8CSgN>hR5Hf4v13C##mHr*MmQ3l7nxk3ESv$E09 zXuXw4q|l5H`+Z$&cD^U9S#7>=f`ajfxbwM^3BTFW*PS1+5fp<#`#OdSuv?yoH$x(!ld#cOBuJlG0WiU2B+QlJO@g*7^nr&DLui#HU}uwr3G>`l_^GvZgTd-&SAsJVpV|6 z*IX5c3sq8I?qW|6ttD?2f7h-x^6_|r{rYt)}%&PNV2kxFVRf}mAoPi|Z_a_*fxsx@! zh%MOq7U{v=+|*aeOe_q$Brs+TeBh~1X?BMs8GF}2)&~8Sj$3lh>$8o?efEBxnw=&t zVf9kaE4Q<}(Xp-4Q16_6^Pnc2!@JANWcprOBG>#n;C{8mtHC3no5e@6^EqAw`hIsa&R5>+A+UoZgxYWxH!%BpSuy8?P8&g{#jRe>V1vzSNSbib^)$<3NTnY(Qm{{LfR;a!Vx-slZVN?w3ei&I@R_2X}Bsa{#w&H z!bu)IP9AuoriU`x85nA3^KKq@Z|=gSj?Q25bY0s^8wMbaJ8P}UTT|wtSL;6Y1(dAZ zYo3N4-vex{uYSfZeSeVA;{J&L!Tv9Oz2twquQ$8CKb{TVh1dJPcJ#LXRm=Nt9lf0% z`9JMW_rKZE3#ud9?f-vA?;qB^`sYqx>ECsGAGo+*y;NQ%?)w*OGb`*gU89)C>$@Gi znmO1fo-o~n^=j6u4_-_9Qn(siddTO`=I)cKE2wq*G&7J}n&X#>6aw~k$PS}1^~T@8 z+0ydisoeL`*KEtj5pWhCh{Qt+3TJjYYO} z*4u|Ezk%$kx?H6`9(*T|fDk88{a! z?y(vi%TTVOSX2gJAm-uwfX0%Shvc4p1q9W+YRL!z*6_F%c{ zT7q}Bgblg8*K%kqFj8mm8>xu?CufnmNMFJ<_NI6>nE2i#tKaLxBCqcBeb`4gpr_5T z8^@ulQlfJVMc#qNHk<@8DP4H`B}2nCJz*SuV~T#%YzSGA@R z&vE&r*b`(sRfcIf#kzZ`ccM-T*iv4tpZfjQ(gy5+g5Sz}v+(4}ZlU|#X=PqAJ>0%T zP@y>FUlY7OAB!4M9_gPYTpsUNW08G?)g{Rh{8gIa(xq3JU<;3c!2-6dFBDa3E}7bR z@LSj!0CQ>5#_fhXK{}9gYVZ_oS1;W{RID!rmj0YyBBz6U{T(leX=#Zq{eiv=!!Byp%DJFtl`elK#e6vC}WIKOAkt|$J`ZN z+$T(NJu{StHk_S_$M;nDU~uG1<@i`rey%sfJf>1NRO3DYz(qjXf(|8tc;H5+>Q6g* z6SraDtE%x5q#hROrP?jP=?tVl$8`6~%#0cNbw0o@B8G+{&|7wxr6ksfmR=ZxI1L)QOqCZv9jnOq%(oJsX6ewWkzQQii`TF{$65Gm8l0N!8VEW#s4*ipTg?zZ}NxL zI%0dbI~zSvgO>&M0?2TW@8kEE%k1I(7p2GK)e4cibFzBjvf7F};cLDow}9V~x+S&y zX-&pY>h``2)~NlgUTPDRU|;7ah)yqF&-;FX*E>~{l4p;z3Ty_x97jD+!OC;xXBqnn zy&qA0sQ%$`+>{}&je14+NyML;p%)OjYQ}EtD$PCxoQ<(jCSjEEKrR!*YHw=M{!?fG z_F%eN&fhzAz*r|0t*Va6Uazb6qf=BNP{#P+Kyp9s8=#N#v3-3(e}P)Q6MaoVAKL2h zmjPfEz0L0ApSrH3&jEF+1I3P*v1bClI6!v!wR-ek{){X%@Ly1E;XSt^(?B$*HE&Jd zUi$$i#<$HT+jLR|yVdFL@e!Uj%ge!cEfnU9cSSiy@Am_cbQN8WwZ>-un#tH}IL^|+ z5gM4&>(Z6c)yBH&qXD8J-A=9?5L;ciyVf0Ova+zmMUr6>2+xHdBME%^FgkEPb zg~#V+zA$yHq{>qr<4A{Kwd{7;&o66oBK(4l=WgnhC+H-C`&g|p!b)J}AwtH~< zzu8^EB+#-u(#W$|_NF!F7F#YLbfrv1mLUR9@Z}@D_|x{uN5FOTt0~Y>I8*CxAP6IM zGOH!`*Ya=P0__Y~y#`uX;c#AZTC1_ITh|)6C%A-pNbcalW$eRtoJ;VnpDOWgoqucI zl;lG!U z(RB0`l7uy@dx4+LYCRAL4R`vu>Ew}GXgz9fv^Lr)#zH_>#4?>3nwUObNZ#@Tnx2{! zyNH||iETUc#W$P2N|)wdc8VXEuUez$?>TH$RUOcbLKzgEs0YJ6TKh~!WV zcwcAF91a(g^J<5EU%F5$>93*kH(q$w{peDcsMq>TrZ=H};frDeG|OQAQRUE`_Wb2= zc}WRJ1jLXYzh(v9iwPoF_BC89Yju77qa~-X9vlbz zfw7JET!$Q1w_sHZ7q&GkWy?>k+qvfbat85JT;gM4+kiVTHy+lE-CQy88g)x=lJ^rq zIYXEN>o{*kD`%)Tq-NGPpT6=`GU5*_7*g8AcA)vo{}aB%xGR#-jr_)j^9uP{rz&T| zCq=I&$nSbQuH~LQ$(s|qUW}JVgb5Galp}=JYO*ZtrDyY$JVk&+9Ma>isXxKH7PvOq zdqz<6YP0^e8Z&Es4bU2|mUIe}`1ZbSe-HHY2*}DV9J#OZtO93TB$!QpaH~`DORQ=b zdh_+)0BmY+-F_K=?cN$xj7JOJK4~)^aF~Z>7)44ccgXenm8!u~Y-1a`%dWg(X`bL% zjcj1W%E~PD`tH3r^#&Cr60-fwEo!62$wg`f19l;VT3=ZZ-|)#qL(QU7YlTvS;Nz7u>{2VtysyPEVY2tAK=^d4^p zhLMiW#o0+3I%xKz{ku7dC-;%iDpc|PTgx_}Nx4P7KoNHpWZl=;aJqM?hPFQq>)qC( zd;NaGb?Pjk%LywwBjO7HT;!k@Z*#=)!9K~9^0mI@-xUGSk5u3=%^KO?J)~brBP()z zU#-a98f`V+N6;0a zL%@d$R;XmtQeRANEBArjzbDrLAFeI35(fSZol;us`Th+xzU+KyulCae8-beU${%lP zywjhz0O2z3o53LDsA-)~Q4c6jW(XsSwh559 zDw;d#29ZkDQA>l`fN^o-3Vr&O?gbQt@nrXwMkiyu0)>e({T@sJFL?wR2w_lF)#BnV z47mQ3j4yGp?~98@`Ef1P=4BN037^IaiY0*?^<&eJ~9MFtPl6WG&M@JrrWDqYaSds}NUO#W%X#s|H_P@~=X70Yc|@ma;P zh~vQqYRQReDPgK4Zeni}SeP5z8Po1{uB)ai?e~2PLu6JFLP~?VOwpjokd!pIeE(Olz z^#mr;C>P&Q*cP85`)QXvH1N!_-d(}Z)L9J)|Mcu~CR!_^M2G%#gmGcN0aOLPyIp>0 zI^VqtW==ZWi^_Z&4_+PvWMb_@3VB!^ni@j3X~N8x{>lTvX_Xq%i>FuR<(HC{3w9?? z`-MuMx_#CY-|crg*}V%okT{ju!`mdW%$2&v`aO@PpRWXP*xt^d5v{e-<^jL}_!)Wc zzD}jfN#^lErX&d2^z{0vXi2&SxBIOo4d~V%Hg}GPMJ}1T8SZwD;Rr9OwfAtOsqN_a zyCxPQKk-?s%4rol6bFMD)4}8VH5jneq8}7zOL}zZOLl8mWR!|rf=F1_2ZVp?QoDq? z?#G>;LT%OR>|fVo^;^5T85UV6#Ur7*a?Z)*gr5Vgu-QCbvb92<+T=Tf$j%Oq5W1Qt zZ&brRNyF{b_oO+}ZD&|1xukhrKk#*R(FkVC4rWgOkp4_h2g>e2a=KDwJ>!0-)$R$- zA7id^(W(9UA>8`1&PdJnx0nn$8KRZIZ40%z5L{VabKdm z#bQBNHSGga_Q(Zgg1d2t)1R`$n*6tMfz-hx*IFM5Y3bCRVEzn~$3S4aIJ+0y4!c9A zjW=uqrM$Hc4*$>j+aiTZX7o7A&7+f4RGZ2E z1Xt}crw_@UcR-D@yR^pr+{y7&PG0n*mD%B1H{<>s{@urSJ=9ggNfH0N>|)wDZ$7sX zVjbrh3XZ2Wirqg??dR%fg*j>P9bMzJ8c#l@`PK?mjHv-aAur!Yf=+==eNtD{0>qFiPC5 zM{M`*XeI&xm`(3?D%1qpnfdY&`sbK}%!5!db>)W2~<-$7?Zu91c1B%MtTbI_#bw6z)Pdi)!InkCW(HkYF(zrYN zORv?xgRby0gZ-qrd2roNW%c*BP(P2G!#zUo3+3$a+3(yRnXOnIU#Y#KbT3u8nP(AZ z&+)0LcKV+2?!T6#Rcdqx5C2r|{3_Q)rk;y3G0J?|jR}b_t)4q?O9g@33M=ARSg4p@ zD05RgefQ$Uo&RPk5n>g+?CmzxaZ!!KS3s*iq?80Dko zuN!9I$uu!My3y`M91Sin2cOP{I9Ad9xF~crfGO_gJs`KEb5oVFEyR&vkoEaE-@-$j zbJ*f&q?L9?r?K*PLZQd^(t8FSG55r`a?9+Dy|h9ZgLq5iYt1=RY#Rs z*LSw62+ih`nN0gAKPJOfZ3!L>(*DgCg_7!TzxewjWZJMXDa_t2d~iKCgy3rsABj+m zv(Z!wC%xHeR|_xs_}nj>r)JIU-v_6afBGE1&;4@@L?5`XRq;|imU3t8aEn{dW8~*w zkT?0vSIlWSr)tjpeC`8;RJnHf+Ov7<_bPWqJ@jjHv|c?`VZ|f7L4U?>o6yo10ZWL#q7ZWE#vf08;P~@IG&5Y@^H%)*VVsyc&wJH%?)f+ z@}CR7Koc6^LQ_18yq$R3p}EMUJ3V2$A!Pe+k~@8s!t6;r$P^&=UjwHr<#oe7pF))= zo{ZAE`YNB^2_Vt<-6R&N(ueE;3C|L)>Ph=loSFx|w8duVicq=Gy0)S!?Z=zwEpx zpT<2s|Gd1T&)Nc;Lw+Z}2Hm&AYmF=?RO z_gMK_t6!N<)$Hn3sbqWd6)~ zHtl&d-|k8)@>KE>Ja2v%9a&tM3UP;+60Q|rpM<(z#Ba^eREexNNa~j-o7gz+^~JD9 z(X)LI3gzy+>rH98H>%Vp;;hjKz--Mo4~X;GV0V^R6*vH&(rBtx_L(#O>YBm4aUsyK zbG_Zd#%ah7Zjf=^fL&$BXuub*B_f1g_T^5COy_s}7*w_DaO{K#madM&$=0dawHZ85 zxiG)~bRKoND+ZOkQkuty8J7dS7PN$jb*vp!obB0YG)V1jO{j=b{9uS+*I%vcL!95n zbL7gpf5A{;Uk%vFhQVhZNoDe|Y=TI!-Dw_q{@E-4{CnlZWY0Y5rn5M_mEB9!M^E*x z*X>U9+01Y4tlp}_q%}8-zwT9!0#nNB{O(9>VUV);WM#XW`4m>Lfct~x=+j|vPNbm5HW2;Zsqa)Vm=?QHPMb>1Ui-A|&o z*7pk`6pEemv3fb`9o0vh-OzWY{-@Y5+bI{}{$<}!BHiqN-w0`Mb?eUkQRJ(=cYd=1 zpN^luLJ@;8@9jDDowIrpO!f`GZ|@<(0G%Xw1yloQd1I!Et1Yz18`=~EM! z#arZZfATM=oz{_HUI*q^)?VWZy^h;!IV&FQIZmse;oYezVKhEWS&FTCw5+0F^+X{Kt9v6%8#NiHEZ5z+aeW;c21-Wvv!X%J=lnk z^|~~GN&njSu!#g9b-^L2AZNSF%f^|p^o-4j6@(uORF~g~zPYWG`HwqugaW#5I> z_G)E!{qGo3Sfl2Sxg5LvV7|?VTVT>WRmocim({B-=I(}&8$}i7hsy(NFZ|*UDC$4)NZpXPtqHkBpX{-Wsc`6t;o(%@xNYBXy zCVbx@3OhzFKr_3~c7JleGBTkySXK(>)vo<8-}BTfCd#!xDxNp$aI$YLiS=yl<)5n9 zI({LqA!3=#bmeDzjW;8=f?%}2gij>SZ`ni7n3OXgX2qwiW9?K0BuVBy%T``V2ggg& zBa3~T&InwcbzB=ruv!U!;$JkZkOuk9oL{Hf-T$Z?cN2|_BU1ls4|=CrwXh`DmE&k^ zO=mlM4nH$%UNv^M!~-V8_?gz|OyQr^w&@qQ%J5Oynt?h1Ul;68!-Bby(PkcEyGfNp zJ}b%Yij#2z(%Ge>S%0CO_Dk8V2_2@?LYWN@!A$9^(x|q@UGy@`g2^-iikkD)0K_qP zu50o5Xfr`;)6U0gSwet|Gka8k^JDr_E}3-KQiZxF^;NTc87-qF083|j%iah#skmMk zS6Z^0zmYnv9Iv1$^v4fPB+;cni(RKF({T?)vYnnfp4Q(?d+~PwEi7HndE(!!Jbi5D zkO>o-9b9+(4W)E%kI}00#L#9>)Y4Un3*T?*29f>kHP=hKt+QWVHS`stDdOlNG}wEe z@haiqke-LYfTD7JH8VtW=`&YcF8qGKnk5JGcer%o{$cEkwedXDxy0>98v5li1I~+; zi`(DU@PRaX%OEpD2OxIQQphd!;`XB3uboZ3oC)SFM#O8we36`=mTfBJ@c!uW^51_( zpU5gUD}JtECppEulsy|>R;uR!;BAbip?CcCAQcGrb+oyyv-^6S3liStX_W|#jM|d~ zG3X2K{9Y3dcULy~t~XIva<@Kr-(WfA+LibP2An-do93Aw^L zdYxVL9ri!F7qIU&r2cm@coe4T4*$K{+KYRGK+7ulHz=0;!5XpqX0N+q)ezI^HC+vN zlXK-SKO4KgY$2hkUD$ydXN)A9*}51_(nB@wo|(y|T@*8&9W}eOz#@2YV03p!tlEsN zf4P3SH_Yx1f0t9XmK|@1x^w?KPe}6@BB7H1i(8)ySA3Roh85>$!@sn7{#@3R+tW6C zamxF%+Rr}Q#kLcm*EUR5O+Mg`81o)YO{TqMu;O6C__|k$9156r>&_Qde6?xSOM`Iz z9DKy9a;7b@tpdesDPnDy^w_AIbFO!kZcvZuz_Y68p9*QM@^mq!dshJ)_Y}gy*k(Qve?L3K zwmWFI>gIU$=5s@ao&=nKH;Pa6iT9_|QibDKZ;b4Zi=DG9ZjMe)E3==#S=$@qwj9g` zOgTFkZq6B?F?#3GsLKod@#O#ZpE4&P%G{wYANTj^8MtBG}aHtc51 z(1JnW(v+=+fy@CD&c;EU1x_tzflv>izT&%6)m^NZy@2mBwe!QQK8xz{%8YGsTRsem zBd@>H_5>tf3+Jqy9d>ApJCqOIDA&xVPEOq!xH0X+*9Sdt*)}-X96hsZlC_Ee&>f3zJK(hrN_&)FCR6%O=foEd&A0%%cO`m z!Dz56A2E71IBZUgLJn`YI4Fwkv2+=4Zv8-yU|}ll?-JXYYB#dgxHRHDQTfjB2>9h0 zV{nv~#Si$m8@+1pffx=LldAW&_+dRI{#%FI~R7-hgc2m!*B5mym6$<0A^jjY|+FD2s zPVMxI@P3%qxV;=dy9U>dp%CTByr)@=9i6J(*M0p)mXtZ_}H7oYq}+ zimD2qMd;cGs@~mFA;YYn{lns1D}Y>aMVHG-=4XBmUOXWd8#!}~AMbktovZZ-YcQ>r z(cdTiN99aE;^wTb?r~Jq{mq2{{qnXWXr1o+s*ubmvHrBNd%HKAOZ>BB9JfyQ!Op1~ zODXJ>AHZWPw>e-x_M=|)GC--ojmI^kwn%7o6Ec4W#~_!(oNPP}s|64$s`_dIdF$7> zJTw0e-|5UYZoh1I4<;NZmM-Vp`t`;t!OFIq$};@SsWp2J{<%G(Ol5}7Y^{YOotr{^ z)t&*koEy7pt&1$}jx8{H`ory~q`^e$?~u93+BU<)-WccR*AdXn;GxeJmx8V}=+)`e zl=6T=I8HAQ`hhs;M7c2iOLk)~chFH&u}j6xGV<2#U>>wJP@NWm{Li?V&%js*qMKi% z9N^}i+28u8{BG=&)>!mV(W_H#bTqO^@+1T-P%2bbR|&q9bJqHi-H;&2jI2d|HfwHM zronC|r#}4JQun*+G@m3{qUpHA^E&_#&YY%bzl^FnPaTy@5i;iOrD7JK0NHY@@bEOJ zSHo*~+#;!GtJm8%*}=(h2F{J;HX)1Lfu{Z1y%Us)Mk5k$!QTb;rSF0~TFKhgKe5Qf zs8d!9ee_N15u=~U5%ZTNGI~_-ZD|b1lnp0kt8A`=r7Tv0#~2uqg4!S9mApb>3(`Ri z>dF_G=v#JSxAHvIkYTe)zfJEd>Aj8jp5e3U10J)Z@4Aa7pXPXMz59B?o@>j?%i@8Yyhhzt zYXTe>eFJ(O{hpz})m2k!_Yg&NaHx)XhBu6;8*vohKr{p73V>#NBG;=`Y(SA*`lc)l zDRqRl{}PZgUZI%z1bNc%KR&Zlxh#)um+v>n!ULqTB|6LOY|zcDUZTcX1gmyNl=1$n zSHnJ?+4-kT+mU2ZO&ni20*$B?;id87NJDX*xl%A?{bfm}_ga^^(qHhcxZ7(aNrfqS zj$t!1iA2QDN!)2{OqK6o^$JQ%rnkc@u1iG~xh`r0byFB^M(Sz^(P~bx`pMI}eC1b? za&x`rw&Lg2R>$5MC0}`M)LXYW1OqjDxNdCRXiUxOIN8bw&aTnjK;I6pw$1x|%8c8u zb-h1Vo{CpJ6v(qb|0}^VS*-5TCn`0M4|DR0J_iLuw}&4R{Q%$#FO!zubSuvpdjR{L z;mny~@4xTTDnhHc{=CJaa-r9X&AmLS45c+NMs+28*ABx?S+xw-C{l1_Tf zwQ(bW{+L-xtgukh%>pL|J8O;(Ef94b5F465jFV?MvGf^K?_EbOh`ViLmc2h}2Oc7{ z-$e-EUfl54hQ5}QoLm~aBUgP42iJYCNZggb%|@zzInX;hSm}xsf?WS|j`EPY{Uzeq z!!neA92nZ5_KmM&H(Sp!fU<62TA@bEv*OsP?mykNa`%2qQGklP%YY(j?Umw=xXGp6 z1EMZrboSH?4&4AY79&|GPY#RML4Q?8rJ|~caUDDozx|${7x7D1jnS(nxgC3+rQ^>G zZI;{U@2@tEIew#QbFtte#AUg{lA{ApjO|Bv-@k0J%?U$BfhkMuMPB+!Y1TNgl(y-C zKIY{~xA*b)^Pwg=0g__pxev}M0M@*DTz`EI)dU&s9;||~kIHe_*=73p29JJT2Nr;e zImoe5CzXh)R!XP-z-Uf%^z^j{p@;F0r+aw2oxS$J{rd%KQYErN?Yg-dqC4fNx7(CY zPizjY7tT_O`pANhndJbb90teU)#9nE%w-)oC(K7JFcA#+1W&FJU_KHJp6N5IGChm zo+^$eTRV(_Aur~lL-x?QpF8K@27%bryO{{jw0E91W~q|CI>-BxePgw4;@E?IXwKB3 z{JvVn=LXlF5RjMSVEo{<7O>%jwNYJGgcU!l|79CCmX=*a=y(C+(^fNsx#3a_2Lj*D z{h{jPTPnt|Ze__+B%uu|a;wI%TlcGIhTgEa;t3Iwm@U_Jk2`rq>DPoZgI zGq`=Y?rl~bUuI+;nM8kf>u|m}q|WuyB4c0ABf)xsD5uz2vt_oi#(Ml$FTIzAJapX` zaNP3;3D{{UGP`R#=d->a?*A@(`}`%LhDIW+TX-3@n{4Yqw2Q=n_G@n`4W|oJi+Y>~ z6_9%PA+JX?F`z0i^o=QXkuk4MR;IxzdE+B`TuShMrbvg-Hu0MXm&;!tFd+bo?CVgu zNy`?oI0(J{mjt#bwFM+WoAnd*(NoCsx2JFP7Pma;-3BE*_gQjJnWM|0lpCMS(X8^v z{HX|2oP5-2_Ag;LSQT-mTKDIKqR+^cnLLg7fsONnRcrv?)|~tn5Y(mfjOfgO-Z2ygfp zj7l;-@xCliqCL}^VW$;iIGNi8&;><6OEHhDgiyQwyfxZ^USM4h_Md5};Bd&U?LQI_ zZ0*rQ6t>~>`g2z@z1f`C^h+`z#&1Z4!v)}4M^lvCY!Xime$4TerLzMRL0qT7Wi{@X zmg?JR@VQQrYA zDt|n0%R|x@l1qDDCMG;e9U4SUa2O6S8n+_U5));HTwt)aH%jg-!?p8Fg|e0gSF1r+ zjA1rstvLc41&Ee%#(I_4r{Jx*2>7jbsg?Nk7>0|&ErgZftlYDw`tR*MFLk8vO`pwl z{(xvvLk0C{_qzN`@5hc20X*%U?qNpc+thA~#N)oj?jX5vcC1s+%|F&>G zoMQV9piQx59brNBKwRLlM?&4F}Ia}ipT`JFueZlzUH^F)|f4`L9bLE@=ypTebUj_AeM<+~q)!Ua^ zFJW(FyZYQepGw*zka*JU%>L?gVgt0DiFew1($zG^Z8Bkvz~P{VXL9 z1X{#q55nUa5MEodD<_3wHqG|k?y+0?0fKWB%RB?POr2Q-=7FJqsGX6Cx7^fA%s7)Y znnk>m%NE}9G$AaLz!2qH{P}*PnWcyF__ckCt_g-ylU{Bf?n^F=7P-~5niqQyv*=Fx z*OfPOA4O~U(QJ9YaGlAr2SELycv7*}-ublQd6*gZApNj7LURW$Q?x7B3zOd{JFeBG zox5Ftx6p1DUVpQit9M7x8GhDlP{J{^jKKC9%>nsp3~!yIci$-8LrcmaqczPJJ#1$_ zhl*6I9otvf<|d}o@Z?LO+7ct zny|L-0D2lw^J3{SE9BR&eDgQ_R?J6!)!}39xqZ@Org4_)%OX^Vw$DReT^t)w7$5C* zjg2co)hFEdHFt6&6F1aXh~D|Z8#Gd-jadJVHqatx_JPfHwdx?V0B~`OwTwlBT5P-R z5pM!`rrGcP)z%`iDv0u8#4r{9F%D>7vwyuxz!%rkVLtr=E9A^+bJY{4A93aVsJYb5 z<@TGxy^@pD7X?_MAJNR0O14+#&;_IP%SdI2)gQgdYCl@gz017m|K;ur>z8MsGSFNY zTi?+9%>ZtWI7cq)`ZD)f9~S9guz7w?13Q23WIyV=U~-3~e^2Y}EKE&%?g|z7L zLx|seHl1*&6OC->Syj6`C}A+;uv8K^`VPmwY5(F=0i6I`=19O#axE?@?%*Oe%+Wp7 zi%T16J|~2vPhiHJsm2LRH~Y~$o?M&CW;k~S$7OLGlhw;JFMNS0eFXfgddFxn_8wr?3yF8JTN|NhXQ>FHc*>7uM46TVxu$CdntkB&!IT+vG{a-4dB z9-wjI{W;fwbaWjmj?ie9)jrXJ6z^7`YVB!ryB{a-SFozHfYa3u^_h6UAj>NW->j6J zR^r+Y#)sVEm>HZ{|J`Wg@#}cqPAWq(zbd; z!A`D3E@J`2U?&a^HM0(L2hs=E>&YA`uQUGZahWiKK1`A%#Gf^Mm0e<2A)Qk_Esu%0 zH7q;NcPS{`pT{AWJ2n4C0M*>I{ygUWwndv4`jtZNkLi@I`0I`sfxj|ee*+QnlBGd2@{Y4h`rcwCp6 z4&qOS{;K@5ieb~1$%F7%IC`&QpDQN-MWr*NS(=gO&tOI$rUqEl8bo#2e$$VEDvwL8 zEVnW_t`oUKAq4$l?(lOFxdpN*W*1buk8-83n>`%{AAhpDqzzzs@ow%QjMP0Ws$PsQ z8y|Uc#OX!*R!On{As95H*{S5o5WfGRT~A;62J#pZf2BFv zUu)SrZOwP|D!0p0@f-ZPOzk;7ct=&-UyRn!I}ad7qkkJ^;?()!D99uerX`J;MFI=W zUw@oIiOKQ}C;B8ampjV-8?j(|Xp!~Wg{`uH!Vd6k>;hwpg1%rY^-^KAtU_=HFk!4v zje-Ixzqn#nJ~s1&3f)cm7r#5w4rx_=3=U72zasl5p**vMqFL^q>-Sf77J0>7x+JXA z{j$6&HF5Tuz8Xn~1rH^#=5bQqG0)s=NMGyTUs+graSPLsRy;Rf*`NuP@n!mTdgKT| zGiP~rI^%S|b|RD|;ZAn?WI3k%z?5Ws4kEVF*^kUj_X!ztY+YWJ%7Y zP9AH7cJX0SU5B87*I~;58i1!Jx-5S(*?nqM#yPZyvZbna+=L}z`5yb7V&^WZFKldC zaX_0n!%V$MlMSkyW|(Z(Mh)TdoGokQ1@W&=$sfXC`=@g|7Y*-()gtqUcaObJ*v*wu zPwMtrQuTehGz@?Stu0&BjJLf-ts{xWXl$8p8{o8Q;>9^?_XcmIMLIHEM)lf~v?pLX zo+|#a5BYPy-BCINiOzXTY{>HxF4n5>^_8#jl|G)(#T~|RT%Bg0Da=xx?A#^LvJ)Fc z6s^|ROIdcH<3{Hfo}VxC0kO|YaGA}+0L>h?&QdvNwkEnfwI}Ze0VDV`4sA5%LQvAv zJ;2QgTR%M_VQn#sCSx8#EB|+Z-oNi^^!{=lfge zqnYho$b;3IDJIRzzt=Y;i(ho-XP8bObm$^{rChD0_MxKDNrw1VrRH;8?okbtY#Vjt zUhY)7!#}&+y?vcCEnv6G;=_6_01#xn&{vy4PCfBJFaJ8$n_Sg5bj#{DyBX%T(y?k;;^$s;&9WY@g8fMHpuWxT38`|`Js-`GHgB;pG`=(2TdhqMzj_w2h7 z|He$SY?I5+D_n>0?~2^?O>k_lURceH0nA(>ueD0%w(gu12^f2(cIMG!XS4y6ZhHr= z%6v^aaJ`vlK~{+B#N1nG2z%7;zc1WU^uOM#vO)P5=B=`|pdyp| z{~umInEMw5bxX*BYTL(uzZg6J^v(af|FVsm3H^f7pH$o|J^)xE-ucJwpj6>Pg(k@3 zvUKOaUt|}iLFn_P9K-C@Ss1R65B05z*zdL6m>^F=(LbS;_Ss7?3(VxGm7)&%PWHfj zO=?LkPo(B3geMEXx;B|PVORF%2Dh`6&G70#h}V1ch@i{n_L0SlF1I9Rt@_IRoz4+U zZeOp;9?)LY0jA^sea5`fUuEW3vj6W2ij_}zo^!OA;@P6m|Bqr-*pR}-QD#$iwry|)Y^Ulo>s%eVrTKSMT(gC5 zc{d&SLh zpWO|-tUg!XJ?kB_2DRLsE>a%g$C-DR_q21R`O2QMaGQ+J$)d58trZynw@d7r2r2mP zfuVZ6$837JxM%4L_3u8`O$djSj3N4IjoaUfHsSN&%UcBr-D-~;J0|G?#g(ti;^4vU z_drzFA8qtqDfr0bWP7rA|4i;e!!I_z)CIqVU3XveTNv3E177{-wlksF5#fcQZkx4nFlICN}bAezF&q26+8TbSR>G)Zkf0-H) ziq2&}M3-1m4A@}>!p>*FB9A#>|5Y!y*E$%+k-M31#97W7B`xInCnu|R$#kkP`k%7$ z1V~2a#RQ_Ir*86(w2Z+5k_pDnsq<2$zMXBndh+5{sqXyTHJEh%TvhSBcGjhno3m9o zq&_fGfj!&sF~9uoW35F~uqARIUBBs|a6jv{UwNM+OBzaCiBl!ft}}ai6+i1jXOP~g z5ujgf?dg?7=mCB|R1P`H>JUa6)WhV`+i~*c61Ch0@vb-PREr_IhuCGZV{dt%HL7J# zEN2VtciCiLs_(m8#BBilfKnL&wqr$LtVbRLkLv37r{Q+qmn zL!FjB{|x!EhO}np54FH!DW|ZxrcSHNal1}h)YE^WqmSnG$IlHThegnuwf)U-b*^0Z<(Gkwd`}HA{E)77`v%Bt(%(nN?Ts`pwoZ-2F>mz%96G!B^mzl;BS9`{PoX(Ah zl`Hs1`<8n7xHi?debckfSB+@Cv)5aMbA@I%ePFucRR7+~wk4FQb*Udh0C@63itopI z_FQ&R@_k;+V+l1u5YP`Z8*zUsN$)vCcq>Ke41zSGRdY9!)VP!}$6xkQYMmBxx2p=9 zJ?6s-r4!6zA8h-tadFyMlGNaDd)o=QAChrv*-x>Fd$yz8^6Y4pf0j1{)J!=~R0`MK z!nuLyWz(=>;$jp%KZXs2HS`!)(BCQ|?*+`sZC)KHod@{VC$I}*vHW>JOXye3d#$v~ z_LF^raRl%vat^kMD&g8mYS#0e-wVQzOjoD36sxsMsh|IbpifBO0U!8Yb^-Dca>l6T4Ci@BoN!N(Lg406z zhQ4~NtuH}&!^`?u#~R2MyJEYDDGV|w+L2(xTmhL}H9Wox#Y6V@bWxg^W?r3f+8Lsd zqyIEwZU@xdob0P6*;@|J&1-*Iih`vl#vS+dLf~I_wa;&h-U95?|BYsyM0z*#0?I7C z0bw4@Nq^&as8_kSVEZu0Wp;8R6<39ZU&b9h+bw^dfw~}sbahM ziQEO6`Ftx4jE=b9;28fV?fSelpt2in^e`|@5ZxE5oltm(#IqI2Qc~My`lL8n2o2bo z{20t_j|dIgYp3CQejk2e&h_dw?F@`;f-ooRoeJM%{T9UU)M$?qTRn-ZEKJJ_NQyZC zczV^|tK+r3EYQEa{A@i%PutpkYYh-=J1OrgHOJcA(vwc5dnnnUEBgqLz?=Siy)WWu zf^|LWd}vSi4>p6;<4gTdZ-7Lyyp6_C?(O8WB~i4L%ZG8Mm;1e43K_0@KwWWE@I_%T z&x$P=!-a99QErxov)hKenm3lb;|q$G=16eSPgi=jvZDPX7(VQFl^42QFqu z^QJ#G0N`9)GDK~Aa(u@m5RL>?euof z*Gkqml-k`CRCt~s!%$K-mum7!azBu({Df4hJl^^8MQY!$?uR#?J-U#?5lE%>kEfe! z^~~>a-kypBg7#Fey?FicwT``dUZYe}zQ5>Nlc;<^ZF76|Tl(Z4tIF-2YJp+r_vg;| zdr&(}X$+0RTcNhPKp6M8>YK1p$<0Zh##pA4$>;J>FXBC4Da-%uUtp^AZfayk93C0A z89&6}b*&!GFH68%R^eEcF5hy`u#s1xoG(UgmK?2iB3l)QHFZB3RLMvD+jYU>H}Ar^ z=LVq!qoF2@OKUE~=l1m1aF4V3Ke3qyQsy`CfP1yAP?#D*Y}OPh;MNUPT#l3QF%x%{%n;ZfTIcjp${xa^8j| z-k;p>ZmE0?o8Ic1tanYrMSCGlcuu%}FbiMvbT+@+k z+=_beLcC#SU%F6R7Egii@Jc{C2bvVCD;%d{@k@%>U$y$_mP0JJy$`+RYFs*I1pn<; zdv&6%+&VS-?*l=P=x1oNOg7aKuhiGSx!I}ah3Yh3FRo&*UMlreDV<#AZFv+wWZ*Zynbk_WY0E{5-$C%}pOS3k^GziWwEC;^X#>&&~M_#EYNxz^$*y zLaT(;ihbZhyMm5v%jo76Nzs4<<5R7A&YFjUQCbq{PdgT!7)6*%HDonw{FHq@j zJiMM;fWUce8tkxVA-~A)Y#Y}Ji#}$jZ-8wxc^CsgZc*cJ{6sT7?I~X@Nm)O-820Su z(o1$KanEDl%MVMh(uAimcX@0D#%*)aDjfzAc}@-N5i@*!CYPuvZJ$l;^?`)7DV~ki zRzUyYZ4;k7p9R_8@#=}9AUDC0R>X#mWtI0KARMvC+kX5vbi}W1atvRoIXEgQ~CjToJ`A>dP0lCILLhZu7zlWH^43QOeQfL8Iqx#~&iTuGf zZK1Glb*7K6F!C=+vHE(71L@tSC(rYV|K&wnI?##=1ADD$?p>XJ-2cbYdq+J{rvLxg zHAu6!Mbc-|CcS4SWzsWACX+tNr1#7unIxzyDu{Jm1z9Y+Sk|?y`>|rzwTo-TzA9Gi zSg>Hjg8RMwoge@391c9^0M9dX-`Dkizg}Xg2cJt7Y<#GVR0W(>n)SwN346IB6w-c6 zeh6%Ll&+^Oq$qi;BQJ-`j76O2LTacA#(XU?M(HH3;egf-)k8c9Dj7613G@NR#Z`*e zoB*gO>u0%AB`S9o{9q9iM`vEEB8;a+WNVP&^gPc&fqW%BK`XYPQ4{W2ft=puHdbI} z&S!H*hiD8Sba5k)=;`=wPwNo`bRyU;)p;0LkJh6>8i%rh09UkX^x3Yi?A8mxw*Wg1 zrW2$HoDTuexeN-2qMmsaVoeD$NL7cKvE3OL$rX0Hb`}W=0=!-82uY{{Vh>TCnxtnF zCgXrS+>B4Me09|bO=RTN2msJG+DeVy;iSAX zp@8yRz(^|7Mi`Y?SuBUGA)qk=-zo%G?alL^;v8;Cldisqg(b%9AcBi)O&9n7Q@Jz#00cQhg7I(vP8f+QF78Ksw1tIJki7YQo5vq?5=>tl$LrJ z305pnurq5`Bt+h_ZbC>19T!%@vZA?bN(pN^7uIYmlxhKlHuwtfw)-=KnIt9GK~0Y^ zFqlBaoHvPwxoL2Kq(Ts2I29R8i9#SVhri%ppSH9yoyRz(=>uh zZC&ncN2lpTk#IRd&`#WmLBMsUwkz`eKu4jTgb)vA6FA!?)a7i-i{TEVXm>fKla`cJ zMv1@ZqcUbg17`CoCO<;pzM{%>5+Y}}fI*Ia!vsW2eT}flm5aK>Fg|UC;gZfG$_w(! z`5cow0YZ!39;JrJN|wU9}Itza2LD@O<9*#?a{~tAfysF07NTeOLs0Zwa+#O72?K->>&Dic{Vi(^R6~X(*<;8(x4Rdsxz%qQS-YE4a7tX(Q+gknZOn- z?^C-==CQWsGt^|5RvPY=Q*1mhbB}vzOIZn2)5d_b794;cr)y;FP?%0spD78Kpd1D6 z7$@B|=f#vK%5+?YsRo?(LlT^nCdCtVP;b>u)Gl{BG1O(NH7t-J^NoZ9^HIr>+29!J z)A1rzY;m|R9jKZ?cFxlpvb5Z6@HKk@b+YWwI@7|O)uOU>{Ue)GQq>rHHqo%04kbw~ z$x=>`^k+dM7!Ai0h+>`y_XD~yoX64@Wg=o#0A;Hw;L3Zrx+G&SAVg8>rITewKadek zrVFE4H6E8im4+`pq}xOp%#3Gd@MLcHP^CBuVm3BHtdDpC-g!J7#1e`C0?sx>H0`EC zm@!0ZD-NwPPDn+@38Za;M&evt9E4=qSxGYVHl6d3KhiSbJW4aTx@Z{9`i<&Tsh)6d zSupGnQ5Ks>1Tc?+S`4Sm7QK-px|-S~T~u@fDI`}0x$}?+^Ju7=7L>HIv*Zs$c+yNQZqfltDmnJFhVb5**kC4$)8(5EbxNctP|#t#URJ*2U@+S22|vqK2|n$!L>f ziijFPP)#W=N4bG;UL@-#j!}12L?+a#r3F&NRReQS%wEDHBrfb~VS>l2@g8vW`3O5F zoo20FTR4UHP*YpXh7#I7kV3f;!eVj6oFM9p(vnOZcT(-CAF|D&1wp%D9Og`OP|ePG zBV!+-un*cgNk3Ck1`>>+6_e$>gkmHMptJE*EXf9Ar2wNTVihKkZW~8{htb6}Tv4yC z5+MKJFl7bCV$L@RFg8F;fx*$J>$h54R&QvA4kJnz8`4i)fux~@&$KCFMh^qs3@e!#1u^-_|#26Ff$nK z{E+cvt-01v;c$lAnz~=y)q{484I%2yVm~|5i${H_#Lx^4Vkt~e?^nDMISx59d0LH> zO{grT=CQfA#p?lfz~C#YDD^yE*Axh24v;EieO{k4CA`{BRVY+SN|Y3p-}ZlW_M z&2|+6yUCmcM9yAHqU=t|7E;Q(pt5$}%)86Rl&Bpbn4%wr0sKg-Qe*JgG4lg-@eDAJ zu?kzAxQvC6SeK{(93E~_!8#%+sDWACXow>zs~iz|dogs-;U_f^cC9D0g}N_OnNC?i zn&rAv!aeSG>aLn8VP@Jo%ouGto3TQdu=l}>x701zDqUn)6rkoxzX_@)9#E)ACnhBi zu-1^NfmIwL0%$H}fhI$!OE+=v6fYQRjd(?2(z?Uik=tSbE<;GiS{Y<+_Y|DcnrNto z6asFX&ZFjxMAZZ=l{`&y1(3hBH))l>Tgm!ywUbfHJsNP#h1FQS2W3VP?O5ijH9fFN zQPXw^HCTeATXdyUExBumwf zfz7=^^K^s#F-T+ z8Cu!MPuZrGWg1mz`gvQFjoUItJCvJw5}_cD_#oP8vVgcbT#neV zcngpiqh#LOYo}*nz=Ne|zdO_$m31bs7WK+i{%PEgU=tM?0qtTFGzC@J=9rl(>VaXR zmNx}W1Ss1_0A0j0b);lHL|oTYrw*G0vuLdl;Iva!RWaKX=fhE+bgMNzN86OfhDxWH z_9m2WUQ-H&paN8g=y_=YfaSq7QQ-zp3}=cPgF?ed>jCg?R+fz>5Rt<=owx;-aSyRl zC1nAS%4b7^q@r#H@;Q7sgpDr79PqV8EaT4h1}y@Ha%CXG1N>I!a2_e-w3hK8Fi@uu z(85NGMR!CTO^!%`+y+V8o@BLbUIAO+H)Ds;vELlclu?O0MIO|jX{TL z$W$X$x}0xUQFkHiHV^ATU%i%0^5Ig#ZfR0|fG(fKOR$}$72_dMLrFT?8I3h94s`G2 zeGNt?{dGWi1vywIr2=QD84c_exY-Xy+yE+|RLsOtUvgM7fzcaMz*8`YKO*Hk*h850 zuBZ|309<$gNKKO3PTIf@u@W~${T8iMDd;P+_>?bajDzkpS5%BF;#guFiU1<>Fy#f8 zic+-GqNs7q#s=**dg!29E%4^1J%tQ4ZboV)EQ~9fxjX}4z%{L>(-R~{tpXF2B+4Qk zoBiJdnR?BT~SsnwTpsX`|TA#pxi{nD}bObSwvY@0tdW{;qJJ z@;t0U;##-I>j6Cvpa(3$MnFNEYK8((-yCTaKDO0vk$`aBK`P$nP>S+15s20(t0@IY z8utgdpK6G@4uv_J%NUL3NUk&CRa#W2VCD*XYE;M!c?fE?Ivzw2=yb*TMjLz=RXiXC z7p0^`V&sg~jJAX)TW^yZu&cA8WQm#gq-HUm@Os95j%pVJTz4qL4BBk7;!RAn0fqr7 zXuCQpP?_Dxyg2T+D^bO0+!r-!Zo&nG>=9Nj&Lpc+#SF_d)KVFMv4(0HUO*?+RkmiU?LXlJ>cIsu@+sekF+Ww_x=M z=SeVsFjyyaQmyV0Nx&*8N2X~dI;o&0l@ibEWdmqX97q~%7#55>lTpK%?E)AV%lMT} zV^m_4P>Ct&Gg{L?L8*6pvOd`CdUejrN8mOwklIf9GUkBR(Y(@(etx zxJ2A&Ua*N;p;jr7D2k_=amOPV>vQouZ}ay-tIa#ZfLmJZV%lkia!_JL16Gm|KurzAXt{EiXb0~$kXcI0dez?Kfo<ggA!wy?r!yq6NFRWQ zd*NcFSrtmUD2R(2f_@H11P*gYu8`;|J)=vB$p$HD)fU4enY00<5xrPPH)_@Dxk_xB z_l`0ZXG!O31iVH)W+|HtQG0+^_j(;;0(5}@dhd4G^c%DwmCUEvf4iK#oRC z5Us3PMzx}4{cLKjQyIOV)EoOyebh&7L`IvCMk2tdgy=2ZVUB<^d?scK(Lfewj@t!( zvLKqe0-gRatSwDid08n22x%P?u#(hTp&*vegIyn5&4S^tN;etS+hI~@z=@uSQfnQi zRKt~Zp*96AoHoKfzSi=ET7{X&WP`Es@NP zIqfLt)|m^j79#J>1-Vw%4=88qU`rhJw=MCau3oG##hJoFVRlu5ZJI=u@x-AhsD|Z& zEaMsmys2hJ#tiJ8E! z7<7HuNs}S9HagSBLmkO{i2ysF0xK&B-&` zQ3e2=>f(77l(4y4qngchxUK{;Yjp_|K$=EqnF_M{5E6Wg8ya*L8}Js7iDgm|T8sCo z5XPeMU~6cD-5mj4RRj&LqJfQsIh1eIRCL!HFUBJP<}T|c*pgQ7s!K(TT+}z0k+R&= z1v)CX*r1}ziUB(SkndqwXwcM)#j(ay%Jiz>1Y3t?8G8*g^(<&IB6cEbYt0@8xy%?E z8H&BUJDaGP6nVVTnD=9|LNOXp4mBd*1kqL7peY&6$8$y50BNdfw6v2L3p`_?(bV(@ z$mk^MaS!QfHI!%)Y}+)kS&%r0ugnl{px@JkLlUbJjt$Hiyfh7ZV|7DF9hM}gvxGvP zY;P8D@|gG#MYIYQlFHk9>3abA~gmP(=$H%L_zvLxos3G9`zIpQzc z7_+!n&Ck;9YA?wugfgilt!{VJU8fP(n$1EdH)l&;qsXh5wJl^j&l(V5Np01@E!RRxOdS?A!x5`S-L8j=ecjjrkXCjHB?dVs(BVxqM$Ta$ z`1EE>GR@#qX51!Afq20Jf@PhV8=Q||Eiw|69LW~=S4*a#2y7`ACA3A6p$em++7w7f z1~OG4<{Tod-Z!jhSa5GMXNTy(0vKvC&D@%IXTa0kkWP2ppu@_zgYub1fCJFb00bq> zsUQMm17O!CqDdNMFeX-;35;`v^b5b1QyYDn!=Q?izIWN)AeOG(@U^f`MRZdK;Z zeyC#~gbYG!%^(Z;n}A>g&}}lAl=W3jNF%nA> zGpTvl8pV`kVjyucy-Z{pm~=sUU=XvZ8CRQ$b0xnm3rbwQj4B?|jP(Lr@BbPIz2TCoO>(3>ll4aVCWX7;p+EB}S$>ew@A4)kgq2~%o4I#JEg_^TI_7w+! zql`7MHp++vSx}-(+2)l@F0Ysre5g^_mD%ZVSm#apLWAyHozt_*9=L)9ocgfaKjf7< zmq}jnHGqZzfi-f#y^2jLC2_SXwgW2CRM0o0CQ?|4VL^V(Ia=P1in9z$?UK3&8~8NG z$~z)oNfxTOX=}99(|L>mC!y+gDe<7p7=1~H)nBdT)ZVHy-tE&6;|Jz*eXAYRhM-x8 zcFuFYVQScyAzft#9=3HsGMxRoKMUk_x^`)l zi8gu#&wy~ZBXOOrSY`7zhlvGvV%JQ-j>Yaoa{zZL&3wSwt@b&jO{CjFxqsx>48<%N zFAc5Jn%Fa|Bmju42vK6G#xRPfHKK-ambONfvsf$PR@(yvP7mh>fh1P}jNlH%`v>Zx z-e*XPQmRJPSmv4|T`BFU0vW8w;Y`exIZL^dn*|zqdrd}a4DJqOWKmxO%eM+OHl|1_ zN|g>)5(SYW(h^rGgkaQ{ZaT3( z(n_dv9wg-+Grd&Mnx4u%WL#?ja4>;(LUarku}hT8IxOJs)_3XnP=wbi01W|D^fEv# zs;qf^gKoND_b{DSX3!bVNY?9$c)Gy~MQ8kRAxPFtKoi^^D3_;#K{CfGW8Fk05z_%n zRUc*(T(9J+F$s$cEGX2&M5;)6gsq?}mDaSu3?|TX0n&BBB&+)?hG=fon```>%QArt6Vx1bT zvRErUH{PMdiZ*B#G>N=soHQuC2}VGSGO~iDXsx(n+%)ThSdl)Wgwel!ECff z;{%j74*C%bxS~~+s0Hvk1NTD#aucg+t^v#B1T9UTG;6`Yi|7LM04g zjMsGf9vW*T!Sg5(5|#2m{Wy?;DY4h*^m)pus4vpVxoxJZl>*j}iZIqrb!>H!$z^I` zks2wh$T6tNCW-~pE>+VEX-g_UA(a)SEGKSAKmdA>Do}VX&c{AYxK&e~3 zZn7;-4ANF66jfCzveFq%1+WZ^u0q08d7@ScyRjf-$x`hC=l0uBB_mR?Ed&Hvq$Jov zgXdR$7Ivjw?RY|&MZ{J`DG@4Dd;Taz1=9gynHDMAfbOIu;F9D%!ykjbD^Q>E;v+gDdqoU=Zqq#fK>jsg*e zWLm5gRAIGh+{CIvZAvRC`CCx{vzL!moTQD#l!$3fn^|)&uvV^d?I~PM+ z#sVG-$E(gUstLydkBv=6gR`bsR!n(}VD^Wl`$okKSR$HO9LhyF zL=o9Wh8qHSn>#13jB~Wi*U@MYB)b-07gor_0GA*1Yo6kxyd+6cJ&4rwWQQJZH%#n-WSvmx|8)?KUO2n5VmtXXe4%DOlzAXK}UC69~x&Sso-a1?^-li-a+v z5@V{>8q80tVV^9?tAZX#2S6^cctFGqaVvQ81S(@duIZvahe#o^aNZzFk#bC8B3wP7 zHEeVWeTs9G1?qyoKMw;20-Dy9ivUgHguojR^ERb2FtdvxdANng)YWLNX$=L2HWR>v z1JSLSl5%`4IpDhUve{uTCfIV1Z>J_N82)I!88_Zks|w1#qtwJ+gSG$mz-%he6Ng8m+1wDS*dWWC-zbT;s$@ z8-f8%tpqB`^*SmWje(IR%1Nw%(;X0yQpT85WHZ6kAjyD@HIe`oiDZgVY6jDEw(D!T zNp-+6ldF7gLS!09A_3qJ9cyt(TyBs9^D!0%IK#mJP8!S=E|SU!Y8H*A*+u{XpkZ=_ z5_osi0q#mx*VY;QVH3*Bb0)nB$FuGr(~HF8x|u9{9JcWLg> z8c{_?WlpL!s8)n>c*72`y|N&VlW0-dPh{GR%BB`hDx_OFV>p-#R%un3G`1a)u?3ip zO-6x&(2k{gtH|c3{k+MRuhmD@a?`I+m=+rY@=R}D;KD5c0w2?QI!%#8 zEott;L2IZwn$*VGcy>tjHF^X*vC#n$0_%Kp-)+{q*vyb?l%naFGQgpdbU*0;OyiI} zUhB5iMa(A|5D5THC`UvP=?0qshlXuClMN1nf@Z@;l*&}O8nQ8Hg%;sy@N$%B+m4)CX_j?e>LNJiCp$^E zuUhL98ipJ+kaSLlDbm##oMKy0Q*5+OG#m}GxH6*H6Xa1gF^VG-#*Y=_eI;ThOeK@5 zlfoJXgCU~iQ^K}MVM~dLOlMk_cAF!-koBOjMm4h!tHl`7;P`%N8saNryd-w3hJvxt zmQwd7(=gE3)!TR+nJYvp3sJF)!9z$ZZJ@3~f}H64b)kRgQXmu1la?oJ21F+D2u(WB zqX2BV5iPfbW?8$TZ?XtTxWG^yOGIB9^MOf-BYl=h9h8#Da3o&A3kc(*CBeDH7Ed_{ zwp4GT**M_okg~FJt{w?7WPtH5FYk>wHE7!xOU4E6X-kx@6A@cd8mrHJy+%*PCr60F zSPnMkUSCvcR3uGM#?o!*!417@@Yz{8Dmc{MDOa_tGRs6X#>VqMp{98-C3$a$?arD z7$1Q*+sv#3^Zaa4Cm3sspz+3f(pf|{D2hr|u(qla=7?Eqix)vPYp7HwTe+ajY4A&} z1)$%EG%XeVyqYm)^@M|TpumjU1C=~`qEWB|z>t7$HG{%HjWNypb0lo;YUK7(&ZU~W z+?)bXD$JG^ZM96obO}v675H?H*HyVpAX-4H`J4tB0O?~CF#BP99BlC8k)S~!%QqrO zGfSDOaZlME%qGP$nQW%V=ing5_H;s8G^&LA2}|A&H+e#CwASnJoDPhwc9F9XC`%<_ zzNrR3G17>!U&J&5P(ZBHzLdo8fSip^dZ*g0YK-2LlgB#Ih-yTWl99>JIHxWezzc z5@D{?lNwWC);a6wftKQ6JodU1apq1mQ zq6O+@%>li;2f*S54FwiJ9UvVWq{pM04=4a>+^);BXhVb&A-XR~%OIcwk}BH{uJ4%9 zNDSPw=VVZ4#Rb-|vZObc4O4GX=%xn=Z))_rywIUSdt_Clh*oi@M>scNH67P3*>w`a zjVrufj`oj9&YBVrXJd7dZH2Uvs1l!P0Oqmp4P z&t=o;m<5#H`z*zc6cWEnmUqcbV?4=#ZiP&ij0ii4$b>5Usu<>(%mKASBr%#)QWe5` zy~==1c`orWs6NjbcC5924R? zf>OA-!r$_$2+`{YuzTO7n$@*OoDu@;KfI8tmlA02I1XrDtx5*lle@g_1P^4s{cxr{3)4pp;uN zluS{m5gG|SI;u_NV12^X>*$L5mOfpe^%OIt)i4#14vVZP*U#mfbl;;&RJ`7_v?po+ zq`o>NuVFZ4(|K70=ZaRnj#d zCL2Pz1>|Zou6AA*D&S?XLt-Mo3rs80hPrnB{wqkvkn^-ASg$;C}%*x zH^8fSO<#@YySXY5HfuXMwnsqrc+~3VoU(D0(z?Od9qQnnc|isr&t^ssIaNmuV-Q}q z`0YkW$O?St|O5=k_m`(xeXBwnCd63EV65(bt+mVhfbyBME z;3|P;?xxcg$k}fe?46M=T}0-rK1&Q5Xfu)SXS-a)Un?gQv^VRkGy`7sKr!lNSbI7_ zmw}>rP!a>;mDQQ)@uQYssL+)KZE1-`s-;$V;!WASus-gg8L1GNrw zGY6P-%~R}HU1&F=<}!sql?YMMOghnQNFN4XT~K>c#mdIcRLmEK7F^peMN(my2YXIZ zz-Q8?n66kNl(9i9op<1P#6TEfJ02H?RBBVS*_nD-(3r2rYJ82OoW2>$H#?#+piW}p za=8SwMzr0bFR;pt0~_}A0;Mi#O6ioIyf_KT`pu-)I-ff9E~~a&D$d=A3N*J|BY7po zS%nToR$(n<8wyuBNqZxOk#c0>irtW|g%1L4A*Gq-3N=CANu=Fg>BI-TLUg^Y^1{(9 z*Yg7r<4j`^iyd~T(#l|L=zY=&Ogb7QX@s3~RF%-fE1REdh!O{{K&M;u{Yf z^CthnUEiPbkau*Uec8p^FF)y1E5pA3?8*l=-x+og0K$Ij;{nm(%=`0)9{gng4gY}T zJ=xJ)&w2Qfo!hs+wO8i{>$F{YfDcp_{qMQh^S|b$9{s`x+_rPEXBOXb>L0JYU&1#& z(?Y4g{6V(*HOm2`AFf;Vz53VT%c<*1i$DIA-}Bk`Z@#d}uQ>NO7mYppC@y{QiZksg z`@T=E{NeeZ-u#tRU(9TO*0nouf#IP&CtbDn-hZ9?+}1}IeVll!h<<(dwxczx_LM%l zbK~8;zx=k{%Gi#&mA&Eq6F=Ow=kBlWsg6HO7*BiEd{RO6+nv8%clDC17Fy5Z&e@?U z2c?@GYcGrhmw)ifM$5nN&#U&laQQ!Xe{8($;dxO6Ri%;SsRMe3yuzhqM<-uUzn zp-XF*{P&-Y)@R3P|8=ho`P(5E?tR9^#eGO0^W#-R<+l89tKVFuJ^V%qeiHh(pU-=d zxx=z>&3DY7Pky9)lD2XETlmUdYp=fglDlsC!$)Vl;J*CbkIw(sOQ&r8e9!iMpF3sk zcY7||%i{N4bBgi5kDl=H-lzN#qy2FJ6B3i>LRzI%7}U^Tm?juPoi%vi6Sm=l5a4 zubz15AU?Nn=YHRQwf_FfK|6l_;e%hk7wuACby4ax>s@yTtE;cu_Ym<3D_>r8)Mx#F zZ=GPbUiiu5FMa>PN!!j}(>Ff<(&_IV`&ebeez$)ln4p$V{6*Kdm)^1d*@gc=N>tj^llW#-fe;-n18fbX|m3 z-#+T+ZyUwEp0KEvB;_9+^zPYLe6Zm1m{oI_AX%$iQnJ&R{_Pv%t*e8!HIHb@_dIvm z;np1n%Nfh^Cw=_%r(-J!;q6d&l=5FHU}6d-uYtrsa>U zn=iWT$MdAn52jx~|LIRpSID0(csjQbyYN59?)}zF*ulHp508dtb{1ss-}&n2`ycXq`T*j>3TKL%` z5^P!Gc=zEiuY2uu^6z`ErxRxuWnasG_+rhrvllJ-Bg|Z7*>SGC`0TdVIJ z>wa1B=9(9u{o7p|mff*=_1%eI&OPMt)!6Jd;mVBjv{RwGcP@t)JbmTki&xWt-}s=e z)DU=nao_B^@Q2!zKKAG=7t0-G*ccJuNhj)AT?`teh4S$<4&)$cwG z+wxbQ|Kgjyq08;XkJV3HyY0$*pNze~L{h|_^jkg8j@PdF ze%--;vA*|@ivk5t?XvBsEjdgBE&r$Ej?u(${L(Y;@XFlhpYYswwHxct-}%_aTdUXH z|M~&@I>)bxmO;&zU)c4>?!9}RCwVXpt$Fa?^x~ZlKDF-T$L`cTExcjT>bs%6cHB~Z z{F-fFihex7M?QA8%KPD)%EWjdd+zC=}baUJhQMk z`pf;?iKe?u!pk=q4>|I-^N!uE;5WRiUjO+qCtV%duqwa$)&0*o=*0ui(VXGqQ4k-@7KBQROp6%a^GI} z@!sRYZ~3LS+aLM*;Oj4pEj%n?$h@VTDSd#KQk-d{PNxdo`Eg%pViI7p5INb-*(OL=*9~xB;RJ&F8KSSSKoN- z1(;dIvf5{u`F8biJry2>-JDOFF%VYHZ5AXlf zm0M;jlKVwZervJ}|8mt0Z=8@h?1bg2Eg$UnpG|i>cGjco4if&D-hS|Rf7trlp2a6U zveS9gJ7+H3IR1eAj=pQ_=EqN5;yS(f;F+cmHO0SdxJvTv*Eb!!`?&q?zOSrYsG5zQ zI@G_EzU{rF^&0tY?;idf`uL(Jw=O;CnqQw#6uIrhdU{&8pPYhPh<)wiQNK2gfgjaxR{nYr@P&(7GP zdS>bB#PV*SA%~cMbHOl-T2lq z@Uq7OtCk;lB1ETFC7-?aTpo zd~xCR-`%wPyf5ysUvd6ZzZ&+Ob^dXuIex=`+xYMk|F?zUJ9qu-!F&EraqfR!amu;d zZcQKiZ1GmnkFT#d?KyQzxbhs^(ifLr{T_YEtMc3T&tCG%)qlR>rZRrSmHd7ll zo|8%Kx7UBtm;Fa@I!rHl;rzW;9ehdQ0QXhv$Eyct+-vy^Fy*r-|zq?@lhTAv1cDniL!HbuCy>{{28!vnD^t;mcANR@WX9wOnaK{a2 zJtX~9q?*5Z!E-NtYCPe?{E_>YKa$;j%11A3KIaGDtM~|v$#Xwz^{7ZGwM%|ynp1S zo&!IA?eFhhNs+aabEHAzaM+<&b_|48`&k>etZMn>kIWR zIQ#Yf2S(p$uc>eP)446z<6A#pZ2frM>&xD4zC=zBJ?DUT-@WC_Bd%KeSL=)QK|QtkLpb*H7J^gZ#kd+`O4NKqo^uSGDJof1KZ-3Um%AwNQf`E?}fJ>7X7#W=wAbu4s#zK{qC9- z)yD3Hr|x^}LYzB!ucezF{V{mi!|nx>@PTWn+mAm0woV>l-csK;dH$^zUVYmIEfN37 z$BwCQIggB7A1r?U;eCH`tiBn#XVzzL9azo_SuUCU+FYeP;d*X|;k?rgl9$EjY~A!k z;3Ch5=bgP=`Jj4}|Dfu!RXaH0(vs-M@jmYwUSIG*?1v{UD;vpet+jW>xVu(7_{@rj zPd2{wV(x<;RbI%vpM`O_`0 zW6^Q_&<$a%-u!HVK8Cq7r(baC+6&Ho{P{x{KC|H0uh%{M%3e=hU%Qle@S2l*M_qN^ zDfYzSj?z7W&ktR7|5?a8lkLA8l3H&TTte5w7}PuKkcdv9JnI?Z15pG}`E9BG&ngOioVkIB2= z*mCDTcP@JTT!qIvJ@b<{lCK$kDIQVV!e)Ii*dwlVcAAfkn#u&NJwf*zfodHL8I-WjOzT9^C*-u@!QheES z^G(w)581JCtLR^U-e>WNjnhPDd9J@`+v{H)S~36h;3>inE_r?CIpj^l-s{hZ9eCMN z`ispU|GMg}3-_t6eELN0t3x(jzU;|mx7?ulBzo5Ug^pvbrOn^)%t>3Le|_rQWB=*) zKiE9t=3lhGSg!a@``N1xDBt@&ckKmV-V$-0oDsNf4%N}zr#BzI?4HlBFfaPgW$zqs zd+t0-qVx2>7sifT9J}M3yH9@qzm40^ImS5q*D~XZwellhzw3&X)g`m@x9|VtPU8Ff zH%4Xqj<5ei;a%*$OAq?5J!${#?SH*+;(FDVkGOr;p&xy9U-A5J&mf*&e$1tz=QqV3 zxp&n%$C|g(Z={sir~1n;D}3X8N?rf!W7I9*9==qx%;2@H-s`B{_NAQZhb?#VUtj#& zN8+zGu2a6W|N5J15B%?*hnvdHhy0+t_egoAbP%##x#Y#SDC$eTsyq6wMYr(}9=XV9 z+r0Sn-Tamx-@n9eSbgZ{rrgqd|E2t5^V@%femwbzzdv{Qa?$@bF)ysS;?{%itbBW_ zV#ltpMyb#LZ?x#kTc14nv2BiXzq|j2bsIli^V%lIvv0h6>Wb@6Ir4|ax1aX;f8W04 zk3SzSd1%kh*ADw~d*qYguJf;(9KYqsJ-^(s?)Z0B{PqEH(>pi4dINU&$?^Zh-#cZ= zlcih!w{H_oU%JEi=9jkmB_l`hv&Y{4Y@g-3{(Jeg+dlj1hR@fzUfln{MY}gV4u8GR z#00;bKNeoRWu1_JjXt4#Z}s?#u37bRi2VrJbmU2IxR2enfqCv?N&O|ogPTex%%1Y7 z{`7y3{pb5f_jwyVM=F1I;o115QQJid%LUSV50jVwdE%A_UthW5n?FB(%Of{m^a!`7 z{L-nrj<^NA=DWpDF8Ytg`0k$f9e0|j<9|6g_t+olyEiCS3*Nan`QTv()X;s_9QH5~ zXnkn@X|I=GIQynko?fzZP3gSC&Z5H0U z?(RF+z9Kd!Wp{kFJ#qv&868C2<5T#qxaN}`Y~$G<*S`MJ1C`bK1D1dC+eb^EIkxyM z`uWd`?>zJPHSQCh!~b{GD?jdZgswDf-}T%P?>&6d0e|{!PjcnQ(dV$OA1>Z2SXjcs zgUb$lY4@5NZ~5r)zg_p*$^W?h)|HPwwpjkSaa=x!qVT|$r{hsHa|M6e{VT~fBV<}@-P4M zU;fv>`}f&D;{Tt+iRRxOPH6v>-2cFI#d+S{FNAG>&iAk1nZ(%(oKt|G|9V6d!cj z`n?=*^6~$kPkMW?@NmC>w7TGn0!Va@i~shAfrDRwGUp$y4t|EP&HWSqGWY)Z>o`Tt zVt0H0{$c!qslwzBOuPT>`v)eyz?1WTfJcje`%brCaIW&#quD44?B-wp>e_$)u{`_d z&)o74Yz4kK8$g0tY5Rv~N1wlrU`F7de><{i6a9AY-%e``jNS5*M0Wnqfz96^-kksL z^k(Yha^ab3&pEXpGuM4eoj}^ZMh$3fYk}cH+kDg*z%0L)Ciz-@J|5aYJSbHGDmIbj zCh!_eq$7_u_op3=Sb33xR^4*UWCK^SK4ixetwHfgjUB7}h@T8lEUU-*={6g*xQ;lg z9XtGm*}QGw$^7&b3?#I!TQozl*2sNOhW#nm7dgm%3`cDYoIhgeHLNq2bEAe^H?e)r z_QqrQwtpIvnIE@?o+>3TyF9j<-)UGwMBPW%aVrCwB|xM9w1CI){j4$DDim`-X;Qw5 z-k?JcmXY^uSskNaJhp3XY{41sIZOymydE;((zDU!epyRgePSU1$oeAUb0&OXzGW_y z{qiYn#z6o4TKCBe8lNQ!Lam4UAy0z%|I zt=Gi4b;9yv zuI!8G5g^+@9lRvnO96^!-{y~K6nS#Na?IUaT4Egk0_(%NgJAzwOCZnC5)Z}PuP8Q0^0%fQ)u)w_vg6Zo!QgNnc8)U3m1WOEZj6_ zwfq1ESeZOlL}aU_*B0L7F;LIvbRPqx|7d@#gUBDKbcD0ur7o_TP6{hfK}YMz2`~Nn zTxYx(Ou2WkPM=t?uOxrM6gqe^p-%*0^+nqWMrX?DvZrH8wb#Op8SZi!?vy@ZA-zT9 zus}}EstFmz{L)RYKEZw^{K#3;L03lq(ghy?aT)Ez)?p}r{N;J2J zNk>lH{1RmE-dG^qs9r z1`nTfH%Dr4ntH*oeaLNc{6o1fF}BEr)9}w!e_ORqHx3$)lAX3}*2_#sN4*|#yd{Q| zmdsr9H|i#SZ7Zhlb^6;#9gq&GhW>q8P3MpBRKSZ|3^XXl=uEz4Z;+4LbD5PQXt?jB z2OzFp2F+Gy^^7~;vCQdH?l#zVf@?F(#Zw|{O@mHNvPSN{(#}O`@T-?S{Jwi!?##s+ z=&5<7PSIs2+*f62@QXw)ngpO{FQiOEH#|?(127vGD(q!Y?+=7pRoF`Faab9=H#q6R z{_rqQ%X08|P=WD2_^NjW2zFvDQJdP0hw2wGs*@8C9_~yl<%R53?pL#=Wq=fd|30a$ zN|cm1K-0~2_ceWKvHa zx}&X8DnZIfl4Be6tM8<5xEC456n>$nNfmg+Px^~vrcE8`2M5}J6x-q zK#l3X8(f(Fiw?B#Xo}gcsnZ5#d3J4CKiLH{kHNAO1EodIlJn!m>~eXpfEPgwfXTk8-Y&v1)}wFsh@vZ7*x6`b9ZDH(dK~YpYo!xn+ZJPs)Rb9 z>bAM4gg|P1Qx6xqxiag%H7|n)3)g;gS4lh6;lQm>Y(AMhH~jI>XF;H79lwdk@u=+v z`GpQwcFQuLrUrM+S{v3Kp4n;%XebjB_tgZc(oi|h2c#GsoB6d@TJhir>9Bh|> zl0sn#)U939H@W+%6bOJF5XNvoIjt1RaQM?p@?I>w`#C!}Z3h@Y&TOZ<;BqVNrU!NE zNx>^_)*k{cm9M7ITK0w;5O{?iCsitOQ}o;RvfJxs2JPnMj<4!g3KC(h?1DAk@b}kT zR`H2hG`dH0G}^L6W`}@P%=RV+lYOd<5duyRq4n~DrhSt_w-@19LKUwqT6TTAO8sGY8(B)g6 zeEA1khoiM(a_8O(?YFBJwE#<)Q_r6suaaHq9%M`%Uv9#Ey94yB`16#<*Jfr#5g5)q_lZ{GW2>`wwcB1Thygwq((@D+<+5&PKlHc^zo0bscFyvXw7wIN+{;trqJeErlillJ zK}d1e2WmM{jJUD2EO=Ksl%36sXpTU8YqM%sD+%vczrc@bMZleRM*v%j*`UllK0aRc z0Spj?l`n<21jQ=UX+WHGxG!^aUG$mZ+NSjjmz&SFqK_Jt=8AizfS7AxGY9Cgtc2Vg zNyY`Y{==2NcH!m^ltsp^c$Ob_tz=cM&pGm&j3Bi}&&x>Y0&;9c9G?M0kUmf!WZK@u z4uDw!1#Q3$<}G@OZj69Lbw>H>+Uh%+@+7L@|+(( z$HW`AV0s3!FUqXu{)%IS-#*+tsPtmrmiBarYIVs9*TKi{@z=F=+SaIRgRct&^j&rynwI8fnXGT`fjfRT*2lH1xU)NLTz|XEO-HUj0Qt!I zkX4x1n~P5LS+5G`$-a>tmLTtX-y96IYzXSXT65tIo8*MA^hlY5u;*#2l-s!rxDL8= zK7MtRjRFeGhb+gvS@h2yEE3!s_nckCgEHQ21(lYMjtX~muy@f2oej3Xo8;ce>@@Eq z<2SXhcIHXiaM7_Q(N6AG2V%zKtJ^%Bve?T71cW5dmJ;+ox%RW z0{q5XAMZ~G+3NMbLNnbk0R99rgm2q>1NXKgbGdK)UcH|(k9>wecOiOST*&DMI`Zd$ zFj>4g2vqeh093lOn#yt|xtoAK|3=Tzq_E+>cNUQ90k=zE4lpWzWA|lc1scd1>y_@s zc$nSq-og1<$HNed0nEkA?5VSYO2xW6`jBX^yaf(QvzeDV@4&8wv_3u}jRh0i_v*xa zs{jM}Er`?_%j@HfA*@3T6g5ieCnoA+fNpc(6Ee%bpl{>W`@Hlf`Nk_dN8Ucjzm|=R zW;+&Bo$#0xW>Jx~kT#%OWeG?8j-Y5eSzvKl@@w;3apW)~q_3w>BRM?*^Awmhd)gV> zOE ze9-XccFus6(x?lheBJ>%@eDUuo@rF3(8~hw{qV_OxdYICIvHacKLG^Cd?{6!VZCv! z_h4{oN)r6s2g(w_X&G@uYUuNNqgoMbZCWyxoHiL)XyeVn^)ED8&U2Nf*165Q6^#%( zoeDDq1a@WGFiWeaeFXb9N#8EN47Kfx;v69CgCG1XT6>&Aru}b%MGDLK zrvo=ac~dOjwPR^O&sBE};bk-$RcKKe?5f^9c~?=M11eM?0Te(RTGIA_2rCeyJRTvo z4+^E#(|cD}vN!fq5~e8}K0$P;^}=K`l|Q&66y1Xb6r&*3vS5Q=0{uZ{QAn_ znzls2EARNtU_CX09EoO+%1u8#!FupY#?|;Gm*j?n%N}k7O3gkV#jEFV4{i5k~N}~rv9oZl7g~PW$=BPpdx`N_OG@sf5UZsBP_Ty=AGGm}-R1Vzkv04>U`_FTInoW!djN2`1KH>YAe!$NxfRSi z53&7|Qf5kY)rt89<$4<+-!LIM9h*)$=k#L6HkbYGxfX^&cVVTt(#TIshtVr4zv$4tTg>8F z2XW`jqLqZ71P3+&-;k$n0rDT-`xN%$jC%PGbhA@%E+_bM*&TU6%yCQ#lejOrlTYVb zeT&obvNfurYa>3Tfp~x0~U zB&zCHENIKK*xX;suvr@*_H{ZI`AZ+V6k=)S3jR`9Ij#FSj|jjG`5{BRmbLv<*NS(l z+SGL)q-?PdRT!^573Bw*Fk9)^v8N&*?2yg98${H6#fHHVAPQ1E=$n#_~!kKmOn5+ z;m+j;-Pr~grJ~;~A;`uk^~us~aDOrDYDBMZ5Kj0BUoP6eMRBp(+@}xr2lQ)4Q0${& zF4d3Wi>RC;`^GDy9@++;ZF2BA=Ju`JaY7MI2hph%{iwIgyLgDsmu3K6bC$3-nfNd) z1i|QbJTYOp&Jly1PBGCL86YEVk#LJqS{`GZ?2y&w18dvPt8&}d01l~90CNoF(-)5Z z>Ks>qfY9}eATM4HKHy^oG@Y&MQf%yfD+rL*v&>-QA}*b|{5qoc`HjOidxOW#-r48z zBS+tY$-P>6q^+uZJ;$|l7(;T z&Cvw_tfi4MvQ%hNoNZn$5ckKeUgL$xU4Y@aJ%K|v_h>sNKAnvnebLf3r(cp=6q(~k z5n6#|2(YBwnNNA93+ZrS?b256JRDa54X1+)x*IOP>r2n=B~y3WyJ?UUy0VAY$ns~~ z?fgZm<(bkMKxuQ4z{l39oF;{*=C2~P-wniZ{7ujMYNaO_J*8MSi=j1B))4DIF2xx?VzwLnoVTqTm# zT|vg6L$BXT!b^6?4!dNxQ#uTs5sukPK`vV^X!Y*NyPUFt*n1+F=Fc$?)6B| zQoY<|^75L=lH7nGa^Ge9c8U<_30beAC#gjys5#nM(>MF7#%1xxd9+K|4AOst zS4?8~cWbQZ>B=jc={C$B9?KptLYG-t&9!0A#+u$Ha(I;F$@v~>-t9{2HRzKSoTt%x z@@C6o;^+w?#&hU)KLaTg*Y8wYOzu|G$Mr5HHTGSlJu86*F2xS${Nsst({=`!(qDg4 zuqYuwQzAbw^No#%fy&t4JAS1up6Mq&gFrjXI*%@blB<>Ym{h8&b|zQF_;kRP`OF-? zQuZypHq5i_YC;((1hgpVo5}1nRwo-)KSb5Ky0B058V8UMv^a%lok!K$F5Z2=m6sOjw4N?%BtW%}vRADi*TmL|G&u>mH>!DDT4$pf zDRH&@NC>R*+^CH&l2T7jQ0@_J_zvJ944R+A%D+{$W4z65jZf++ng_^!j$wCVo@`S_ z+FC2)h5F9t*OzQRxu^}bKZ18w<5>tQ`R80~HaP@Z-bx0L`09M;(i?ZX7jC!sI#(l{ z3AOEsdg6aCe|BS6Ysr=f{%Xk~oV|dyA z37>OW)zaT+25k;^0J({_c@e1Rz|wj;Tqu`Qpf<77cTkGvW>dQ;xz`F5b{k>8&x4N_ zXMBRRt0eiVbZPhNekngD3)X4Q!n5lFde9FO@Qt|JdSaZ?;;h&8d_6Og+qs%YD%IbW z4QE7qx8EvOi>=z<^Sw$}&YkmK$EMYvxE)jz_X29M`#k0B`sf)dA4}i830#{GX?SO1 zIym7z^@J;WjNB&vSN*i$W{{Sn0P^JR# z)eL%PWmrt-tnqG|yTx(eh`IIa(tce-E_APx0zin z68l>*B_4H7i#J(y^mDs~qd7P%80J8JEMU+)3wRto{IFX}+Fp?U<2`Yi;Fx~vRVndb6;PGyao{@me%wm=_ipriD}AU5&zbRI z_0nv@vX{D58nIPl>`#?6?4G(2SzWapk8k}BkNi|rsYxH~6OQ-Oqf=#eHt;ajt;rY+5o-U8{oL`R9I=ll zGIzbF7n;9-i%dOn`~Fw^F$A~*&voaxC>6z9m-Vo1;hl7<@lle~c7nF&Gg-w|bwMW3 zrHK*L`^cY?V|&|!r5(ClTgOZr*)Bn@lULVR(8@1@qXvYa-Z3^1FNjj1`af~ zrMj@`7jfhvPqo{RKlZwf5Iz{U_|R&;&%ywApen;@d9%0#dthBm6#M2pzSkQ4Hea{m zd{!KW18;K!ubC=?Y|J|q#Pi`7bO!EbjVFhiOasCVe+TPjCQM#uv>rmw3vTz2BK>|o z{Rw_;!dy;oDs%*GcP$m3$`tPu0*#O{_Y?_RiG zK>t2Jwjk=~TQCW?&H=8M=M$|{-8Np>eAr#|jrVX5-|LN2DbOa5)%)8VAZHtlqh_B* zwLBlyw`x5A7ExANJjiRlLET7o1K}lWm={(Rc`Hr(*nU&YKchYHO6HP@2gkGet-a2f ztJz)KcUPD`Q0CQijjffs$RR^^73?=@oyL%n-`ge2_GrsMTJ2|g#8>Q}8Er$|5|Kgo z>ptn|S1IqTSzNmTr4{K;LS81Yw!jsnyx9h=M$UcA*YJL&N7ZTlJqELz?)zc9DTt6= za=!pb>C3y6o9aFz#LwA{{vi`?aq;#Dyz5TnnXuA#hZnYQ812OLqF&hA+v6PZ#C{vv zUEe|;_th)h1N$aOt8C+nRz&G))2+OizTG zf4(g#%B=165lX|^tJkP(-q9f1g-TcB3ww5t>+$R9OVO(WxD@Z+462;V{rDhsZw}|O z3t|(Fhg-uKTtFc^x>d!+(0xD3;Pdm$e~0J|QItinD@lw(_v>0|f6EI6u+bq*VCKDS zUc*KL<>VE-17v{XoD#ZerY=)t80fKBU!aDldfvDSO1H-CEe?kthBZ6A)Y>YgSNIma zqnU8HQ37=7B+MH)3SRzC3A)y%>mA{_gRNE>0wL;=JY2<1IgiZySyVBSBYGKkQ7z<3 zi{ny4og5GijY6l|4b``4+V)BteAne86sfF*Zj0w0Q=bXZacrlzKF#vmq}L2Uvu;IMM_AJ@bXGbXY}

(iJFLnN_JjZ}rj4KNjYX*ozlbzTuu)m;PMFp3~NeO=3dqcS;snuC0W7t%{TN4^@Lk zJrl(zMZ638wZ^5bZIosJ*<F0kk$sK?x>aX>q03db~*poF}({g z=P)^x{ifrNc9@jG1{mwqKrRd~zszHC19#X3Xjn&TuJ62+QYtMe&3|fx8%jeaIKv@` zlbC-TveN7}*k4GbDT|8L6+@0U^9ypNkT2j*@PBtuT%0t|{wI}g@IL>o)3Hw;T zz2WqT({4WFUyxHDr(jQ}wd_>}l6cd}5dR|SM$Ety4ly*S$)-{O8PQD^)#mBAS$#z~ znN1gPyvJUZ@dWr2z&mT6J7ZnYnpwA@m7~5qZA4sNVk+AMFxsJAyLBKI)(YerkwsGU zonU_V2KtjwIV*_jTQDuK;4ERv;kFXJo=I;1$fbz*4G?>zLbZ9ljB03O0{k(bm9tqb zdGRrD3G`ZZ_XPNE>0SeDLlN)tg;i|)Dmn$cWq6JCk82&b*aWJ@f5sy;*^h}h!ripc_% zX0eSej~L9Z1TPXVmi6KB5+c~M<&wRPYbU3IMZZt`!e3fv^=ahupT&#<-DDz6z?Y!n zxzoG~~c4|k6Duf~;tDHAF^QwLqeX8+=d8V)83BYuKBng<#5VKZ!P|iaIAm?4F>656`s1VbYMtX^Ml2eddbI{jW64mTJq4iRT|3u1 z*wDLDp^Y_J!Pi{;6VhUOTK9GKSY{7j3u`FnpYa5dOgjM({?wuOS{hL259gfyQDdT!TbSTB6XeYe8bB%k;UdYlq-NjE(09T z1#b+F9O2e$jpI%!0h8}K8;-L#JCq`jHX8FoX5Ukv+|F-?qWvL`I2J7;unVY;R?pt@ zyes64h`dsU|A=~Vq~(;|_Y|E$d~-)V78F0L7bf;=YjMf)&9(ByR~2tJzwry$y6bVa ze!_(_UK{HQ#8h{e`sG?F8hc9z?klI*?cRc9$UeQbrgmP73_JqlxU?L%KRd#3vI3l) z3cV?&F_+_4*m{xQsyho20MT=>ua+VFJQHbIYUwfoko*j|jaFwB|JU8le~s>r$<&E{ zb(>3Brym{GxyB!SmsM}a`EDQLnzN~-lk`E+t=f{beb1i$pvQ)1Mg=adTtI3+w6B%g zCuu614qFFE%TaaNUw;NikY|^wnBKQb_ruZq$rJ9Rx;>G8F5)&h1zZ}WU>EGM4*bLr zVwZ+%Bgp2jqCo9dn)4A&z-4wWN(sS|%h=gIt7J{sjijr(*8!NZ0W1hC)#gy&(bvuT zg02L#v%6r{6r4ddRH(k+s4{0VDcWkhX}S3;7b{rtirHn%7wQSN?5+yle7Zow5_O!7 zcfeznD$Zuel

?OAWE!@`^yMI39^JfbHWT&<6;~u4soT0(MRAJvkX)_7bYVZZKBPvgeaSm6>Ag)!f2}G=xUIDbfS_yjSa!m9!F2iDpV>=^ zx)5M{3m|`pZ8K2{v@IPzzqSH5?Yid=-M(#`{f9&q1R)0Wsp`B}o~ZD6A{No_4cnDY zNJ&siRMvbv%aqUWW{ts^N+2KPdu|JsB$b+*YenJ1m&wvn#*b^2#|4v_8Kfo|GQ0df3{5nbv)u`rLrjaX{DGqwq2D_ihByLNMvQfP)R(#sO$; z0f4`U3a-8}5OY--RQaR_;&4k|OBVw<%s$;13gYE^uql+PZdR##5grG4H2gMB%dAyy zO(4{GON9-58+MMPyhbQt6{UKtJmub48YamtL zZ3}`r_!0C@6foOySE)v}<-W$|C+sN)$aDO3#%a0q^7VfQ>-rAC@$aDp&U67XKT8}@ z_yP)|IBr6Z$!+VAdYO8So$Cpvei&c)v}kzw49RyU4u8FJetDXs!|wbR(v#8`2Ftap zUdjV&rJ4zQ5^3EqacO3!1=6PPdnkAoS{>_Sd|;Zj^WPmd!M33QW}!|v!s2)7{>oM# z5Z;m|jdw!(S=i zzNx3zBG+r4G!pa^qIP94^u?M~t;`3Vp1FIO>|UILbwM;4EOzw@EA5}noFft0ja?5j zw3I)&SGbJS;5XBNEKmtUR=sNWF0AgCt+4rY>$++1i}@NK+J43Jl*UaN__t&4SQGBA z1RI)QJ^~-z+O%lr%7yuPX!YF`Oy(BVV&X%-x$bJcSAV0tFeR!rQo$tSXUQgrX}0Zk z9;PxCt@&Y;x8h1?|5A@wbBjG+EmR#?HV`v02lL(i(-{BeciDFTYt^c@_qyHQrH2*Gfld`2XdH9Y{kiYv_~e}9w?Mmf-)u)m z=j`m}GQL_<>!tU37PB6GI1u~|#*u0vjYn*;a$)a<`DMO4I0c~2^-m~sP1;oe9ahX# zEZ~bNgJO;Ia(1|NcYRQQ7`|&=Z;fSE^=w29ME0kxnoYO$qGheSqi4&Z6rfOYL09rk zap3iF=T(jkDiBkatY)dn`nLNDKEY#W@-5(Q0O_k#FvujG5cpRYqNy$oyT_#_UxWy@EnC=d>I9gTm`ea#OFw&suzX>Thua={+ zIX#g6aEzHmOb{P8o>dRbSkX%oD<9m%AlnJbPfXKAa*jlUh(*stI9A@|4 z;Z*Qstu`Y%xf7b}Rb^|$%^Y~zxajSJr!|2iVHvSUA^$2*u-e$ZAAZrh_Bd2WA~2Oe z!z+o7H@U*miG4t5^&eKx=3=)@7Sutm<()LfVww|a=3YHvIWWp(sjD7XlR;lMv2y}8q}z0|e!QstdNeJ1-vH2C8S&*B=+Mm0 z?fa>tx@LTy&)a6A@py14pBT9Z#DH;m143+&H|*w4hLfZSw~;R(6p*`O3LIG3zTa@+ z`cqqC`QM+_&R~08@)9`fDG~i@&Tn-C^)&I4Q>~Ozr3mv1+q+*b51MW6+Ch$MUMWzDAQ>X>rYki~838T`P+zc#-7RTjG~DGD_)10&;Myd<`t90CL`2 zzE*1rmKV|Lw3WR%!>FORI{#T7n_>Y7#X`^OZt(R~t}t}cx`8_h7=mz}riolX@5Zj$ zH)e^~2G5XHENER-zJo%}cN&R9`I!tto~yTX4F+OE0-SeZ6}4yCaTTv*BKtA2<2`yO z0|7F-tkRi0N!#N3ubQWn7=6_XNZ*2#E<3zDqM>jO9F1x`lrv_g)H)`PSO`KXo_dpv z-QID>KrnhDhjA{_jRIFJUh-jnqG9~h*PV)iY)E-zrXyd1a_5>hHiU`^luse5alJt^QsOa88J>bCzc8Es=xByHO8SB)xn3W4O!<%@#apV>;^BTXj$} zR;9ExaSy*LqR*U3gUQbOrFc$}^%@(Vb0dmbUo?Kv-IhJi?^|QshIaP_`)<7I2fepyO+_xck6!TM;6hl3^vYMsJ&7rBr@>K0ydD?((p_36 zWrdR~SF%aqV4-7bgADG%yHXRCdmU;TcofwyS%&gk9s;*MeQj^pjbXpqpau;#)tl$e zdT!dVv0|Y>8WY-Lusrami)$nHe(H^Vz23<7eFILaP7O}sA@!X&0jgbT^b>t8_~p%h{d)|+sX}^9wv9}iP<{~-jJmTam0o%eP7d+O^4YU^(P`_h*x4>C*qeZX*AYhzlMYiRGd`)XGp&n=;kDWf-hJ_N0Y zh9L3%Qa;Lq9gvEZ3kK#n$LA8Un6{hblpaULUTS&xlpjQpTr3f5eZT~E>p9<*BV@Z| zWK05#)0bsM1rpd}?#pQEQxjQUYR%zWR<67I1wUVDct^e}bT`jmxJS1wX$A5^uOOSE z9dFUx7l}oNt`BRwlQ&!5rSfw2xG*hE+And*R2s1!gbPr~X^)$C(7PD>a`BpQUjyiu z8c`rK3)4nH{#eqXO>r+HM$f8TZ>v=L+`*{x4pO8qV0rp&@AiK4dD1i1mbSI6&K34l z;Y`SC_356*oo$~QUF-ZK3${ULJ`+x_3b}>)j0~c>y+>Uoin9zQHjTY@w+b%~wKefbxEA*!bi--)wtV*>G~* z-f?LipzvBc#INEGjt+5=WOwwFnc5ieN+BRw@{KFecUQP4YXL+Q7yOQ`F$#*n-yVB} ziS@QqXiWO>jY8=!F*}nxa6ADWW&8yXhuw1#Xpqgi`FU`?Td^+Xhx+kDD>MJsl*RKe zU+sLPk?M%|6An}!zoyPJnDbzC`F7nQSFjcwHJRR2#-U#8d~s6dPLMEC?|{)(*q`Q) zvyElmZw<8lzqxw**ysI!uPaevbWzb5BteO1H(k4KU2nGTuHCwI-PYZ8UAt~=w{Gpa z-t4Ap*KGlUIYFbra1#VVPQ)OA1dejx5N_neLjvAJ4@i*6Z3KlFG>~&RG29%H1BmY* z@ekwouj`L*uFv(ku1~x7`}KN09}kx^z#LOsC8h4Bxz`(?N2e~fCBOhbf{-+fU{)GV*?#TgIzs?4=+>&Trj|z@5N_4(ecdovUgy5PqaU7vs2}^^4ojAji3$~b zAEgKEBH1rhaC+YV&!At$EFLyOyTWKKsp1o`~IVT)PC6%l~f;bk+cJH$V zGvOA1YwKEaKIw*bWn|YpZSVcZGiK&SCEY&^WxH1guTJ3&GEbb@q9TyDp(HTKwg(a` zE#cW&xtYQSr>g7fTeMs4b|=MIJbUR5O9-d)P!XJ(=A{PKiz_d?)bc?@uzSPrIk!7)XC6UAWnu3YAakOdfx*1_Jo+{oF+xn|>!MwAB9lrDm#K z!+(kr8aOp*R5_sEY&*MJ^SATh%dU^`-PmV)#;NBJ&~_gl_c`*CPHIbTNzbt!_`>Hl zx!JWj)${rX6Oh=u8Sp_+KtKar7@MVuL{p&Vv5kg3cdS!Qna7_d5IMp7PGtwA$;t{G zi_?b2#? z+H>YS0@98TFeJ{48zi)#>+uNgjsxtvktb*y7eRZogLCXxT*l6B%%U#PI1;0evDI2z z3nppZ%~Y)AprlyRmLa{PJWDwJFenFGYkTwW^TKN0U4SBd-l2!jcFt7dV+sHk^7~<) zx=VdoNn!9s$^diEPRRXrGYNx?)}s)dfUT^Mm_5zNIUd#&2I_^fG08&$dORNjo8oSv zE!E<_LIMv&zE%6?ExzkMOwR#LM0WyLuDPvQEFzM9%WMaYir-RKkIz|aun-7vmER2L z=xTcJxjo^CMJg&JU4|28(BSsjap~xQDRub)SN-F1Q2?e#v|v5yd=YB(yXeu#)T{L% z(C;tua6c%7$iL5X32CNwvM-j^W#N;${raw15k>2wW8-l)a-X@=#l4X_TOJfTCDnos zF&LzH;a8-_Pcvg3$2%mDu(>vA1p2$M9ccJ@<_)q}0pEN)XTY^Kv-LRDCf4`xoGr0Sak0tYfW8xBo7}xpEbi8Gy>eER=70(7uJRrY z(D5U;YBF3{v#;z5+a6ZoE#nAkdxnIY{c^1BZ+!DjoMXYeuLiD7&fY-CfcA-a(k<(i zO66;+x2;;kAGQ zyio{9KET(ll&Ghpl^drc*JJ|QpN{DW@nzdHQS1;bSt9{AxGHi2;1PP9@mA~0f$2TA z(}%%Ua39tuG219p0O>(wiMq(R^C?yUdi37&`(%(l0-dv4bvN~ocx^@>H`Bc|OuKq( zuK=xB9pW;j8F~3Mj0)LutIUXgqt}Gv9D2Dn$>`)c*kkar&%NpqrM^?>)Uf-B7qJ?DyjuA9}8enRRIBql(3J0r5iPVCJcXIi(K+zsNWn)g~b0g)?pZ;rZcy1Px6 zrv?&;)DL;lzl@el#6aq^5q5fo=JO~#0MDeg_9&HJWk*nEQ>}Ns7UxpbPVRg!qDaOO zxy@dbBV=i8FH4_itCN3z@7&9dY+^^Uf4z1;Uynuvdq(O_wtR%UUw|4Lcts-csEoK9 ze@nZ?%gW7cU_jA@;Tf*fzfOSx(u}1@*I=as5Jce5!J~z#myc*5>WT^G|(hsP*N@Ec1WmiHgCBc5C|0GH*WN)MR1m`^~dvbYE| z{!x09b!q|f&cgDh6yABzR%!v`B6F94_%K6rBc{G`*u<{T5dK6Oq6@Sl&;7M|xX&rc z-IStTG?9vMdI>jkP?dO zp#pqQS>`zNS5Or?nSw_p$BLRl=2x<&mpsj}*Tg*y(K`6{`XsC-=f%!g*~~Kb_3=JW z^@5BBWw?%!4@LjB5D_}cr z{o+g0dL&ZIla(dP1BldjlnG+eZ>zo^?;733ur+urGEKt=UJ{^l&tAw8e9)%lJS{Y@ zohFXTzK+v_A>|#Rq+~s#g>@Y1kiA@RH?-disL!g)W#=w*qd9B8kLiWv^KM3dYjy>6 z*NJ{(v$?F>L%+bJZ>u_n>O5AALuybsf7B0*gnLJ6@yw_z^1H)^At`1L?k#D^nabP>{bbLmMjkIiuQvFpO=GPUl`ui7DkOdZZ3flv6p6M zjNB!pqyo`&p}F}Erj~yKv0$CqNa4JkA4|jp^i40^r@f*_`cmMbBXwLYxzSWOowg8n z1NWMp*o}pp);DzpTW9LQu|n>#1#kL`id?hT#`A<4lZ#Vwnqv*=gxjTyea^80S_%j= z$zG0kx3qUbd3e1oyw@1e#kEE5hTkxmIT&9ugAw0#{+5p2d#Md|?Pkhi*9-kTJe=vE zI^=^Vv%e~0f#J^4bF`~pvu_ks;Bg@7L<5SvG+$tJ>Vj?c-qc#h;+f5uExal$<+xNM zo*NoOLC#FExdqa3SAGch|uwM@bvlAol_^v}0!aMI|s_uV}++lno7+G8FPW1BD(hz%jY*d5b$ttdOs^78=t7 zyEpH9vblK;%x)nSx0}l|A45JV7Nw4H zX4W0DA{QmRn~gK_=~kbwj)Tjifl`ecfJ6~;Lh`LEdny*ZpmU#Tc;oW4u@7HfL>dxv zLmDRvI<+&ag$tz2YK`LU+5EJneRj8eKQhB`8n)N=ZUmG0?v%w4;%?r(mbV_{aj4U&~rU@wTfOv)rdZ-tKkh3HE@~=hNMM0ZUFCWa>Q(l0o)CpROhc z&sw}V_JC}@Hr~H80u;hL4R&o9VN#Y~xn~>iUB|J&+o4X5c%nbNt@pVX9tktXuM~q; z&yX`|lk)OeWC7j8&7$5SYNgACTS6yzW!l*aAM2B{A1x6-0B)^ywZUDJ#&i`II-8DR zrxMuM1?>m4-QE^p2DloH*O`h8)$1p#gdX)xBW|#279`y6)6@Q1S~pRmyYwcNu8R;p zJ1-q?@BT(E1EuX~R=#CR`C@0N$Xa176Mi1V@y?zhWkA4umR`2E_VEr{yAxr$&4!n! zJhH}eFMiX~g0>&dt<5whn0(CkA20D&8d6$LLQWGW>ol0K2P43 z2YYd2gqC!I50`eZ=%p$di`~^Ss>wwa2tj*nP@L^dtXLWsKH_|^XNc#kbl6P6&?DY8 zCc}rOr9%hgBKDaW)6NU;6`q=b=D6Ww6e8*M0(KPBrU$I)%A^V4C`PRFX=+#N8*G%{ASF${IABc8WyJP+Qt2+l=Z_uRSIC3 z$qaP4#KR0DqLAbTy?YpYL1bB~d0oLJ);U5Ep0!(s6&LywI?8YjG!jeXL;zi4aJd!F zhgA&(kw$m%)UIzq>9FpN>i2Hc7`LY=Q|2T4#i?#Io4@b#V>cd$IC`zsige=FjjH|> zGrN`0c|xDLJ`WWW5*#eEYXYC;{CvVeAjd)_))A23ONqB%)o=0>$FGoCi z+4nkALo!lnF1%7ZH-6RSZUa;(d*b&s9n zN8ZcVAROZwwd>NQ$1tVZfauc%XvH~SrH=(sxYydl=B{jKVkG-by>)F-jKzY@Zn|ND zmbUvep-SMmwK1Mmci~x0C~pNlkgs4>Yi*z+P#k~J@+;h@*TGJcdxVw6H}PlydQzRk z^rbas1OG;j)H_+P+Ka8hXjBe-HhnD++m4y8&XQN_IpsQkr_;}bxh zKs3aRT0t3FQ^jxC@geeF0H1op9mogFi=7NZ7Xesx}34NMg-Bwb#{hceO%)^!lj!!AgrqW zoeKojs02m z^$--gpT>c^gb{a~*H(0G6^5A!&F8!#jJby)yWO|>6(-->V4>FKQ5tjl`>NeJmI-F* zl9sHPz_-ymNLr(|UxF-~bAicbB zDooDpd#iI;fV{_-2jiuX7T49{3jCZCE8IqP>Q=;-9kFk8zFAdOcb0x{i5IX7cyC;j0PsdsYg8*jf%2K1Qj@|{Od*DYFW7f7y)AYd3JY6sQDYzB(B zA&K>O+9lBARR)3SRvnCNHne)Ti1?WlQV0SMqxo))Og@Cec|>;H+a?YhXYSQJJB{`n zWY5fr)wnm4Nmx5yA!Mp)U5{hxXAay(hwe=PjEz;h*Uvtb#_Lo=#83t|gY^I#&O2TA z)CYMPt}@5g(^p(+Y~32#ct4Sq!W9A4qP(98$rErd8M?n*J|aL)W|KQw232%3TVz+& z7$4iyiZ{3v#?@Rrw%(uIrgJceNE@};Vf)q+>fQ?MgW^VGF>K5f2fH%O_VTeTy()GO z%wSFA$dcZxh9(Kp#u~djbB%L#e7rlK_Wjm`l6q7x_adi0-kUDG-1l{Ze0`L5`;T-i zrlxxb%tS#xVAMLl7==ojF{H-pNp(UnFJysM>U1BT1P@kD<6}kAs0|oeq3y^Rj6$}W z@1F-fp+`NXSEIj1#xDcF_7tK@H1qrROCl^V^*LpF;l+|81H-s&@oDvwb|i2>Aq{4;#qWgIcL0Mi7KIsA-3(9N{B84p!m{+Syy)lu01Rl_per^1IowYn+x_sh_y!Lds$0&`c~K5AUSQa zIsY|#w=R0t8ecivxCy06yEh!EGIGf@gnfh4@_Y6AXg<>j}K_D#6r#4 zrBcH8=%hznlcZak_~{4#^rm&9|AY0{@Np4AhNCwls==qgpqadMC5yN1#lt{&w%m<~ zfgraZ>|)k_BkoOFjiOSe3^{fmfDPgegea3X?}G&`);pza+HRPkVpdL%!Mi*PfJ#`- zz$P3q+S_zCbN2E;NN}!@j}F{zPTXpdB2%$v+5mJ69j3K$;qe*_KHEhQ zmHUeaw3eyvVktcBn8C$hi{6=SQLuP{n`_yOq-gB6EgX8YUX~+{9_p%FSt5GJmx4GZ zVt!A!BetzBBKVEa7;hF|s2a+|doP zKkJVNnVSWW^f}}htPGHt!djptC-G|5?=Rnf@{W-Rm%c7?)KVt z2OL~n16H@yKAiBEeDQJrWXk1Ye$ZriF)SKb^sIwFAvIggzTAXeO z+UGDJ7-_$>TF}v#H7`;MRa75i^GXtQ@=j%Yz2=CS7pCph!ndG7JwhsnQ{zO~a%=Iy zGdJ*$0~>iikC(>MdNU=df)P+{uyIQAbvU^$8w?0$(!G{b?!LUaH_vU|HgUL| zl_K~{4E1;ZEjxwteg~Qh!_&k4oUhySf6*|=L_|cYuxB-!6E<1< z3+jIuvnN2J1a1)k@?8$@@yqFY66NlV&nm2d-69 z`3R$PQ7bpK>eyB0b4rt4=c~nHLKS;neg<9T6Xxz(%IG|Oh0-iXDU7X(6|Pj->_#%ecL`bbzb%s=(E;yuIhI-F18- z9;D-^MBarn`}bpi+g`E3h*9e&ra}rY?o}_kpQUpgsS^Njx=!wPfU(CLyc>_<&lIWd z!UHjk!ErZtOJ4boP$||YeTq59c9>)ei83eav!eSXA-o_C4xO_#{Fb6FpU#1;!rrX- zjbxWW`yJp>`vOen;Jf#-n2TphDzw51{2V$|jf3Q8+2#A)&v-CC??uqy$gX!%xC&)B z9M(tCq}RzaF`q^d2TfnwPM6+?x|eRYBzmpTJ~T&KcI^qU7Rgv4NMD~*uQu2BZW2IC znFV30LOIa_#ZYV0WOC#Rd=S4JN=X2!uXb%7cYu0dxbmtuwC0_q85WZQ{!!6lLFzq= zw%}kOw4JzBxlt(0GbRrn6w08X02Jx~P~OJWnR$ZF0{}@|oKpV-G7491x<0!gG427b z@WOK2xO1+NFZ%q9zs;I}a5*U1Z~)1v%jZn?T;AQIX*q5-?OBt2xnA7tz{jfGYHFX5 zJ#$Xoyf-Mixwg-~ZQ;Ugfkgco)N`89tgb9TQf9Vx{j`4t2pbE#{;4E zo<+O2x}sjWsEiB3v6XmKb#)b=UO zKUzo!^ive*l>G?iT?Iaj2(LAASAbCf)xG@VDhTN8Fsue@u@FCQlWiODpTKKC(Q_(j zMmUW15r({1EbU!I6 zNA2RV*zF?fR4uyg=$?8ycWfWQ!4`bC(_|WyCi}_<$s}uHdlt{7qAUO^;=&x=9lcE* z>CSBiBvgBCS131&$G$fpEVb@&OsBd||Dvf)lc&1LP z$)s`W!P2bIZ=a&{-sc$)1VhRXZk4NJqut>x(ETGg^KDJIlito6O^4(6iTQ5I}cjh^yF=-i?z(UZ`^Q3KzXYh9OhKlMY*M!+M zu%5$;*Ugi;1@0Tuw_qfUZ_y(|ts*_kwv8XC-J>;9QdXtU#u{XHi_wTut)dsl)*Q$KfRt%gqad*?1X7{Xy}sBtdfLq_y|i*z>6sML&kkxF zS88;+-%$pWF=)4o!Qr(%TJx*6c%_-*lhmtPZWP0y0MeWcYwuLgTOX;}?M4h}F%j&9 z&0qW)yQnWHFiuN4%N@qLX-K!EOgn8(C1JTHFFXDr9vfHW0XNdiX4iy^VJN{RQD%^i z;10Xk-6+}2`n6vzSEKU@ELP|D-A-Z3tSU~>bwIU-J>1D~l-TY*oOSf6aPcPV#0poC z2k81Rl91WMHLUurv)h};`(x-**fzGQ2fD5>`lk+97CAP1apr=REcR;}%}yksAva3# z>3d_)g{u+xw2Rhe**B}!CC!iEeQ2PDXm#d!`N(0&x7V5Ne~=4OIgSSDFyXn{^zB>W zHpCi!)iCJ#x*BD8Fnl^=v!a-k0Zo3<@_*pO+2}(*%vBE|mYuOMyQ5c_YLk^`0Yo~g zt22hS$uWA$PUjs^elH)ijZ@l#!%qt&Uov>5a$$Q95@19SxLsr)i{{J1iJ0!MzL$&0 zXyDS*mL|CPl(6;C>*d$inb}rxVrX@r5gv}D^+%OQ=5pPbma<7VGc>Y%$(G?<{^iHm zkSj{H=lIk(?8gNFlppJPvjFzM06~xwpF+aB)-a?!1LoGgaa7e!NQs5>yS=^-fzm?D1cs}f zq3T>whuJN*?U;CdWS!OaW1f%Jmk=tLK_UC8V$0U{44$6icBm)}KYN2wYCUKwAP)H+ z7}~kEa-`n6l&SNg7@Q9p4)V1n{vmt;gk-b@; z^0H)505pO3#!5~=iBS3a=La(@=7aw9pn`nc+pF($3j}_T^Zg9GtJ~Jl!}R>68{B(~ z?w2tGQk$eru-6t>=6E)`;pf+B;o5Y#zx(qy=^XsL|5|q1=K3_3%=@P8NM*Pc?z2-6 zK@S(zP<(xq;tZ420?JT+PzaxEo0xdWV+;uFPf(1_##UIQ0qL1)rU4It^1{FYOI#*7 z4fdy=;4hQptxH{K+aG6A?<&j^YNz=w0Y94O&K&^U2CbAkb7*~IMxs7%gWn;*eJmQ- zc=-pcg3<*UCaj_Yc;1$nO-Ah5gI2dXGHMuJhA+TrQUc>k*wrlTlG{R&XX;M-0;Yt* zT0h|>Z?Nx-#aFq1s-?!~);Jgia(#F00MJ32Qhri=rszKXeEH$BZcQ`J`QeFtEnI+z zGwvyu7t3-LB-gy?J-bkdHrpb;)S3*7JgZ+Hx(qvOWnGb@^H*c=QQ*12<8|`!^JmPj zcLUJ;$P95QnVi0Zyi|B^cboa+7V~E5omUjC%RWWd_zv!pSrh3zi{V)lIx0Zp%-uqjwq;z?;$`8pzpS_)Y zeC5Jt#E-kmwAd8)7=_2_Rq;BtWqrM!l~?Dgg=7Jy*2&5GVBNlRy>(pxT*mtV%Jjjr zC)6NuZvtpBC&T&bR|dDV`2gn1`P=COVvpm-&PdH&I2iSx34&-aK<1NU_;wPM?s=fA zIRMI$^Q~|BHl*^I;eJHTdZ1v4Q@iqhXTLwLpRYv1ZnF?hu32tiL~hqa0dGaBP{n>v zwr)A1QzxDdRWg>f&aiu&IkWs2Dq+p(sxi%MYubM8$@~P@+7zr(h$h#sR5@3kI7feF zn_!9hIACc*jBFhh$MlZpo!fq%=huedaI|(mBcjs2`8LbOeWCJf*08e{~8Nk3i01Ic@!9+Rq2_vV%KuvN;7I?HU6>gi*{ix!yq zw5qjO+pLdIuS8}aPU8n7@xfxlL5*=CW=VKbWzOY6rg|1~@^$Cs#>~|QxDH~{3%z7n z$ve3T=rk3G=`v8Zz%VlY3enUO1hSfL9*ykjX{&sge7MnLc07YK5L3DG4kg2D-Ao;Jm~6b_Zq>Fk(F3ykn!GF2WY_<& zCwIV3cC@t2(Qi{`A;0Rs8E$bs!P*Kjk;r*3)jc-nWL>D?n=xwmp^7Q8+0u z*GzW@3yu$0+DGF4&K-!?Hl^|HfB?1>*bi-*&bNZjP}rpxu(78Dvv<3lgpTkTtX=SHjP)YpipjM<+}F5}G-@%?04 zXs+Sw4Z|E-)%WR2jzJe(6bSusWD2#O>r?@7mC+awL-xjb3C$J~cDDyR{g4SOS+OG^uB>GTWxUn_!`Air^Im0EJ$t52DQeqleR*Vn+QnJW6?T>h=J$vuIn`Vv zCMRV_)Cc@BXq3L!NN4DD+o4S0h=cq4OHHWGky_S}yh*h_&qO-@7VD3Fe_+R58VBFc z9oE0*be76YjMDvxZY%3{61dM3)p+_@a8Du-vM>^TAkAO=z*bc!xq3Do9JMJu|DUf^t(6fL4&>-rAFJE-)YLoPK zAgYjQkJkESiTTGL(9_lG*VZ*KG13TI$@81$*zaYv!{Nl@I4b~CX?1c7Ncs+lYF@-&OzjCq`&)g0L?K9tWMpalyqu{5%iep5l)RT#Y1 zJ&F?}gpr5)1y*3Z-d!E*(>chLn!YAUW;)|uc(yTLrre;y<(iqt-EQS>*gchfx-`z2 z+f#w{X~3TWXDJKB$CJy%4v3Asdm>xa;%n#kC28!u7XLK)^baL9007I zTBe8u4qTkxry{A-H2D9+B;?SGz$T=-c+dF(7z&_?e$#W`7?c>Pv>FPnn&K^V5hzF{ z(Cu$x6PKPCnzuX}sY>qyCH`JSpNv57Yb-OT!LX5|il4^o=_d49FCkW|W zXC>4cIWxBaefQ%NIbY$xR{=tN&;3ps7|p?RjTl)nlIq8Y`_zGs6SNOAg=NtQMUX5% z>*U1!dScXW(D;o*b&UQFXF$^W($sEur(Ad)wp@d~sgDVXTL%_iMY{%HxC=L}JFS){ zU^kjw8yVI=Ji6oK(TEmi7vPZwuf*N7$LA}Elz-{VmYb1AeF;9RSDVY`IGJUyU}j*% zJG*q+iBsCEmN8JeKRA%rihyjQmJurv$p`%fkP{Ho)}l#WO9rwicV=$+bd{%+2$1K< z8G0nkDUS}CaP@nz!b|0*7L*#7R~{#3&wKck4+~`F!4$bnzAt9mwOtwi#$Ls9x~E%} z-!_8?<}U!}zqjbAG38x%@53{8Eoa#iAWl6V+56_nR98e{$`E27wCaM}HYB>!36hcF z_vRU+-hNAzE_3wU(PE!XJgSB5*7tR}@lKWTe6g*a9n4WQ|tEtFTq*{l_WMjW9T$g2~mGehXkA zP##50RvA?>JYtLJYOFknhi)#xwt71*vg#;R0ao@|+k5Agm+9_VeJS%}yH189i>$=`=e`wyT^`0&@f(FWT9-zdgKeJAvi zt_N0vyW@ z^ipp_CtEU#Z``a1wi}>zav!o)?Dg%ohXgs?$l;Y)aG9ykJ}Lv@hQ#;NE(((xd3(eF zx41kuO#u3-vMdVj>LV7|2co!9B|x%3IZl8u_*Kwb6+x_>;J#$mWagA*&{y5a4CuH2 zBv`Fi#gHX42ewhM2xOXrRG_RwOZ+ccmj%X?9uW|TXyYDLSjdW3Io*P1*p z*YuH^{E*v7R^Cd+D9dinpNgXnG{U-7H&}1WP7cjdWC>2G+D8h9i#maNqp3TEbLCEE zJ;4Xr=DhJ51*L%)PrIFAJdw#JbnKwQcPEKZBNeXfZfxNN$pnwtqF6%Oj2FYpSpdL~AKvE(X`E?Rm0+?G*{SdhAhW9c?8w z5t|4IU4@CA^cqJs=n**9L7~_-sV4n$izYL>b^>M;SI9Q6i!iO4<3mXY&HCBH3r=K| zr6$<=cCgl#2^3y;eb3zn%uD}%neu+`iakL(-dUNefccjO2!-?v&X5Yx%g<=PISguR zaJnJTXwE8OWi*%dVXkx^55X7!GGcx7>ME_&Paq6Mj^ENFZ(N<>%Bu0Lr3@O3QDtGz zraYdB6MnxNTGL$)1Zs|r`vl|y>qGv~?Uki|C0##{Uu2l?KL7#?u!Vyi_*-c@rxK&I zq`Bo2u?3v1gToLhR~&3)2zrK`t@oGQ)x!YM`5jbpz`>&*?pgw{LSA~)2Y8MLLm44k z66b!aBaVY*@1&yG&18m&3c9IStC&I{%VRB%b^Q4JWI}B)pI2K;z#C}WJ-GSI>DSWi z0*9W>b!yWA>x;QE!LsM(B}PZd zH*lu5nhiMQZlTG6EB3fqTA1|tPW?c2cOql;hEfFP_#u|>vP{VI>eUGYF$2pbro?xn zR#2H{oCX6%rkg`i^A9diyF_2`0u9=GlDrwSJ2Kx)=}!^Bq|_BmQP`~T$Yu+ZcPBOb zx24Z}D*m1}X6HH3Vz5B~95OOeMr&k7l^iab*8bf75{?5ra-K~C22bsQl zpi7Uk$7X&}@bGh7LJxosmR9g;)GikSDLg##pHidJvWTk<@cv3nW^qGHH>n7C*WgQ# z;c#3$)TV%k-vAWtje|GSVl{!|V)gjS=K%uqB_9DQ@?~Nj6n8 zq9?3J=o;?Lc{*nJ(t52TJBeBLa}v@m$JZno+ti#VL~ z%Q9Y38pCY=a61-=GLvcWhDkdNJ+0R!i*duJ3^Wgn8BscIf)L`6J>{PEQ|z>14XmT; z^ZI~q4Hz!V;ZCodqsG#-FWvj^V?R=Fjxu#S8R9jw`6u{HLgx30J^`^EY)gPP0au+} zM&m^S8rV)}bAhjWB^}7Po10xI;fr?H)#rTFf7{sWt@Z=r^8^}(w9}L`XvEB$w|T9( zo2HXWwl}p*3hwngTksU(5Uur;^RXvH<`NY;G{lPaX?)gz-|r@4M9mnUJIe+bNGgE771Xo zd>*^^XE;@z{2YWy=7p`p8|&8#UL`#;devk{yIl~J0!hn^R}>0H8lvT$LWQmR^I>T7 zx}l9`>(Z9OaC^y*U>6{CcNSf}U%>R`dzqXE!87&ObhdPwmS3x(lWmvZZ{YULS$1Z2 z)0Nw`dD$RJkd%+%K!!HKM$KUaKg4RUZ8o8fUjqJ6PqXojqjRn|I>)b7mKy*zymoEO zr7Z}tKSztpH3o?UKckvs200+~p$5wKy?*s1UGpdn^`W^q!SC2pxzX;;$9P=L}U*4S|%JmFJIZ`t4a#O zM_Dh)(+B0W0KgoON^Qz?>FHkjByt%#{rreJcH47o_$>hZ^;~O7NewF|4Xab(`PI1t zosg)P@v_yeQE|6=`=*=ZyfI5EqybbxpJD$k#sjz7J{=A1P$}d6SK;z*#S<_Ss;r)C ziAYZ88hA720IYg%3sB@_fI%059h>Ms1vOIi5HvP*9 zx}FbS@TRMQhPDP^E)M5<@A_h@yVT-~O8cjBlb!KQkB<-UMGU~h@NRUc*wU_!+9BW%>FJ}Yv&-04@J1{3&YdH0e*h~- zY}21f1Tv0QP6s1=%Z;D$WCb!V2MSQ20P!MQXeLahb3K2|@hYV(vAVoH_t^dzHuC4g z*cgEbmsTzEO#YH-*)vbi4bevJxkw1H4FvX&(Z^ZeHxj@(d#XLr@9z8r)frHfp>WDH+ULx5HZG>wx8RNFzEEkG7MB{L90jZR@WO5f z>*}i6oY{3|ls$?F+zU7a7^Gfe+r3q7@Us6nH`a&1d<~4>$EDK)&5R6vBLJT&Zv^-D z4A3piDxD;Lb_Xdpk#?<5MSywcCSUi}L~hf7bLKnDZo6yMzkrPlOxDj2AuFq<`r%gB zueZuOc6^e}De3|Jr~5H@E)eFZeGOtn>$e?etd-=YM$g z@8y2cZ~8TV=^y;ukN&aWbNj2pumAPG?N_k)Pyh5!`={UYW54HT{%pGah2`Mq{z7^3 zr~b_I^pF3{kNn0zKKt4F-}#+?;b;Fby7*gv{_k%8z%Txvq<`hdpTF$Ke%W9A+1@Gs zcmKp6_?N$b3-{*%AHss97%_V@nVpZ|%!5^w*F-}_&lqQhU3hQICq{Mn!TiNEyQ|Jsi? zk3VfhKl1$t+28+@fAOFDuYcmle*yRR{`Rl#{nO7?r*95%^z)2e?IspKm51l3P@C%!#!(Ti6<@|5pf9gkm-T(Gezu|ZP=x_P0|M&m=2mdrW_NE^I|SF@5`tR@?(Xgo+}+(BfI;f$&+*+@TSm}RRh z>w9PscWAC4;Nhv9r?p)FQtWJk9DzS8+ZsccO;?ptU)Bz&W1js#>7zf>W_B(%w`q^^ zRnB(sm1HmGQv?aZ)QzlsUa|-ZlQhxcSFH=KI2xrE`Jq+sjCJf+DrWRzH%es9`=dZ0 z`C#TWmDT^JJ40Kiu*_Fqilh+Bdq-?1i5eC?^n`FmS%btp_Y|+Yu(>GQEP19Ufq){2 zxaLbOjjUf*c*iP2igfM@ROo36n(I7lp~_A1WvNV3y}bsCI8x7qhCS(kGa(<-S$>oe zpPl$I;t31tjiF|Hv{R=-r47mjkM9aQPZSKX$+iwWSm4TLq?;2WcxhAB{qXX1H&0rv zs~3G-)Rf&)KBagX_IC@4eC$** z`cfQ~UH@;)mAh+HR020B$Y^QKVtJQoKHb@qB=x2`DNPv+hZY>C*Y#MW@LlL4IH=ZZ z0@?ibFy92CSWsR`9`1*`2_Wh(&yL=6+*!T~%MPcM(n1FX@3JQuZut3}^T7ocUof9i zemtPj@h7{S!pc#Fz#%uPSTO#{?9`m+y3kamd|YJ` zcb|u)zb~eids6y@4B=O3c-a`K2u>WweR5Z!{?@?%;dOf!!hYw7@7<)<7>pptvL`Ym_d57P91v#iZE?vLOPON zx999vftQlg)me&MrrSQq+HT(BVl8G3n6GV@QhG05ZBg=~40{8f0`b4&nY%tzOIEqJ z*$A+~8!mPVdGkFw{<)iW61%6jBY39~J8oS^#`#eTB*r9!7&!J07i}}z>!)omhWL=~ zXld9$_Ph!>8i~KykC~v9^wTAq0C3 zG`*!rn41#)9{ewCL1lNaFtagYUQ zFgVYUmpj)h&lSG$Yoeyw>@!^a8YA@_kEdWoeqAvJ=Z96Q_>NBeR}nei*bm%qB*WIf zt?xU0zQ#DM;L25Q1$b+HUI?W#70XW=`Xx(|$;8{DMs1iZVgB3V{88hp=bKMWY-PqlXA`d9Oqdx&aI5QfiJs6; zwh|O-{VaK|?0>~bTdFrW!=6SJHdoNPJaYd75(Y#17Fj;nir!wE53b0i>o6(l%! z>uNXJ5~h%I`!t3eh*1Z;B{yP=u8D`W;(^NCzxs-FiKcO9B?#_qgrp`-WBeOwNkUjJ ztd$Q|sn6cIqAn3poMcd}vQ0P&euhs>|%DVHTIsc7!DIZM~Z=n zduOM*-ula?$+x=#YskF$om(Css#BDz-oozJ%vKf7@m67%hl||RWpXz-Ywz(;GkcLb zY(xX=Ufng9@x?h#tnrlF(zax%{?w)s7ukg7Vn%=0dunw*6kpM zo&;Ti-BW6nS^7TG+Krh&${Hd6>F*-L6(71#HFvk%py|r;=%qryNwNZBB7?|7?@8de zJ|MDe*TC@Z0f3@Dagbl02=9f-B-m z!4y{UFs>C@#L@&*mX=OhLqiDdOt99WRnFPE^0wqi0fbpUgA58XL2^}VY7`c~{cu)1 z2#YDIv4(z1Ca35zMJ;Xq{*|r6$UVz(Ws>xYI10AVBjabQC0a z!1hVQt7ng{#ovf9pom@0AGt9E_sN#k`VkLxP*n^+k|);7j8#rz4Hkhfg8} z!2N)7W{@MXXf{Y*u<+^hg5!8jl=aGWpS?}KyM3kbGRnwbTuL^ zTy>#s&>WgB!9O`!K)(A&gbbgpZ({m~7eb2%Cj+&<>I}m$V|`jh3#30XI+Tx?qM{O# z>~)51MQxf5{fHLJ3M*>3AcvYH-Wxpdm7ZFOHTlOrq>4nVMwN9AD>e_?YWvc@7w4ZA zs$SMqlaU7Cjz)X9LQ+1Xbd-6Ic>X(Te;S;6^{-l5f!G`kQFd49_o57YQ|e(sHm z)8`yj2^QcH!$t~1On2%kqRgLl&GyMQ9|SOq>Q89UMT6!Dl*#7{6jRzN5PTQ+VnJPU zN=dH{lE2Yqwd)7{f=`gtrI;+(ij-CaDb>jYqiTCoy6fkAre=(mfM&>=;NX8zfKE5Y7a1S)s5;mp0^6q=|XX+?|bZKFv04(5RxyQ#y--)hu(LYepGZlm<9;nt$ zIx?tzKyj(Cs`V!$F0Z3WWgBu0Jz0u!fIj##Y9KmCg?l*MmX^uQWx<2s0CyKLEB!s* zzJtM*J1>^v751v~N2 z6vX&Ywxt`MB@P9(Q`o5xDu?<<-C$?Rz+(>-wPMR%*L@6X+pN^FwvPYq2&E7jgcZzm zF0CkGchfi3mCcgmm0QQGdS`5yT}lj(uy4M-_(V2WDgulVc(Rs;;fbFxQ@OBYWqI?;47K|1r%R3un{t=3n)q)p#`EwE>@Z5gW7d_0% zjfNPXri3*xdm=K~^Gu%^Ay4*Mk*O3rFomiz8UFf>D#0YdN9(@3C*GZ)DO5dD(XHLD0=mKS zuDZN-7WBX@d3mfddzH^((wjT3EnzR4xaI9`>fJXMiRkGw>8x-b!Iq}3eh-G^dHl({ ze$XPcoc!X*&Ss4{bXPpdO!DhGR}8{J4u!mtuMVSDzWwq3AVU50*}huDa7f`NSB)7J zQG9jn!ahGp$dYFl*HD^2H!y$vH0>RnLR~&|eJP2D7)50#XV$F>nMn4<^0vmU2#xn7 zHHMq$4E9(f41fsuGOPAgX>l1)(5wabW4o>L#YEc)k39K-A=Qh5|b_iSX#KZeWx zcp;?d2h^?PbI7=t{(3@BhVf*{-+~9lxZ6I>*GokeNXX#}!ytHF87HE|q3<=ZAIRnQ zB}R<&d~RgCj=Xm3x^0={3_kI2Z?$5Y4BUSOx02gF3C6@q%saa^%^Cy`e^}lP+fXrf zd}&kWer2lWcJ{NKVVJVshRT@q!;4}$an_GikdKY8yL~EA`ut)->>zH>VR>ajS%O*jZB6@{e>p3*ui1Melt5nhH*8&OL7YuhyuF01domit_I@Od{Ki3U zt+J#h{tVK3j8)L6+;w5`3gJ}cRDse+{w?pxR@1R4K-}(>H5a&E(?gfA%;y`)dB*R* zK#>fJNf8S;k$nmTfi;_h!s7+=B}+SBmk6ybIHd*S%+B`ye^y3#3WBpAVEmTCO9brk`-c$%4%L@4VYpEO~ z`V_eU<&B3A>j+l|+}(QwU$?i|m*uviQ_W`tNM0xsEw<-AvE?S0xAKFAFY)GS7ewUaH?*eEyslchvyf{sbobV5 z@k}^OBa41;2-eNXTs$IJ6%8OnU5OOm2O}==I3)OGKhfk1>+EWR()gBKp7{t4mb%|? z_=njS7uHnpbwzVUaAl!GEwRTjZ_M80?aK}_vfO*BTXR0IY{09SFp9piB`6BEXFo3S z-nJy+y=I_(-$+ipi<-hvG9u#y-MMGN~l3Ys`SIGCWtloB42|*6;o;qjp zBsFE-iX}&<)i4pj*}nXIEbqCC&}FZ;Xp+0IZeoaBb0lalpPG$|E7+sk!vfFjRls}L z_a8|+8y{15higA(>yL&G^jr9hKpLkT7S*KtRO9epQke^TI6isUsBBLfPcPpWj6>IT zylNG(zm=cj3$4(b{;p^pA%3mEvi4R()= z3SuC?64Zs!P*os~F_%T(o@>%KgwVd(dvyiMWbgLg2X)b&)IUbh)s*cqt5JM7E}eyI z_-1+0#n#F&wMWJ7^K08D&`vrUoiWq|R&Ox;$jj}Q!CT6$wxadS-JC&sZjJFQswY>k zPBo$<>(i*tez!rF6TjNF)>iL;sotc=jl2VA=tyXNIYtwAu}FL6nv%&^+}Gx59LjmF zrllg{M@FUP>7Q>xslH$nBFT?!OS>)Uz{UyP%}y!SyI(}{_D9Grj}%B4HT9M$!g9oX zG?f3L681TX+D%wprEG^Z`*{<8^5P15Ug9`TgWIsJCwbhqN6RBCIR}IDg3MJMMW1bL zCexbVi!~C{6v5qA0VgyJ&SA^TcC(Hy&PA>Y!5#hTWh>K)r0Vl=zUHs0c5|LFNW|3B z`}QSVu$MKzh3d~x=OP72V7@=)C0rifb&eG#-aq&jz)@+f(3w`t8x06JzH`EV zjlmK#z8Xy$O77DIp6{h4N3t9m?ET8#FHLkB^}^LzW>|ZwgnA}qH1H~^@teesg@65g zoRojw;$*{_c{qWa8UY}$m$DzJb;Ifx3~*uEIdhaYVoNV_{$Se2 zrG%*C6%7cy&AL(P|0xu*fBZj%LUvA8mj7F!uu)qpVdW#H_kH!$ilrrE8VHJ{Jt>6P zd3)|VrUq3y{E(Wgatek~SfZOT8~Anw&(*x7wo}@&EI4X#?Eu_1t<=({7gS!I9cZQx z2kB4JPURT>)>J2rZ{AK9t++0L@U5gj^oW{LO{=gJ{qQGyb|-(@yvA*U#>GDT+Hgs_ z-6C^UHopgkWI5$d zdcJb*=4qj~Ug*}NZFh$MGaD#V8S&)mZ&~u#d2-f@8eEoobQc}=c}Jn9uBw8bplf*x z)4+|WP?(an+Fvp+EIdmm9lw2{rsfAyt0#4YDrC#sR@-)omGK`+tPDY*IRc$Zl+1Z})hh7D^ zMrmeso?iWWC(=@bgOurA)O#`&@u}XMgL3`00A_ACR%5&)L1r4JV*FAV@8(R2MD|^4h z8XBVWDlqnwTqZ&6^1Mx6wPxXwFw0v^xPK~O*(2qpRwCs^_N9ZCdARlsS8TLUYxUrD zuO&9@^xXROvEkI`aIyq%?bp5~QdNJ)TVOB2%z>_OchTP)svAb*R!SUz#nSzJ-CV|3 zb(uDKQnzEn)c9_EFLuKgm%8o!fE0%%oJH>W`oonREZf*l^tRidD%YZ$OJlb zh=rsW&c^lBD)e+0x_1x3L znNdoOY;_unVaZYXoVaa#7#f$CifTLH%e=Lg^gv}fdhf`y$mJNyo#|6iX^fnccghPW zr^#cy458)}Bq#Nrh5TcH_uG#;jejg+uQH2%fR6sUHQwO=$#=kG}2vV{_Va-x@M)phuSX?SdZBr5ps;353i7{G*7NbE(BB6 zlCL;#-hM4|Z(z( zVHu`$;uW-$QGDFykGL_=gPnccp_CCxLi&aHv*>H~4ZFkXgnT;G%$Pd0%y5Qn!$<}} zYBTG7wEdfmSsZKw3?bU=hSVIjflrG=%rQ?&n&Q^i%`Hd-TxNfAt2Si%zhk&tP;t+v z+QvcE1s>oWhH6AbQ8AH*vupaX5snmcL*EL#A@#yl+g2KWld*wp@YZgy7si+pnVA3Q z39M8?tdC^KBGXpP$@dF{q!e7AoAVd7ue|y`*I7u+BFw0UmFn-GNWBroPwT^$Lkykj zW+yKbHx({mvQ*YL^Ezza|JD`xB{yuvh+kR@Zkld5fbBibuiU)PMSY)~OBtgpBPypu%wsiv7)5u5LT4n) zr%I@W-leAKB~pkj>S0Xu{Y~9cUqs9 zwhCb=DnGaY;5&yuM#ctmAmz_nwr^gC| z`E*v(Eya(ds(^#^SfD8-RXwHO(v#1)L$dsy^oI=Xlmy+@11>lGqTN~TJNmA&=Tn1| zp5(hQFr6~&=0w96gPPIX$N1NbL;6{lJrT0#wYMR2ulT0Vo8q{rsypkqCOdv}lB{AX zzD5sUe_U}x1iMM>SumJb!_+@c`}r5zTMpT(Vpe^U!Q?v>H5?L@I(bm$N-!WTa?WEw zl=Clrhh_dQv)K8BqBPTLZcy2abmF|EM^qU5P}q!u@?fs&xXS>#FPHEZ(V|*G-mM_; z&D9ix6ECZ*G21Hi7H2?kN8ISrGVWzhK&JGiX^8$9uRn4%#c&6fC+H)+K-7jv?5B=i zOJAyTzoRfiCiC|xw*rS~g%yjVwFMu<-R|CJzGbQPBQ#RIC^u-?{Md-V7V2K8*3*9} z4`b?g(JC~Rgj!5_<9k#&*8~eUYyhJ|p$Rkj=6xTF(&m;0b?I;{Rn4YyQx)CaP=}lB z{l`$fJFsYEBMrC*g0$-zO7&gEM`Dai(g_ za##<2N*4?n_U9ugQPxo!o4&V@!F)*YGfWi}Oc(qi3pKwBt?$Wn89REV0HwL|9PwpP z+?`R`bDx~|JS7HC{I^-4?H?2*gQ_0wv81kvoXojP&45j2xLYdr!1x0-c0L){$ABo~ zZJzqnFnj&3cTjt`u!of^`x>@*kjmZKib+|6`MrWunue+PLJAYlim%0{c!X$YJ&W2H+nWW$gB>g;tc!8f0&Ii7V z`d~S(gAu>Gl7z`u+`{dlMn)01#l=2oRIvg&RoFlQD%)<6bPBefnmB02o@?w3HWh}yrM0uYC75AoeCZ9q_GxfJf z+9%Rx4nC~DB`>*vjVz93-Yzg*cBZzx#{JY&r2-t@eBKP=34kp~`P0zH= zM-fz_Rq+&;%7jDA5Vwj`=u=T)^1*EVsZoahQ>LH2!29!`21d4h5r5!#Ck9cXF$8{z z6V#b0gUwqPDGd*@Kv|5_UJZ3ahW17fYi!wKQ1f}Seh|}}elYv-H{-YQH(|ehMh09;t_!!C|49k&dLVI+o*rbS_d3MHt|3`~&57LW77 z-=1cljHVdb8Zq;~nJns6a>TgWqBFk<`K9f3Q9+K*!Y+qCJe0a;N149h=2DG8TEXv8wfiZIb49k>7Da?Fg|^IOeAVYy|`L33iJCs*^2 zIhR7Xx}RfzhE=19v?hEon%K-?OW}^&5&QwS_O!sckH(F1`SLWiKve}%W_Re1de2b#b|dRVwQ40E~d&O5< zZ8YT4XhFH|955fjsQr|tuJ`%S>(dERO(Buj_jYgFb&u{uBl&vcA&1(}j^^qgW5DV|5Y(9U58s+d9En@Gkt%kx z%7LZM7tu*YwlRIKa6s)bCE{HjQtX=)@79_!n|nfNssY1vQB9jiL#X&+J5ZbB3xYI@ zibyZqpXCFR<=@1)4`=tf(x#vdkx;yPUuoX*>Ve>y2iHPKy_`)l`gt|Boz?^?zl7s&2L>WXzh1hL$Eqj)=^koeUlS9g(&+ zFf&19*03=CyP1TQ4Ut*O#KO$nk&K;<3z1pW!V&n;sJ)ntwXMx}lkbjX+=$F#Hs5UQ zKie7@0qu#KI9nK*0PkD`T9h|%up;AN1MaEv|L#sy09EvtwqcA zLszLcm`pwm(Rn+{9M+!@=?=57gmpT_TwI(&IidV*IC)x0SU4fQ@(Go5t%i6<-k^C8 zVu`BAsPFabMwSD+P#(FjFZ+JSqt18gm2c?It}L2#fsUHk;sQ5IXPtX^z=kT>75?;?^!{hSa``8lBlq-=_j9!E-%F_ z{w-18H%z)+o=ely%7rSxm#;LnwPl3hKp-+0%@b{i)l!|w7(A&bnG-l5AfS+1fS+F> zlQ-xm2qZiRKA+AXYI8bnVfnt=(rC3HqZm!h!^Xyj83qON)qNGR`d!iG^(?bz2;S&$ zW5Rl25zu7@cJ_MWY}<=Xk-sfmbbCK`OD9mpcP1nxynFZV_4Re^5&<5SxQCPw zq~wQK5eq?m$AY26X|e`Rr1g53 zFV|RGUA0`OvNkfRx7+#jKnnCJ_ku%}Zn-{0@Fg}f@?g?!ZWAJN(>>?W?Xa(K{b!>4 z>8RWgyl_Ug2!Xup3%Q)HSE`p6D`Xy>oV=Wn6r?~ZD=T+)cG%h3Pft%PD=HpLf`WoN z;4g1)_wbC(%&wWW8!d6V!F@qUPRGAH?e`F0&<@EF;fmtYW%-MFer58(!@)^U zK0iKQ4vW&AueQ#PjD#U!U|_uCbDjg|P3KEqufv1kg?V=OKO0k`5Qsva@LF4@`hr$5 z7-RUSAwIo3LXy$MZpW3)zcP3}`$Ixdi0&%(WiNbOU0ZHm8Z2f#Jv|Gqz^~743_U@y zv9SyKK5Ltbu3Q|>Cz=nWpbtu#QbMmk?{X9}4?;+3cpigx5g^?;kPou;4U?IC8tFq{ zA5xhY3=B;6EhHF)r~w9%0Fui(4osYU8cR;=bvb9}n_qmZrxo~a zeGuj|NC+CKdi9q~c<2`hbN5T0N~!6ujK`z$>K`XQW@h_^vdMxAkg;TD=3EHmV44D$ zXPj2QOE@xs1#mQ9ej!v4LbIFpCf(=!i{)CHc2j}APoez=H7rCU7?R3rH0bK?UZvew zCKB*waBwg;H+T6=;2bF!jkN0ag}%Duy_@&*-Dy!#(VI7KuJK*RAnLj$=aL`2IiaU8)VQb0HAU{gUk=c{cJ z=iR`oQX1?FTgphaeIZ*u1ZdY7a5FSljiugRh=_R|{N_;L5D2+|cy1`ioaNJ7h$a#DBy%-J6oUX)Dzr--U z`_JJ-@oXQaaiQc6i`# z{6h-Fzda=pq9P?_wSer6#Zs5~{%f$X!0wcg(}wA6e`3_1Ul|VMtMc$@R;HuDFsoA>?xjx9}7d zb2>;tdqD$%k|ag^G&7pT;O)luAMAjuL7?I68^`GtF7|vMNcwvUdefvYZez0x3k!>j zEn4-aGyQXOs$5)LR#sLnF84P=XsK{;a9UbgON)yqYwdXd^^TtG&Xbc}{K8ahFlu4F z*|ZxIR#aC1oH|Z*MOY6qIg@=VM)de!fhhjFePOLxbnlF2a9ZsV5a+?RY_U zd-S2|G=pvL!}wPIIheY3T+9DAWOYPQL4k^uT?I3_@R!gzQbD%6t7`_Y6CyA>I>hHJ z4bkLNgi(mXb=rO~;`-kax4!y<=x0v3YkcIk{`)^1(mkpCToQ=&n0byTXUqe7U4T=oC zELxJ*z2RP-9}Pd&qcz@%fsjyLQ#2b(XnZuh>fOhySw-dkUX_qhe=|TzKw9mhoS&aFzdJSC#}k00XJ?a=lG+#;Up!rua{_v+5OG=NsZap+Y(f7a8} zi_nAcc-(!Hm6atyJz1)k|p`OL_@ADv7# zOKE{1QFw{_(cAEFr!&TN6nj^U~^USD7*J=X@^Abdu@xcy^}5NYV~ooX`@$o@T)<4`7-WdXD3$Y(k0{!U;h(0=u+gysBjz_Nt zXNw0eGX|puEE!T$ClzP8_5`@h0q_!_Nd zcSj&TDw;Aoi>$1lH0wW2qx=nC4yeX{C_}(F7d)4j+g%_rv8%fx+2o(>I?dtFLD^ce z=wL}45Qx_=J-y|$99j~q-Yg=0c-<|8kR#{792SUL3Swx`gP7to@?Nya7NFURZ0jlU`wg?jo4sFGeonD%0?X z*RWh&iV*$<$EGM6Y`ma)c7ggSQo=U?E5eXDU}F9pc$7);CcP2|%#uJr$eqr|fC2tz z^eqB7TVm{o;{p1NF94wp*5bJpG~N)s)jXZPlUH+mph+}ehQ~=C^HuJjpudPpg9;B{ z8%*){>_}^jpuD^m$1piLIxkvW4&(OSAh`LCJF5DD8nn`G+rDF;j9ax<&Swv>e#ENHZy^SMsfel&mluZq_M1eg>?mt#$V2q$58jGLOO?8-f(l)+zLUtj&D^J&GV z+a&o_PEkoIwzJc#-gF`unIJwnIXNxu=+7ThYwOdqv#hKvQ~)rZDXBlt7Trv6Nr{Sp zeQpk>UmmZ4IMM3+_p_6eRUo#fl22>+zV?)E(={?WN;g4GNlAI(q4lgw!fm@*rdIy) z`YI+W`e0ydYbz`a0){BMe~m*@GEMNEG|d=9ugy`b&C!DG{5c{vG4W<6M(8R=<{Dvj z#b&v|LR(u~L_{QpMBwgp#mvZv!ix-8Hvbt*Cdpn3FzP$=7gxQGLOc|)`@Ipqh%`aC?7~;=AlYER=l2 z-KAQip{05=9W5=p?#`N;*bo>KcMmD4P{&v5XZ=Ez!lI(Kwzlmj#lPz)KsiHD{_bwB zoolTDN6uJOGK;rn$(C$8Ukz+(?&&lhB5HKTExII%U zD$Iw`-7i1}!dZ~~Pf>)N*}1?K7ea$gp`s+p#%8lAtaBw8)*I0rn~;4L>*WTC2wW3O z%??+)uV2ajp@1>^zqKAA&ndOa1?KjfvO+>`9}BOoK-ph)1&#t z?JWS_Q+(b}(iJO27=DzS5Vp;e6Mna=-E1GQTSD;guoPgS!1k7yU0iV^=fD6t@MKq`ff-}%$y+Wmsaj?JNY&3-W4{mZlE5BTZOnH~9J8nVG_(JGY ze0_bH^x6VLLYVctRwpK`M-yrPA=*?B4Inzu3^y(yF8)r9e=8lV!h<$Y(Qs|MPSy>3#+4 z<|~u9|8#pSFE8H-{B(4TkB@)+wg_+s0O()Tv5OVLJ`j4`=C!-Ty&?RhHhjI_=>fpY zN|%?1ib{NzI+Qh$@&Vud`RDsH<=f-gNg<;dQ;tZw`28P@It@sT4hF}+D}e>77A7NM zV6g2w`7?~IBMR@Jjvo*}ly407Bz_P|#{qvVJ09q#O0KkjF5wAk$crejgbUEJLT{~axf!m9_?i4+ll zZ5Q-EE1+t_5e~{Gn5nD(-W^HMu}Wbxk#TnZ2)O7&@9WF$@yK}O8`J`w=2-YC1UL1p zJ0S300bU@XXt(qas3p3jUt*& zJl25zR-*Gc|C8;*oF;p1Z%kEiLR_mPs2He3_NyGtQR z^{r3sm`v?ez*5f45=Ape}8`xh+(I4L;x2u`)kXm ze^j0=+T9{AvV##e+k4#X4Imc_#wQ?{uhek?G=k;U&CS15D#63;7&uGq29W$Xtd#iz*O;o+Va2q-b@`F=p<1aS6v>dgVh708`R@z7uK z2c)_iEYkvp2bffucg|9~{YPXZK>D?K!sWvKQ<4yPSlGqIMPL~MiqS^5Pq$vX^S{~s zu=3p}TX1(%czW6##~k1N#D|KLQ%xJ1n~#r=l@$XFp9A}zVjvehl0eIaX8?M=6LNX( ze!W}iBE)6VEm0{2C>NYpEG`xt3q%S0VJyDHFG7Yt-!d~-1HuzPcRedB9=pSF|DbPM z%lWJz80D~j^5@CK-@9F1_|zhKkGj7qy1Tn~d%pr2-Ra2*pnGNhFV3yfQ^y2G_4hFi z8{6=L2E&}n(gt=Vw1sLdM5pPS+v}54sprlhinnG_^YtP*KYs=ikZBPR5P-p8a&qz) z7H)2CGBOYt{^?hfwXxy*KNr1wnZn*+AzL8S9E{TANJ&d0;diZJc+Eq0aJbH!1l&YP zP3=HVOB*(JAvC3bwvKbmuB{V6`wkSF4M9Re+MmqMPERK)CvT3#{fZC@9Ep zi4VY&vvZT5pWh8dqjn`@KLme8T?-qHWa?^fFWXPVf1}+TW4;my6}1ZS9&^;lqUg>b z%@(sotLFkPXRGDaUG8@$T1+vdLV|!6RdS7jf)b(D3pg-1xTc2Xl$1**U}khi%;a~c zW~({b9yo)~<)Hn1c$&5BQ&b5Q% zm68&=Ba~CuY8UY5SK;0105bBIFAZMLkl&gHr#9;hreDuy3Xz-5FFm>+L>-@#8QgNW zU_ehZkn_3H&-=x+vnzbgC$6WTtMo*hWt9!*Pk;0aR})+HrEtD{WHkKgHs9kumPsibq8|$k&PRYQ&8PDevju@c zE-fvss;X)MU)%K7PS{JvB~usa*4N~`K1(~SJZ;1#N$C49zIppn1&;>4N8qQ?Y>FI= zE^OW?BIF!i)y+8C+k*KE4ib+(M{}jx%Eg6+z;c(jXlH4#76^YYn6=!1;c(8s*81R4 z5XO5vmy64IkPRs?oiKl}efmRWC+(vpga}N<;Xz0=e>juBGx^sC(gQ*uk9hpp-zUXe zu7mo0y`Ua=e(;?$2zwjyXCmE-`FVU~B(5kR7~-c8m#vuXqhM<4_{7l%y6_3YASPbT z6${w|@w9ap5+BIUw_f1{C`h)Cq82P4bXlxR{(d=R+$E3e~04`cyQ)=V(~=@SkT zko@ZhBM^*uJ&+d`k|P5Y3W=$$e4p3ik<2eJG8i0947Ak`N@AL9XlMWgt1JlC1F7|M zp?Gelll7CMT?8%w_-{l@zPSOKS6WI+OG`_l4H*7`RQ0W$-CS{$52x1liLh7uUaK^s?p*A@XVQhdg-`>o9f;L4L`w3_48py0s z2svzBT+VZI%_jfm7|u9Knlwe<|9tlm7EZ*hI+X;v%1fiDqq72sgiFlts-*3*d9l@h zAyo1W6LWY#;$;UKv}rPOE%6)T4-wJYssfKD<*f+Wd?_`xc>_|-;unIvT+@Co%HVgy zT<|gcrnAKFN>=p!`?@ai-4F{YFuWa(Ze5#C`hV|DyVNMlFtB&7|FZ1;Pv{>0l6BD? z&*KxryJ>CFJSTjiXh~rn=B|Oz@Yf#>gsCyc(pe+MsHn# z3Zai;H~V?iIjTDX2kMNaP8WLrKF{s?kFI*DDiDAJK1N^n$)?-lH3V%!5c2_%`lb6H z6HiZL0Lks$Kv*;`QcH5tb<ZFAy@zW&vy`BP|{G0xURMJUqO=Q)%FEJ_46X9NQcR zkR1020D1ooNX2e{>%4R)C8>S;#_)pnB{l`0bzVmSH6A3quve;5y1l&(1ZxFlG4AUBvV|9rX(Xsewbv&GrrNuFHau_viNOy`JT6Gz5^rqJBJuXj97aBX<*L~&VK zmZ+8E0%7;5eq6k0QBi|QgyzWoD$jTRZT|B>gzZ3^Q(jT@L=76S3m9Tz6eV?d*lhpGCGD4kw z0TIahbTpWp1r!K|e*PpD^whlS{>z#j+Lgb5Z25E!Ze;WGms~NUgFvd85FquSJvEN# zqhfxgK3Q#bI9aTn3BkS=GBP)R3pwUnX$nIUBo!3L1PzZumU$p!69Dtb%gLnyK^72G z0HQt`(Z}(@K`MaIeG*er9!@SvfhyObqnM^%?oe!=Lfq#|_M> zAfxo4payRN3Gui6)Ks`aeF^EZfZFa47aj@?zz9txWHR$Ebu!-*oUA}x@IT4s+Wwt2 zkb^BZ7kj^!$P?KepAp%_CgHTU&4gmy%xlbbcc+Y065l&Off8+B_6s$j5@Y1ke==Ct zn+b6ytn3Uq-qM{eiOD9iHV%O^F`y1s6BA(?^kaGU`7dK!QT``7IF zcxVWHnRT`Ree^{QWQ~?)Fz| z8O{iVMSP1s^tj;>(`2)-CMX0H1L1K7!m#G@;pa=m0P^bwm=my98BQY7nprQe&B`D(Z2xk?@*w&yjbwma2zmaA4t`daAkieMc^hT1W^8K z2rkMxKYzdgVzq$&ce(#<8?N#6#<8v@w%-$VaU7_h0FZpBTs|_JAoz+c4f>lkjv9hJ zEmwYAUB$wJ0N%{WsXYzDGQ9l}2rKRf2Br^C zK$cnJZ!aZZSZh>jBuPgjjQ{Tl;IXhU4hu{I!uS}p57b5}G5>80Z2dflLMWh}0;!)g zZg(3I_J4VwhATSaYrD4Z%1I+D*T#>H)*_)m# z1>`WsFATqJfBxes(1SjLb$a_NDypG6{A1?UfN3;M?3?H))t{z{qZ&Fwox{=zcFHlZPgRjpfRu6P*A0w>ga6-Kh$#?H^Ur2|thYfTBEPEQ?z4XQMzA z(Ps$QPzFBI`d`fs2CM-+6!W>=d9DcM9ba%$)C4gwjezTQyA@#Ggnk!t0lU2gF2CqL zc|7GJ6x1a?%I1t95&HBD2N-!p&7?5CVqr`c5wXAUP zv-y(dEB^*Lww~W+qie0z!OX+M10FsEhz?>k^I7I6CMK4bm)F(=UJtE^O->*w_(!uL z06k18jsE&%1qT}5fJjSA<1y)OimI!t&lbs7>$Yy6pOa!@_D%i;LH*|2|ZzE7IXTo#p%FQ*XrE~T0 zn4Ch##VvZ>`D8Jbe>IUl*Ws3!Z!~wh;{N!m{E5J1jrkg~PNpl1k>9?X}iIXF5x&eV9^p8;hq4GoP)JxHqyvzF%6!8DGu8#N#V z0~-azs$Z)E>2%w~_1fc;a86glOy7ch`EiutEOK!vD70&Y8KzNzofpL?qg04IKY7Q?3$yaDbvn5`C#M1tE7V_yNY6=->Q{Eq-5y{!U&&VfRFiS}|_`3Ph$T zp_*G0>+kA>)31U1d(v%S^H2taEG_Br@M z^l=XlIUH%0mS-NX&Gmu8-e+1hZu`LTaq|;Rxn(rKwgiUa28v&s43M%7UQpLRAMQ}E3-BhU=GlknHlpz+WNnax=cz3&L}|cCF{~*@E_dU+g9{n1}ijntJt2 z8@(p5#pDks9n4=<70lOD7Z>u0okufM=a4SoZ5^?u}GO zudD#gT_O0_onj!A-AA_)E)NC+Tzljs^b;y{#5#K7{#ABGV2!hh&f#e4)19_~OLLFNni`;p$AY7`B*`Eju{5HI>4S1behsFZbmSCY z^Z=L`dRIMN0Ol1GnH{>z<;#HbGhM%) zbC(T;`ojL8u+0Kj)5{l1T-c3R!u=DDJvL|MiHV7GMNwGCXkF9J7_W;L&p~Fk+eBw6 z#{=NZ7zI#0uk}wsD6px|-ZvE+jgpgVL}vn?Kz)?~A2$8jS+r)hibWV2``kHlv2#x> zEDnI_Mws}{(o2+v$`76i78^O=tYAr(Z=lR?$d8_)~b0wHb_& zF)3RAr%b!f3!S;Owe`@@(CX^y($Z32hl^XYmkkGGjHsknp`q48`IHg|-_4TSS;HF} zrJ*GPXq`nAzwp_=;y?xK_Z#@!xuKJK>tlkUjAQq?) z5K?Ih2%zh#Se4#gXJpi?u<>ff9@d6#e(vz_=qSL~cb&K9hyWLNvJtv#A$%g=$5S=~ zaZ$vhpPs&$@1*2%_%-yj{PlhDBngkxe^kDVsHwR*aymMdxPD{68Wcjk+0Cu3ld@xX z6L-oi2iY<+ZGroViMdjM?$A2{2tS09*Z)jL<8z*{uOaT8jb_Zs(pdH0nGS|HDItO5 zH&um_ssT;Q6j1PNH*Q3{@bBZLzV&2(F+FTHqCQc?SyxYwm{$1u4w{_$96@r(gKbL2 za{Sd*yI~ei&Jbt6pFD7?+4X#90<`Gr!($|!qC#R2D9x51@heuaDvhsC3=a%!gMJ5k z@jl)f(&(==jiY5&narTpfiq}FiqIh}kIuj0G?9d@sxsMrf88)wE-1u1z!zGgt&I(f z?DV~5| zJJ22ZKyN%9t14ThkG{djcem@^XZwXNU|Zgpaupe!KF}ds=t_LCGxz{lh>p39nJ+l! z&$Hdazm)fRy!hisMS1xt{k-gKW-BQ#3(;Y;Nx|pUqdMRC#@Qf+OxLyAy;4%G4bRX3 zN8L%11ilJ(R~jX%h7AJH7VP{Q?s%Lb;kbO4lr$1Zw}B#qI-sw9_G>;N(`D_FVxt#v z%7>8CMVZJ+#rX`b@a5LH?pUr~XWF$W9`m!@ z3W604l}17WO(F1x!+R4RMfH3^hjl*(4NA=;N|7VQhCbFwXhy#=vew#afL}Hyy5zCY zu`X)!%gZ_|(}h4z*)!A>O?)&9+kWj}OCfQvl%4#QgLJpf;Uw%$`lF>XKno$zULJ0@ zx3#Icz%I-#&B8 zK|miLA7^aVJl_Jrly)fb#_n$D>(}`?MWrBi6A`I~ew*y&CPdR%mE*@xpR5Pp55npL zZm7;~?kj%shwDh>JTgAMV}7E{Dtdbz@ETiNTTtn-MWT~|ODZp7b)7N8%i&MiKp?i`fZaNegQFUM zs~`s*yt`mEkRugmF|Dhs>$1Sl?#CObCDQTd3yJ!*t{YZC?p_c=TMNaGneo3stjB(;0HqQj$D_kQ1Z_QF z+x_+({SqWyqh;)CR7|Q#9AZMIomWoJ*hgN|&hVrgyu352^Xj){WSW7P+-DaO7T*0e z%+1Uk;1QRQumXuMX9{Q#NC>W5-vkm95;BMZwJp4RZmHj8t=?d~qa#=XJyh`UIBMT& zD|%Rk8MdIqIW&lX_~DRwc{P8b(@vhddl^3i0o*4OcX#(De?mrjF0Eq8IHgz0BLxoy zxOD5>$C{h3b909!0!_!!_w!u0w5k0j^Lk;%i1eMk)iGXv{<&V9HSQ{hrIM#VZn>Ah z+5`}r`>+J=1D9?^@rZyyr5)qi>-~RqHq!r9%4_?9&6*Z>8P-G?f^1`!GCs~eL@C0@X+OA?hw2t~={j5H+f1n*__KLIC z1MPn5>pbzYeB_zgl$FTt&vvtJ#Z$BD%UgBEOGYPXVu@olwyklLuyLtz`=!-o`>?UL zw#9{Hk9Wr&N4rmddm-t3Y{EdZsjCzJ${~WxAV0z8{89dFZ*%j_SAcD!yJRGOpcnLfc1>hYio{O4lih&**xz>nv2m_ImjNti z_czByzjy5q>d+@e+xi9u2JL9kv;%guBC0UyNOK;NBhXLtVv~U+$ewTn!gblhbaS>H zI))m8$<2K2j~VG302>zEFBqLTOg>tNLSn&sJ%n07Nl9rWM=_eqHy3JF!hvgkgn zvmUDg)zc)A1e&WI4L9f%@U+a^aAgi-9)9^-m0GaV|DZv`@xQG zg~QS%;){Qd8dacEmeF`}w3qjwi0dG^qpPcHMPr=c4)>!Miv2PaJ0G1^7t2J}P{#&bplqB7KPgHC#u}|S;algE zm&Z;lnY4p`!>HK#?c0wst1r*q9(O1AS35sD#aywmC>sJmYBM^b3k}O9rP7~>R(O5V z`=r}sDc!}O|NTAorNwZkOOO8BeE4raZ1X{5nP&CK{#Ql*A9egc1~~qIsmMp!89x7~ z2%nb^7_C2#|G|hzP!Gb%U@)Lnd1VGM|Lwf~H~x|7{l~mqk)(A z|G7T{{1^Z4{26DT`7izqUY;BObAJYb*4@F;FJTMq!pz+C<1F}WKgGYC3v--DO-i;VfkhdM8+D%i?#0RrJZpQa z--YO}UQ220TtTmGOo2jzcyq$4`)FcK=S6|+|GoN*%;2+j&!O*OU2 zr6mgxY|qUBtH8NY92kiE@ZrNs-K4i~uLD+YEGQ&oI|oRwEfs)oxN5m~nN^c!8=;1V zU2e03yAGuNGP1I^%J8S=<}4H?B`_tg$W005~8I z)40n_2pB@_u7yWOGsm5aZo&2%lM&QB-}g;hgojj z`XpD>OTb;T4lNmiP=+azzlheHFRpyt)e0muRdImT+YWf@r5v`|J%9cj=;)A;5W$j_ z`T5qN`ne<2JMC!O7v@@8R|ceLv8BfzXMguGv$V8?(nxT!+I(t6A1?gVl={q4|N6Sk zEp8RcOQfVNR2xg0g%^m3h6L1AsXRP9a(skweT8T2u>%`T@EkAVI^rf>95jCu8JSA7 z%y4n}qUaPrOP-SlENO6h0ok~g4C3E|fAHk^NajSwAsMWAQnFBYyd-mOYk4A5mN0rq zf$D7uUNS(ZS@fGXVp9pdd8@GeBRU~rarde3IYG=gIz+D8eL1lgeIp03`WwhG)>1i6&U{BHjJq&-DewGb3 zwi2$JlG_pI_mQ63+z&R`f{l-x`uaB4JkTNm8w*JG8tB59X!{}ibzmWtX$x0Rkt_Hbdf2a*pmoUsR6%=z{I3G?E$R}e9N|Op=T12l= zi@K}>%?EJfnkoiJq2)qpmKGLaXwH%<25J@Pt! zo5^}0RG^Fuo1nUB+y+~FYbY&{S`Ytn3ar97H+FLIDV7-a>XnV=N zE_=WR8|wR&l@(~jQ79BFGx7YAk~ddkXmi+;-HzKMnW2W*hs9M-l0t+@ z-#q{AdZgHKyM~~5uLx#ce~-tGuO{Miz`_sr&{?q3%uRMi_xsQ^baW`@cYggkU6W#s zy259!CL`mkCGoiRLYH{+CiF;a)6;3SH3EBU69#+qwOd^xD<}@i!^L^1@R_E2{$ui5ebhS75bj;)wCv=*VRH5IW@@w|weaIUC|r|T3X2|OFuR292dj@(}AHv^QkOt=wxm*qARND&;IoOK8D)Mf90u{$~ZRb+#m z<5R!9?wp1q-rSg4BZwmo?a2t0Y>d1R89+o^W!Q8cY(biu{fvt57Bvt~0kFaqDGtzw z!*xLs9>axtmoHytVq$`VuRz}biMoi2ltn==P1TMii;xM2&6(LA- zh!aTM4j3I*?ihF|hdt|KrojmH%)+U!uW(XsBXHdXor3MnNnFW^ZafI4_4bV>Vq;S| z0Qz1tq#VEn3`IEhk;No)cS?OM&3H@3M-Q);6l9k4&KWGVXC|bULvKlJ@BWbcT#fN( zH4@jKnDf1jm0zplRuX%0V4_n?rH?>KZu7Qfp^8Yb#jl}H1%yNhXk|b|ohT7D?}Mx- znZ(77(IC^hC(COZuB(DW6uv9}6h0{RvO08NM+E!4ZYqz0>tk3r$uD!iJTPHnsc-j0 zG9VF>RkI8Iirjd=)QhFAmj>R9^Qkn&f7X#8^|R17Plkg8gzZo?eLq z%`#joAjkuOScV>hPO2I>@1Wt2RbpD@?<{N>Z}@vd5yTvjO5{6dcZG*Hot(YLO>P=D zL$4FHfcyFLXV5K8Nk4hA0{UQ9CftaKi0NvD%$uB?oB{&FimPj+RrL zCjzc-i?R|44lX$k*i}GuXlEF4`GW@RfZ5r3ciHrc)Zw^KYUQ9uHq=Q=Pj?K7$#22^ z+P=qgQ_mp8s@ivNj&wySokVT zuLp(U8mv#8cDK6C#j#ZbF(uP%EQ{T1i^F%k&o!RMK{Sx2A;Os|D;vez@XvwwGtvuQ zs-dcvs`3@H4xOZ=?6-72!f@y~xS8rvi+vRRV}o4=##c#YZfqY4p~6 z0n0L6G-J%*B29+q^INMnaPewv%qh9Vj0K+&UL~C-clP$!UZ@J z>1BM!OSOXR?4ZQUxs7AURN}58Ai32*VxuihJHYQ%-=E$7P1&V+dqta%{?A)negB?? zTXm#u@(aDijwL?+rOT|-n8R3qt_uD-Egv)H{QN*kX0fkhx%KvP9@#~PPJXpq8`raQ zgbPz(W%YyFJ;oIi9y6ji;y>3@IGBRK{@b=; zJg+BQHAD)fkdx9C!LIg(Sjlx?mW)C*W(!9@zw42`m5)Oy#(aG$fbYdEKmWdbZ9aP@LOP`;e>|MOukcJ(hVM{8I-OWstK7P` zs(7j&0jsF)$mWyYYe7M2;C_2pZj*FTlwRVWNvJBWTLS%aeEc)msXp#I$teCa167ru z=*!8S_wZ#0Qz$+PF=-o-sC@NmBLc$=quTi~e66LlCTQm0#Kz{@`(oh`f&1`%*+X`{ zI`>2mQxg+bGW^2!zY5x?SuoQd^nB`EKoNr9;LcZ)@R-|Uk&|sChVdQX3TVAhWrOjJ zS;+B_R8(l-7mXp{5>Vt6opLdsWgsK%e-ycPm#z*qx3nn7@!>(rSKDKGGAaX#70bbN zafKkr(xUn(8(UjE0)k%vZ36-ba>Xuw@Fd*0abvm~R2&-{8vr#YpcXYQ(0~3I@dk-l zchN5K6?V=-ALE!wFE6GdZKProNC^vF2lNFb znQ9yz#wFAO)*OA;hFGG$Zf`q8DP;cQ4+;sXts8Cwdz_M@gF`7-ui}sq_T21?E3sT3 zI+ab|R&5vm{`%Ft^NO95%IRwLmtB#(4!+M$d_ykNMSfUWbi$2LKAmiQp^xN2Zt9w; zn5>0x09tEiW(I^zAhH9Hk|%_^t!+04r1X$19M_$l4OOJ%@#2V=w^>{c4-eyFW5rIk z`{(E9p{&%*8w7;tvCm>}dcf*&KtO=~XNKqwKwbW$X6|mrLDVt|M3dpi-SlH)x4r2Z zfukyjiEs>0RK9<|@%6_eGa4*GOqr{We!@#R)pmaQ1xvx)J#K0^sCuZb-`tOmM%f9S ztfA8mQiwtko*C`k%w}eB0>oyRXDObq{23?%8%r{;h#+jR&lZS@qw}g-ojV!X0GX5L zp9P`&PA$89SwX?~ISwfkUoTtM-w92El^yx)nW53md0GS=<&YK%bzu1zd%#Be@#fR z=VztErtwEHP2ay(V;o&s-0n)M^Eio9m91^+IfBJ#1DpE@Zzw?S1P0+BPT_z?2_wOxp)q5 z@uaq{?(wgpI7z!9i;hSMzQCjC+_~*I~2dZxD zwKsZyvXw<>J$z(8) zKdg1-r>JsXBSJ|+(k8sOHxmX$Su|JbK}uJ#j~S3SO-)T;thvW_&%}f=`+^NN-0KIb zj#Pvv+oXi_T%8KyZdbnHIG(2$1>i55LmQGw;~W%?Pe+O|z#DO!l{2%qDAaN3?;vkn^gpASPtiynD1iyfPV0%+leg&1oCHf3FOU z=Eudw<>BWqxN%rx-2Ub=rw$nzSs*v^+BFb?&)Gc(qk~ptL_`Dq)Yn|iY=v(mp1tdX z4;qbUCp^ByB3f5)fdYYf0ngaVnwy)qfBz^C_4%tx%M&?c_#jh6MMW**g5wt7PrBg# z!t89D@y!q?XBKFp&Jb##K}D`!g-dWDw5aa#3Zj}Ck?!mZJrIcd9eOsQKDWPKbmStQ zQiVL;N=A#mJS^=Z5tIsi{hDmTDEp40V#l{{W##1*R-i-#;^{goO47(0d-;CBrOP+@ z#YO5{@K7!e??oCR!m^d)ThApTfn~K#yZV{>Uyy-Z#T($vnZ#8ylUyFk2h)wP2OZq3 zH#WYoQ*eT`e7gD7Oc^#d_CP<$>Uiz1`T6@=S}elSKm*LsH2fn27Lr7krM$M=dUsp; z4LGsIUCqN|`#S%c54jJX~^t9~qPzaM!%BEey1q8|kcWnQMMu9@6pK_1iW4Yc(*WYBe5a zMz=Nl?hnn6PX{CFNvPyVsWE6UM7j8=gkQ$Ze2FhTB$bTdW{-VPkZ)pFYnVspm<$|vp+TKE2rgjQi{r|OEx>qH z_twrfta!z-onNIMXslu3Rs8xUB(GO*bDjqW~CS#pubka5OKkM8ivUD@`*yq zb&peRt+vrt|I=Lo@B@rsAXIr=g2LiUXrY&lU(YAe7&g^-pnjD@OU!N-3n%zHE|-BE zT-X7z?~{~NRBX{5u3n%Ncxn{%S5PwW({a5&(oXmE zL}+Sijui?+mMJYSUmGg;QEb=*aum+{axyX_qoZHvHZwA=e_%o)eIy#AAd>u$l8K>f zpJDQcA)Zw!fS`#5${l5-K*WL6qH^;0@5JzM238b;czRZTc_gB*&xQ%ngG7y#KQn;kfMfol zxOk+_!(;4=eNLUn!Z+Bh011jW^1et($$FnH>MJ-afTiq0HphW`0z5bkB=v)N1C_i_ zzkBmyc+v?;o0!ajQw$!e7E_J4B{cGo(BMBAEqz7sSK)1B^61ec*h=K&{6W^u)iQ}> zoWs4-xt3iK1Hg_SL9Y{lw64)ez(De(zD%s)5>Rk~?7Bh=f(!CbfCVUWhWL$2E+bi( zCz{$EUYS^z_`834uQ1X(8TH@|F^%L8e*4NQrJ4S}oA^%VSzIV_UVu15@P4wOt#`Tr z`bju4-=OX@80o5JjUp}sRN(4brI6XTL)FsSnl{{a@q2B2DD4Z;I?ExB zp+@K+a86a8Xh{VBEC02T^7WJ$~U9sE4XW;jQYF3uRF2^VlW~zz@?Nk%7L=9LA zwLXKa0PGhTruG#azb3aW43jZG=XJM}+&p*sUCl8w^KG0$M1(gjjiBczK)CyVP3Eex zyssO0T5$n|fI@7BzSQl2o?8etsgx?7bGP&r=jH3!I z$XJDqy!@*Q!CN#KJR2L0LAS}tJ!&}EN##gk11${uS$Ug|&e%wLeB9e-{VCN@5f)Ue zWfSf^q-GgI%4=h#QLv|tXG-~)H~QkN+WvK< z=*dbD$1L?{cgNhgEpYh)G#m%*%zQ>NoIAQg&-6K$N0@4A77NN>Hv{^u#;lFK7XntTdJ@kfZgBb% zy9wOX2t-$%gbrF7-tIJP%CXoRLI9|!en&4^kd?LZri0^aTzk1k&s3|O@RkKxCkH$U zrHgJg%amhbrw!-yf**YgP*vtt3{?20iMF;p7Z(}DUU<{)Z_?I8=QR~N0hJN@N;<{s zX}^JjxWM27l^5hHw|Y;E9o-hp&__S>by@R8GJcV~_vuZSXCh_d_*om=f8H}f&>I}? z&$k$lZLn*vNhBw|2))Vs%W-`$Z+o@65gQxf*^Au`+rs?Z+}ZYg6NcH$8eN~iwB&RK znXE1Vrf6zvs;{pvt^)%DFj3+2Cb8iR7YO+lljyIW!%XdJqiGl)cL!Drk{X48iQq_S zUU$my9aR>#Yl?~r3XQP{$-dB@9T$0**R1+Z9+op9_nVdx{{XcLQEp0Sl5&o(lBkdm}C7-<<@KPwwC$#!Br zfz+CwtaLv)3>v-6#LmraP;O02BZVLMFk^0hS_#46h}xeH=7voZU^VCtN?>ybJsa1$ zVxjH_qjNM3i<%EU(=HAM59Lc4arIi`oPn|DsY1Xb>Iig2WSNYd9G$Skoqk_2TpM3g z;|(J_XOE22YrbT_4?VWS4t&G0&^1`{4Jc?pcP_wwwEUwyLKWu~ji4l8B6m(?5eNX0 z`T_>{ulwq|YhNKLbPW4g)oaeercmtj@(9jV2hJ5<`+BlO)ZtEyveSt$r}i~te8SNd z5cC7lBOqXCrsTGCQKQEVH)$_jBbP}jCgm<$WkOU`S(Zihr5>vRhM-_SPCTcTi(l{E zYYw^PZ2eN=Xsdf5Gq~8@QJYfbI%JShL+%k6c<}KfFCO*$dyskIqk0}@DUn>x9|BL| zEWu7C`Djh7uv5m)FI#*JPvn3sDA^9OgM)+jHBzA_fjJJIpm+rD(|$=xN_~HSKL{Q= zIshSf_%DESRrwp!f5JU%{3w^#xxbRc8h5|!scg|-XL?g9G*+=uuNw9CVzMJOwea&x zuY?9t0edGloUHc(H(44oBQq29Tq*x(b{s=5Ub=LNoV>*k?7=-fYJIyRAF^!yD8ss?$Fz^~S=1AwF^;Y4HLOJ;HE% zr>52k-CzVB5KbKu2e&}>tm#PKovOcpn}8d5RFr#{jVl-rv)X4Lx&`Cl_W#@kx#+&8 z=e~e3pzvIX+4b(@cR~*(AEktguZ;Rd;vi^JG1fUx;Km;(qmKg!h{YA8DxXp59^GAu?WU&N{i?)5?oH?I95P~JW}^*M z<{dcs%UJpBA}O_Bh>d^h-?DRzZO!i0nt4@snJ7lJjYR+D&LC(ZUmkCK*;?&Q(MLup zwD`f+{bAVr?+s6wKIIQY6{S@Hplr79-4OaI>k;d3b8?)%YPja$+?Uc^npvWS%7MfI2)kL8SvjKqj{ zcXs%Bd0`@9W@Y68s6p}Z@kK>NEk$2a(a~{5whNl{oap?`;966uw_^OTSQ{@jA?U(J zq`aargd6RFKAK2=J|8=z0~GRO?6lWNM`eX;I5_X~WsHc<_+4c(QD7&)GN*U%o{7@g zVw}ZJHINuB#WN5-V|A^nCcoEtpuf&n6Ur9#`i#^WT#@Qoz{Ws4atob=5rtV7Nl4VY zvsI^Xm7D6lN^OxUScnvPpKL)2Nw?Lz9Q7n|Vvb@iYFaa;Qta?8tpUQgZ|`mydSEZ< zzFS=_wWj^-poZh6Htf)_Rl7GnlPvCG+7^D*#&@2PKPtZ$@xwohUBKT)(Eqe8)23JVG+^yy{pIZtL~0J(|NvR9mC8Ru>tpEvRq#P1fBuS|~t# zR5jZ@shvJw%TZgqlvlJ4s{t3VCZeRXaIG2jMDkI53B?nkdPHxGknG1%-KJWi78fsd z6M|Dggfi?5>@?#U#>X=~Y@>Qr**ti*Z23Vu9e`YHH;H}6wBo$gLb2a>M!F|D_%OSM zSdWw4QoF^QKBCpP$^`k*2D`ms!=s<6fq+Rh>qWdGu=_MpcDcVQ?PsT?@Xuvt|G6x_ z!q}>>gr(*2zQvb*L`zbHFOl7)g}H+#rl>YU;b=H z5$7*;3Me0+aIqP*YNpk;@j8lYp?fQ;_b~>(MeK4h{^j`~Ac3yV;pez~XHhj6FC< zaEfMR#uXAOHT2<8>Zz?>=VkJ@vyX_m4cCm;J3As6re~CtJzZCD_{VkhHUlIb?CX({ zFi_<&kho`&FD3>v1Zrw(tj8Y4d4+u_D~sxw1M|!IW!xv&w{E?S3A_smRa6dWF=?!< ze%<_inHwgwj20W-2C@6yyJU5*VLm7!;T)KM-btsb3E0e}7X36(gV;bN@Wt zDqoxiN+}2#aCmB~t540$0Gvptf(@AAJ||=ZlN(ZxoG*qwV2iS_usFYfTZiVlz#?G% z?#3niKN5&QBoEN?Pe4Zts6WuyU%0`p*z6i2hkWPb?F~!1`D=ZBJ%|RI?65=p^iSh7AP=q7r-iQ4M zlx}`1+VP;<-WQ;ZVTv=JkzwE}Du+T{U46Pgdj;3BtO_>Drlxe5>oqksbu;$0rhoGh z-Nb+yO3+#5irVR#hb_=iaO-KL`qF}eEhZ&(s@}q?Xwdwc#-(?Sf`Uq7d~#0^3u2C8 zSsjM%bawi#OrAO_M^ycJnRm8>%+nE2Z}hH?0a*snImlG{$nR;hu2?;`Qmi}nb|Zt} zW7Sjl^W$^jsjSwN!rWG(m{COwP4e0#ALp%VghQAQfkAJT1b%3-o!Ri2BP znR&E=1gNJ55JEI)+NBAyf@A3TxUE@cgmSAV^~;tL37G0gF5DqQox*&;gv9o)P#Cdy z?53-ER`IX~v2kSdrsqBs7_E*zt+60JL)p_{`}NK?mQ568ojtc!bDNRz?68;5>Y7XB znY}$QUFAz?sRd~X)Y))yvgG8wF*h3P8@_+6a6=%@&dqW8ZI32!@ZWkgeL)KYb?_vv z>$T-oy*LSjMb@hFSmv`Z`tvcfG8TMf)QX8B{Wu1BvBc9}Nwg z58%RRtK*FH^e}O4+6c%B$S*7{Kq>|P ztdZxgz0P5La{X3C1JE94>ImeOpd9pRbd^&kv3O6l8602EA^k6F?vY zy&Y&%OW%s46Ovx2#MpYmy#flq*Uj}8Zn^as)eR$G7_j5xa~tN1NJ)7?Zwzx~qN6G5 z80kn!NDQs4*rPjuU!%JIKL7RS<2Rk({8DF0ng7tB5UxvQ$o+$Zg2D0X2Y2tnST7M6 zo3oY5)Uef7x;R4H>;mtNT(~zhhFfl#45^4hm9|3`K5Cg-^ z*p~nU1EvCMkLib0A#xlrytU=$!&u=zl>cWU^@T3Hyg@=LncUp7+jDl?FSL_{(o38U zXsW_Q*Vi2|kn0qT(~hC_rB=hM?x+zE6BVTKQR&p_j|@L*!Jl~^hx^w?9vO-R*Ad8^ zJ|x7&3A?O60`FwuY&5_*Mn%2XIHzxbPC-npwu%L;&)^U0>EWS>HfPV9n#4h?oQCOR|V_D8Vtx-~7KOi1&<$v>YVLSKX&QGX6ObKM2Xt^*|s- z-ajbPhwKQ}m=VBAz%}sig6* zsee5Gy#k;mISUg2760(~i2ry#+KU>VHD)^zm$J58f$HU+@F&Ng- z4HzPfp_;X;RLGnzx3jlz(NCAvX`X@g1nYcff+4c~6s~8Am(BXX!*al%{Cs@_)6cJ9 z4x-+5baX(M_w>mVJ}N?}x_IEvX1 zQj)dX(=Q&P1_{T*p_IH?`T3o=*ypjaVf4^uGV|vrrPsu%p$M6d16`3pjf?uTb3oEW z7IlNX1t#~c0H`a+P`s)JJ)NDM-GF78bn5a$_=k3BJjn8|%W%0KcXb#FpOIZ}9@(*D4MKKV1os4E3$@ z{BAB=6+m||>##BcXT3ZEvlBrSWkCbt!tx1s5!-2*563V=1GqEFLRuRn&?RK#!m-zzdmf z@p&2JV{g#DfNrhpz5H2`r%tM3&e*3P1)h!?!$)FU-5^3$z~pYYdN6TCY9}VeOj13Q zq@S4Z&KRWPWY^_f5bxO@oa{|NS}VMf`xrP8psK=?le?W?ohcrRVr+5q2T7>jw-wVE zPBr?$oOX&1xfR@mwMEyE_u10^AVGGYi+bQ-WqEcM^eG*iMvouwd|F7gg-?;CMJIA7 zbHJ1iXkcQ{Ptw&fB!f_NSnz z*b*(rur9TpZ29oacDMW(^Cai{hggl2_}8b zZ!nz|qs!1T%gf`TbN?#q1cDLLMhdjKsuA|3*E(3xE#E(6-R@j)o9sza^ zBP*ve{Oz%CD_z_lF9CzvPf0GF3eIIADOER}*X%GMf5*V|_SuIDhsM^r?(~U`nz=ot zASY)OfB7}EzCE7=cl#erETdTw+%l`uG>~iq_7y~IW`{kb>IIDGTwM<+R4;H(f4uF_ z1+zi^ua7uS;00m6{cR3z{TdhWE`{tff?y4lDPg}4!yZ%q z>C-%XZS;eXFc7-nE8`&$VQswKqA-3g67KCBXfXM@NLs__4Lne=fO3uynHtac*QdaS z33}AQ!wA56(pfPOlO$7GFm6)_7|-QUwUZ=+niCKq((yd1r+!w`uuDQkRRv}`@XLd+ zeZm8+_j+*c^N}?SA3YPT1Kb?$^f(lRteZDr_j_1rm$^@^?|v``dX>bm+*2Ij3pdwn z?d&c+xDzAcA&!=}s}#L{eOBtT<_uC81sPEeaGSGw0U%hI$WOYV&J5u43aI-$A6uxaN5H5Zn26j(@_u3~xZ&MQ<*Qfnu&V&& z16uQXjCbtOoDZ1_1zL!vfB*jG2eZv#EPHfR)CU3%-HPy1-jnaFkec=diYo_3ESG_0 z0Cj3YYOzm6bv2Bak7O6J29jV}N=UkZeoErZLU+GE3T43c^hk=%tJ$S9YM8VxQsz>k7gi&y4sg)xaUDt%P1?^^WDR$Q; zBpepiHuk~F_iJ3tahYr)&7O;47rpiL08-O|!0`+{I%lKKUerv0qyyq8QT%1qA})xO z%7ih|_aKc!GnKay0oJUzXFH%GXg&mXukxo4ZBRePQ0BwoU@`BfbC8Z6)6a4s`T5DC zVdGfDJcV2)B-)iMVc_5kK03(NQ3Uty-J^MuJGx6axHjb&#ZNN@i1o@J66uuw9-2`2 zeZU@2%7Kr6I?m$q(@5=+bcyeeg^3^D$zL1!fLypaDA7?hveta_1TLtj3!~6lZqs_LZNa#`{9bcNNcDTOG$9WP zbXt~t1OwfGHm-JF8(PMN8t&b@cSaQ9+1U%=s@v;1L$4gsD6MnowX-zkj1BW&SEgHn zTU2cufni$r;4BP4L#hjog((ep5&+B(^n1_WLj(xwv7AbdaXmr|mhGnExu&O3nx z4;!iv+cv>^d1q9Qb3as%2JPtV%+0|uK&$IhQ6acd4EEOH{gX0bhyoJy9j9xV8V7?9 z3_cjVrW30INh)NO=|hlqoN1a@aiM2-^8|nuw*3M$?f-SH|MM4;_8T6<$Jy5Z)tAHf z|CcZ4-(6b#ynmUr82%?Nt*a1I2uuca@(}g;6flAQuYb5egZsb!;Yp2kAxe1rzX=J! zf3a#QnOK{_m*w#B@Cf~N$NmR5?BT6c2J3Bst{?R zDPP-J_u%W>$}feY;oS~=CkwX>_zpC9s%yrJsIT#dWKR@smPmvLxqWyRv?<@C)x;g9 z>8*BAXqYOV4DZG_F7{tvEX&)SuVkk!Y3k2c=eJu~m};C9cRS-?l>f>n%ULf|BS`7G zMJHSsar99xeNb0ySjE7;9Ry6uhL$XerrGtsgpYiwNKB@_VJMy~4Rt*KW&^evN5`cz$g4 zy{!K5wL~mG4FQoyVqp}YyM`PY)$-1N9qpI1bH8^XU*%5b@8?Ypq9NyY#G~V4*sP9> zyS<(UDHGs*TQoNEyxKL}l!3$6P*ydab`iI~+UBsrpa^f75AUjMq>XbK>7yrmOROZ? z7arYbs1GJdS(TLAJ^i7rP>pk9RU3+-wm>)Y01r2QD(oDgp}_Jp#&6D)-RBl9V?(I@ ziiQP$-gr(U_WAqI=2qS$uR9xb7ZvWy^+XJs*HgRZXGT`N@(KuBL?TJ5t_+vmmGRQnvVJSIM(C*^kkXR#EL1*vb@k*mVBaz_2IkAoVQeG zmdO3(OcyfdP#Jbz_3)9Tx4byy`US(Zxso3=~rR z*Y_%<4j}bX!Fi%L11mC}>Gy{@GFygXuAlrgoU-n{;)A!#IDUg({+Fp#i%f4Y1 z)7)Hioy~VuUp55E+Gi?(H6!~P8z*XiAm3f+6Xl%y7Q=2Q0ltvh;6!_!=ln*#zUz4! zYTa@rZ3BKz^;zNmOD&dhxXZQAO5zx?^RycSuU`sMjYgQ>>bBy`nB!lrp1xZUlue$; z72Vk2DXkZTE5v*nq$nnV)l2iKGR5U(m!k?tn9&>}&<`gun}hVu-buv|H_>vIRR`@K zZ>n;srf*=*^o-)84VMb1e@-mS+)1`A=O+82?RnBO~(PzK@Su3pC| zrt!8)w2|Jyeis)@&!Qu?d47jsGDugRlAp=_K>e|AtC!cWC#+OiPfD0uvx-@QpBNln zy*5#QzjRRl@&g-=%yyWlCMM+5#oynz>^sn?^~W4qdMhSQ z>Q^uovSJ&Tw3N=&E4^b|CzmKjN@%1dnV zl!KN0sjt4{r%;WMNpD}Kh-*H2$yaP9qqH(3?(N#zR6HZJdH7+(`J(6>XZ7DA%nAA} zANqMa_Z6SDPSE)TQ`ij`zu1f>GB}yq_BJfUjA~}MNvNA+lIDDU#F;b+f2_7WdU7RB3X`C_f#o(l?YegypLG6@wye)-+PeNzRk||IU#dnTh(l> zMSUjRam7XY?u*=a8gm+6e2F z&{52-5g^N~CA{^ufjI3U{rHawC!&7aJ2Y3KO0mRazmXQlU!A^_1)*;>PmirH+UmjmM(-GYzkGNq`pQ&i4<8f!HpkdhYvNrP|JH21E9Kbkxmhs)le zZ)RkkK9o8!u3nhqa=?`){YR+JNAYnSy?8q$zFdhl3#sw12z9A2bX3O;HBq~q%9!L- zO5`|(mNi8!++D8M?N-v|r8R>BOtr8gf-ardDk&loY_;v43o?tmCX0N5RWfCS9jEo% zcO?|}DtjGA1IgR33mNP>1re{!36Z0Bwkpk^n(Ms(zBCMrAIx*c2C( zy0wVrlN>zBEPHpKvB2kUCBqkA!nl_AHkYcd-+6t)VyIYOHfr>qZ*i4<_9Uvt16fc| zdeb6`Gjri6|6a;7Deau5`XvlQzZ%EqevYN?StNHQ5+f6c(wfJOL%4|Y@l+|kn_XXg zP3E*6)ECIWVe9MII!6<}50pnbJcm&~dJo*SkiNyuzY>#Y-81MKDIUaq*B|!L1=t&hEnrKd$^SX)2rwQ^=>&%nW@{4ks zW8YzDaMpEinL7z!VvOuKP0bX#Kqt8|7n>gACOD)#uqDfMV|y5(wZ8W;aQj?JQEo;0 z^jPIj-!%6W)7bA*I;R$L%QrLYT$aAog?q%a#2{4J-r(GSo!ier8<&Kr(_#AAW~s*S z-I-YyY0228q|=0Bw-o6S5kfR6vHiUUg)*PXm-%0yg}EqQ_XrIxrIP;%i@uVx8}0 zwdFmK-rE0ZEY0LmvKR1F<;l$tAMgiI{v_wUjK1;;CF<^;PP302ycO3ZWIxh;K;vhT z^4Q*o9HsT4-_)&z<_0BpH=8ofr+05nX7{;RMO_^hUI#wv@HJ&nkq9Mz={ag9iA>Eu z$xU6sIp`t8Y~iBoEilb6#Fr<5zufkgod! zof)h=bBRN+s--2%)}|b}h2*}Kx`do7#P%p8JiSJL{PNS+ui1}B%MnHTM7(cHPGy-+ zraUT~s09LU-E5cV*ss;F%u3z6Vva_y=}omr;rrH6R%VO53%qSk{qd33=L&^H-=6hx zs@yxqtUf56%DeIU!P;XIlTX?r8CfU14*qD{`>!7rBEcY6_N^> znb}2B5lKa4BqP!>;@Bg~sEo3+iV$U|gJW-5S&3us(XnUN{rVhz*L7X@|Nr~_@B4AD z$NlYbU7gPOeBPh;`?bgOWq3Fw#6qFKV5GdYa*wB*K$um8p+XPsLyFUDqT%|&V=NUJ zc@|2srtR50ffd8OR*!C$-pNft<(OwxEU=SuNFyGz9v6x4-q`jO3ggx}vFMmr zI*&?R@_G50dt;inC~K>2WyFgrf}t+xIj-_YL~%i+<-)b9x~vEMIj5b2Mif48JN%#% zO|(^4D83eCs#>fmdF@?lcSD=lbO&e6*s`IfMbw3ENjuyA)$3kn?9$@Mq3o-Z}BB`kqMQ%bnVTilZ8PS%f3sf3l$*c3BfuJQucB-Q~Jqtn@=WR7`5E zc4gsgnTzzbB8)XvKAE<0@Rsgt&fF+^|ACWPbfpTaaV+YchPUX*1DDsWLm2OT%JIon zs;@Tt#ps=L>VRg*aAerlh=tG-Y&m6Cm>q@JuGVQ{OAH1?Hf%N?H5Te@ZE-UnkgJ_oh|no0zt8%(-F1YjU?$<6 zPmlWt>)2N5*b8s!eQuwgpB2gcSaj^lX}ZXNnilexAN559E(r^}57)=#qwR!e^Z3 z`C#;ss4FK<#~ip%GFQ46dSVh66ToG=@`(DgW;{oxNi^R;n_GvK z{WXyQ12j3~TyCJ9As!CNHAZM|S5Lc*WmO?#zbKKCkwmb8U<;*fFGK z$8GZ*(E;|0PtGz@!1$-uyw9IS1O#U5^K?HgLML3+6pP1Gs`%2IkgxxMd)7MM5czoG z8~X&cysyxGp~#U~6{rdi3fIW6!*-Y#0pQ2;7cYE{0W_EkJZq1^XKnn0yk3(Wc(BMu zlNVJ&Be^%ZA<3GJW1*~pZX;I5kyj7h1I{S~I`Goi`;gi?xGkT1v5<-_afwhLwz3K6 zv&%?Lz45WbaFFjierOD3nl9N-M+32NX!@e16@keWfc5dcy?yQ1ujf7<7foMYN~p=# zO>R3oKIn&wj2W#OQ0F>-OP60f2U3%0azAKANQh*L)0K7SP z;DF=AJ0HMq+qsN`l+X0^^u`PQO?g=%5fPY#)?bN#I)EOqE7`iD=VZ2(VcuqKN}S5j;zeOj7uqp@j~UIsg)FeIr5M^ z-|#RO80I9S5 z^AsxChe)kQ7S$^&CIQ`$adG-eN~G{mthDxNE_a8=#{+TJSbMHf=&U|`=uj_o3NiKz z^r(KL7PQ8$_Wph)g&GHnyr5KCi5yk}hwVNUAW0a<&Cx@Nyn-Ge2(kHRb)>3ii*GhFcx zFD0mNa~8)nf*|<)2&UYL85siX?1P+g>weC&om{;d^Nh4`YAh_eH*byfFcJ-? zY7c$>I@8HSu?CH|l_aB(dlDO4vW zCIW0$MczL?bXHWX3b)^wBYn}( z)xH~|B-7}qMtV9rW3ebc`ubdfz~{a-v|acLwua9a;oMKFtFES`re1{!;y2G^(K3kJ zOL33@h}pe+_dtk19~ksw1@~3RjUW$gB_-%5)GMp18W>9H+aso}JD`4e6^3Dwf<@@&uUHv|u$ zIN_4C)Tr^L3E*LaBThomtSBXfy=#Nv&hkp7CkekX*b6s|O?t-xFANcFL|B1p;O=kW zpYX|%kt=Y_@Z!eLyqJ1_go&Pm)`A<$t9iF^5Z2xnT!uWvl2H&R+y-7DdJUn-BfF9Y z-9;hSzwuLCG4@izS?EZUlq~r0;X!Ts=B7)QZbAz*?_Jh8NKQUHG-T5F zCKp%|n7+K0#q{c3;_IAOqT_;w`H@;oPVs(ST@*YZmp&7qB7FbfLfu=PaGOk0d~mGZUY(-4@3J79MvGY zN0oL09b9*E)d)5~S6{VbdKol(x=bXLLIZ5y6&=XULwU+C_T=QY$%E0{{QO~TXFtZ= z`}8zRL#e}yIR)MJ!_;Nr*wab9*!bts`me)!h0uD($4XkOhppK-c*2@G#72{AqO#X6J1|3sY7 zjRX`qkdLSIWZeMr!bylg+Pmxqx)FGC$>^L6=psbfB`YCv4sN`Fs7H`^7!Eb~1q+54 zxW^M=(gS~J#>u)`GccM{QzdOiE;~E_X70S+gkHCmpItzjp;tr0!d8&BZLs4g;^X6? zn9@Kj%34Zo3%K5ovta89DJufP(qV4b%Y_0+!ka(K@ha@F$e|V)rd`2tT82sB@y5f9 zqVG5y4+&Ct2d58}AJ$U4OddP40?pojv!H*Wqg2{uZ4Syztr0bKGIj=?cAKXdX4Xz3 z#e+f6=0lJw^R^iGS?B(Z!Ncw_L=h~%XWQFu{+GN6Mu0(UFnq2LfF1GiLr|P!xLHQZ zc1*^Jc6S?lW+qV#fQ0C{fyclqqTal5;0r}Wh=A1w;I7fp(?f;Bmj{A*G02;0_Ravs zSY@cb&~^|JJz!xx-?}uKZ#&sKGlPP2Z$V5G@%*hcOy95Xm|{Dy*i0pI9OexPvcxYL z>stMi2|9t@*X#9DV05wh2mLv%VQ{k^_nj@M zsfmzyoK$B-Fo}tS4cVfeWmOD*NJ;5}_Mn|}94~csba=$vX3Ef5U8w(WH2DZ<-sZUO z?h##p%>bBR!*Acd1-*WK;t^EJEhEK$=cT0(r8)s*4Eq>gnxyonKK&Q@L@$JZJZr`3 zoiC+jvscKCNC$=%JjOl3 z__;3wcwfNEr2mce-)z%|UjYogdp&xva4g8M{H!c%z-hNES`Pb>Z9QBK7PM3CiPbBpWb`4y1>wF;6B&ejhn(~Ixlnz4rxF$95~&kF=8qTn40aEbPEXYxV0v{1ul z<*PexFD1(X!T{N>EwW@(Sci9Ct6&4HEn+QIvkB!INH)hzjeaG!c2dQ9Z@b0R3(iiUj+JuORQi z4XW|2J|C24-9kw6Viulo0>>v~dmpL>5?)KmM1E{i8!ejJ48D?nr_kXnD%oY=fXYxl zYISwBWNIP&{d;6AAVx!WZXd|PW;^U=BnWISHix}57-xT+f`S5q%Q2iY=qeO)So+Bo z>25rfTuz5IlkZ+ho}d97_9DuJ;Dm!735=C)j*;@gaqnK`j#_p7AIpL7AeZsO6=idJ z{r&=CwBrU3fEfl-*M}2P0WP38NMSuas_Wo51t1>~*8N-I!0iz04t~^-b%nr%0DI0x zpg1)HCpOSX9&T-I1ymZx@JxGM-53#iSxXd(-V1PDH$W}| zGH@k47HpX`-SpqZNJ`2i#5blpGfJj5ZAD=>VK2%xvi@BFoL)65C@6?^81jRr2WYj` z0l9Ouf2|r~Lf+A_s>wW7NqKo%+qRA7rkBLfdNWgH^*2H4oNFnofB(2mYtz=gr@w`@ zqRoH!Ld4AIq^$SCj{`KZSBJTar=zLMj~&9`EWUt`meXaCrIo&_ojO-C{V?Ukl93j3 z84Ya8LV@o4KP`V0!Scs{1$1E8d;fL|dpoJw;CC)y9So)zVR+V;5b_NE`?>ul4~YN3 zGXh&cxaclw_msdKxdxAY8i^4hq*pfrrU!vhAR@JU@Z~f>I{)~#0lY);(lK{_D_2I^V=9BwlpN5HRtE)HmU_u=68O`}PKo$|xw_W((l{<-cy7e}*uZMXo0;liW-`6z$8wtF3; ze>KdbotT&a>xvx<(U~f=|E0Fp))OeStu3$iXMoP-mz6Dk|9;iDNU}MHhztY>=o4zymJ2VPnfItT4F-Ix9 zp~2DYuD13YfU=&2-pJICAA_sGc!H_p3;bD4fRxGb(f*ICKS5=D_`q0=&&|!v#(`y( zn05UZKwbc3zR1Xut)%V~VQ4w&=;&x&`Cp^(Q*up4$NF-lwQgd@k9>q6HbZ#Z(i`So-*BbxSq1zxnnRL#A)P}QuWxM^sN+~ntBEX zE#F9~EYR)g!N2^>BQCCq7(+J{0RFYQvr|)g-$}{)BFsR@1bJaxpqrJfgs{M$$Nhf~ zEh4h$U#RPEJoM+{{s*-955fE&82mpl;XnENFGhit?CK8?5d7l1JN27U{^X&5WpLm$ z5D)|&`rD&a;uD^O0FKuiFw6y{|CI8+xc>qH)(w2ltq8^YYrdKD!C-c4%mwOe8ql_bBOG%yVTS5rPtwk44#I|HZaTRL)4G zd@Kl=62-(nMf7fP<_{5l4aSO(BUz0z2TvPnvxjr2b8M4^gXX`Exaz??BX;3zuoK6jCY{o!!a(rD&D3AN zoO)!3pufr1&d$&0vYedUWd6v;Y)M>nG)3eq*;e*oBa zhW~Ala8wWNVG-i^{z{tuwdThT0Ie>^bG&Ha^~#oJtc;9W&=q(;PzIeKXH;t`bVMGS03-nO9F&4f4g_GKc|^11*DXE0 z*w3RdDN@F9;XNaG+aiGO0zrhs(sLe5ciw{K4MX3K=s8zu-_XekJ_p3Jd~+e)PrRKsoxud%^|u>2<(qiv>`Qk4P-As?h=sS_ zgAND4=N~RD^|+cS>Ao#(aDaW}w8>?)BnaW3EByS~7W!UV!>}_2$~GI%>3F<1bp}^r zV_D5yM!(YKYHz_zDqj8KW2sN6Y}$e$c<#Ql4aWatI`Rc*vTOhT9a=g12d#XK9lEv z=iSeR9(PGDC`4R28FK5}t#A=O867hpb2ObWjVNx|TI$P{uDu6MOmx!Cw6)ALYkH1U zE{8E#H6Bg6{wBcWxl$SVz_S-~J2RWx#ZpfOKO{6zG(SEU-CwvURJb@8GrrYm>h1W@ z{6C#4GdBd&A&Ua2-H`AOtA}6)Ju@>iz$-B^MTUnb)Bjpqt3BdXMg{XAZHb6hu0V(x zQhSjqU|Kj8$wCwkdxn#9y!;vY)ol=&=I=5xEUm52=Ic)T!} z;mTuYb#-dOXJC;-W2Jd?SQtH2OxVYSgoHrKD>W-FF0RagjGSC2&x(B#F2V`@YRgzx zXat4cz~B^Yfdj;B*4l0%YIt;NU&MguZ!) zky`4aNWkvQ&0fs!eIT;nz%CijA<1dw%+V#yYJ5@2_M(sU(KH;i-Bu1ioA3>o2ucpl zhZZl#?}w|4zJA*gD&K4=C14jtWYSqf95DF3iO8|0?P|I>#bsLiDTVOoY-5dHE z%5y0p3$oyVnwbw{IA`5frMkSKLPz4D?+Su7@1_WdkmvMC5cC@eI76w4wUp;x2ntMF zgPpkJoO^wQSJ+fEm!F%PS`KN1=Y=|t$7eIO$8(xx+gu)Y)%jK!1C-P}WCb3e7@EbQ zVB+oD^J%9^pFxs|o3nm#FTTdOZ@Zja;KTgp`l7K(dNtfPyvw>`hdswVfRvc2XDf@#rg^IT-ABr@#h#jKSzQ zja#lZj06XRAS4(u1hflulP1i0n;AlOkVfzNB|U$+?X~;r1>Gcf)>@R<2GL0T(h`SM zo0tRsUvEGWiZh|wa13%Lcbagy8qu|dx{d1(CDxNra*&CUwuk&^leNv7xf z-$MEkGl*uAo3EsS;s#_}Dt2IOk6k~br6Y%-0aPiZS%!~tTzU!fVd>=T@!iYbs$$Ik z%h;`fGA};u&j`B0r~$h$`i?J-nihhBdVx6OuW6|^qiFoHhP5-0P6!Tqq|bp-C?Jpl zEuPZ5^$wq;EIUyb8HJ2|H$T~IK!JebEPw|ruB^mDUg3>{fNsHODDDYcTq%L`H!pn9 zaw4sn0Rt_~TL3%u%NC~202ER2!dIRX?xQQ(7zIvZ58Tln{OXu{I1z?;POvZ>MLOR1 zn|Y-M&{o+K7R!~JVX?7DTs$C8!zvY68aJiXrS;d{QgJs4utIQ-p}!fcxL?fAKC zSyr>Xs&JBfkgz5p0!o_cj#(6}#CyPdi-NYY7^xbG<)4np@xf*zEiH8-+8FF->#WA3 z`nbII9H!Nu(N5jtby{964=eyVb9$PQ!W+Bl^Q}pq5NEByua@F>w(2>54AsjvrPwQ@ zFq=e?SpS}RXfkfABZ{FwSyG@dgA&UiCXJ4`L7(hH;W?xL<)~OgMFq$4;{(vn{katn zV9iNRiKZ0d5c9i$!u@dKobCSQrFh04}BuFD929J34+IfFkT6 zDFQwr+z1g-04_CMpu3oP3IvQzC|41n7XZt=I;HP2|LoXtBxoe@ws85o4h(=09eXVA zx8Coz@o1e6iXZ?e`;%Saw;sLefE~ce1DFvT!PK+v6NxVY_)wWsfpeG$WoZ+~Cs+2i z?*s!z${+X0MpY&)cpb`rz+C`7N#Za5HTBW3S9`ktm<}aZcYgF|x{(8(()vNkhi$mj zm04Yv)R(P`JtwxrOV<5WdX0}F<13oyhr)YcR=a;R!bGVc(U_M*p_+QH`ki5*v0WDQ65HgpxMA~TI5|zhlTnjh zA9ys6 z`hXy-dFxhPM)2eoj5oLl$D{x}64Q(qlStOHw$94aP3nPq5z(=5UU1i^1_$4@O->ch zrHYnqah-v{5ZpuIDk@k($wSCx$_Is~17h83wZo2y5*Jp|*}u(7w17r(A?vhMz;STv9 zQOyLfxPxS5msM52+%1ND8j|r03Ia_F*m1u!)3at4ja0k#`p72t!8`#V1n1=`W5-9i zOgPj%7}JIPq{?XxMa5@&8O_bjo#|ie>hi4yJr^7=Uc9))gDb(|$D^H~ zlqz)dEk%4nLb6&MzmKY;n>CDI@$}ql_gz}TDK*gjCe1du@O3x!zuf-bshTAY!+$L; zEn!vx(`mF0apCC_23w)?oWqqUh9@9EK3KnwESN^ZA|qC9q4*v= z+D5eq@*$?Nj;GI@xtg!*hCOzos$l3INO%>njodl3$Ftu}rbnV@{(agz-i2y;=sS6CC z7}Ni5JCvmsf5<^qW`2%FO&Z3ctKa#Np)Z%ul3Na*_z2Ovv>i~&fE9CeigZ-#E&bPw zApM)u#6KQ32pIkBFVTM#dQ6~Q{^8927z+6FGN(WWrjEN|>S;d%FAFIaPJX2vK}$&_ z$L6^L?yR{qNHHk3xf8oNlNhddLk`J{;*~}iQfThg@6p`mheF#|p~eq8g!gx)!c5`Z zB+=Eq2>s1`LNzxwc9@63&EtE-TT1reRA$13BtndhtPf@=KQ zBx0G7uQ}eH6ODO+admMS>AL=mDKeUYmi7Z%2=^)|)02xZQsd4t9-bVaoM1jPSqL!1_~=HD~T`w?1|s)qVDaxKHiSK z$C=QGdxl_wW!11Ea2Nmx;jxFfeM5DW6cmGEWGh6CppN?&Sb5pk@5%rSzO@^O3lji- zjM*&s&QmB}1O$luQT@4s#W)^XC{b3eK2(2fqbG$>e(c|dw>sLB*y^f(&cB+|!gmabZ_b z5LrpZP(+au{gw#eSx7RC_~D*R_)j3g6W3Axtp=dmo{u?&Kw5j%W=8hHi6V-MKF zjzef75GpaIHMHdC2~yHAWcTx?u|0@-ufY>};9haYP*Aae^#Dbu#^6pMWj65kq|py) z!mk?>w2n*0Cj?)BoDso0S$H43hwvo-diOvjrWR@zf}kUsK&sbB5!=uat&&BAY-C={ zAD>&W5)t+WS-)dz9TEHrRx_^d{gw!!U`oQ*;Y+Z6O=If3gw-KMOS|6D|IYm*aU9_8 z!KgU!$t5JZY#hPS1=N{0;+C;*-lXy^&Ci1q0wwi8C%X@VbuB1@aCUNAq)O8B=Ld`Q zz(>f?wS(aVmc{EPzm_J$P^-(!5b8}LJg+m_8E|f(+J>1kG9?$F+~xT&5dH@PxD>zg zb7g613GhEeRUuCt7?{zI2XrAQ2I1wk0M!MO%=V%Z=lwVoB)9TTVd5n1u6Bqz6}dqq zEmy4hfk=~}FbtA;WZ!F4tzJD9fB#WV%u7DvlfgR7QZvIZ6?y)YIhZsisY@IE8`rhLGQny22trQtR*UHxddB z5ASs1yTx8Z+c*f;{TZ;<`1LBK_dvwt**vFDJ@dDLj)4u7v(;ck__NNn(FHJ@~`uon3~q# z%3~q2!YbGcS+G{^MX2LtaK7v4*HD;P5mE-=SrSl%)r++sM(h#@f?_tu5o!V*1z*foQ;&XK%{)K^ErCc6n~3*dMf7PyM3%?5bXQnnL<55B#9XX1V6s5fp81Ol2`di$X6 z9BNQtywQc2;rlQ_33lrObqw6Vv^jRA(2lcp|Wcm=GNwHNd9qc zC3|OETicR2a4mMP2=d@KSN!AC7=b(4@4?!if!f9e!0aKzwAE3uz!6BqNy>Rd4$qGe1PtUYP>A~)@Gfz4VYQU%oJQl2{N`T7J>I?E!DyfPh*RLL9f7} z+?esPu}g}Iz^TvoBX7@k=Y9kTDF6;%kOAN*0F?T31FP@mu${9SfQjs(Pgqbud@&TB z@xkl`I-#a8pMn8Y2V_>>zk!YqN|19GecmGHu?^$I0vOK@LEVsA9w>mfATVLMPOAwr znwN;k4q|9})4nb?Llr9&QCWjvZvmMWBb>hl?l=Na6$K+zyI;O|LH^ezXNHG^!^6SZ z6&=G9(UM;r7eT?W5KA!1VknT^0P0w5mJ@J-a;OoRpx^tTI=sSU(vD^8K%{8A!u5;e z6DZR~!q!Lj$imc-b=jqHilbr_7-HnK?_xj)YRgD{F+xb__ldwErMsHI8d02*z+7-i zz=>*%6y{tWpOa-GY~TY7#ayK`hx~5qTrYkjVORo$fHhWti-M)1TER*26o9gQCI;R&G7jr)XB;X?S*{DFV z@MC8g9)c4J)Yqjp32^T)aW0|yiivp|n6Pj2i?&0p!CLE4wM7s8i}0<%FK4I_^xdS9 zZ>W z;jFgrg!eEb&-b(2YS&jH2bU)-UgMT0P;aihq?^7Q*wn`=a7p+?19or)Fox4it^io) z#=(?CxJRTaNd&?)F(5+!9)0W$S9;jM#+~wyb)(sL1B}USbvN(w^9yo#L0K1+%0aW3 zxVSjrDuRVuz|)2yc9lvz+tQVcJ6bn3NH|$SZ1IVzH^?hQ&myvk5~IP3XjMrj2q*$e zQH88@z>L!k3utwKTFqGGnC>60D(A-CTO{R$119~`;Q;Mk2Fzr^3Y4|$c#tA41fuZ? z<^UoWA-vW`uxQ}SL5>Wg#SVL@dc(V5*1&HNE8-8EXWuiVS_`pxhzP&QblkNR!~%iq zCyWTD0rDyQbmR&r@vfPLe3=mD;D%r);bxhR1i^r^uheK9Lg%gKL1<%eSRQqVAe2y~ z*l)V`&1He25Ywk;#-$OKuxtE4#0?$k|4K|1 z>>O~Y&+li3Ujp|ae?XuiMS>U(F2dcBw}6%j*4gd?Q9eIbMlK+0gk!YA7D<~Ntx5L; z9zj;nyB<5#Qg@wjq=etYBPH89Lu?Mxap%vU2PnFDjP8Je%_I<9^@0!sxNskyLGTx9UzT=P z8=qr}fmw3kK7iN7gii&h4Zt$x{f!OXe=V7fuEfWm`0MijV)%5XGXq{Xc>y%#<|rTn z+&o6b&@g_qJ_WJ^I>j!IX{whv2qFL6?_*5<)daWZqpM*3Y2ib%+x_W=pMS7T1^9!d z)OSm$;X}zXOF(YPr)x7A>+E0ZHWOJn>}9|3(2BNLD4>GD`Xk|g1q6w zM;PaE9682Y?2rFUD+s|}0cH9&$@ca+hy@nMj0Lww0B!w#o07m;AjZMW(vyR7gw?KN z1pfgHaLaE5n;n!L!q-2~AZm&dm<#9^vE~1uCJ+<5mIA@4;6fAzLd0tGz5zgw6G&?! zK?eYVl7MUhE1W>Pz;JMnWMHEU*CEZ37o+4pAd^4B-j^5>N{RjS@lgmwibIv-R7ilhp4!UcaNq=lJD7pVBAGeoeL%@#&Bi=W`taANg=R`tI zJ`P5C0os21xw@C=4k#?R{YmRxwU8zt7Jf1{9=CQDL0J~Ih(^5iO>a>$eT)J0@S3Ws z6l-m5Z5Nk9bjP=M3ZU%Mt6_fUkKBivmo8Ncq`d?p0bvxM!-nZhcxb%=jyrP1aB9 zW%oY=8h|z?E4vEvjaLBb_`_6CelP;G7i%9U=N`-TX%IqoV4iCXLkR?!r4T+iLayb9 z!HBc>gh1H~daAvyqT)Wlhr$?{TjYmGi0gVn015YF8Tcf|rcgN>cXAyd9A7nD0|ycY zenwM3lmM4nwp-DB{sIGOoR%KIWNarO|#q6+!?`62B_PZ;%RWIep4S-x+t-mU=9Y@<(+ z7zTQJa|X5ObAZR%oqCJsbv`%bN+wX3hHe~E05j4v+Z)2NU5!ZL3gqGdIT>uDultY@ zPVg{XXU+gxYb(?(8;#|IshpiHB$V|U>2@+a(hDe|ALFImw>P2C>dIJBgh~>G+(*a9 zm2Dv~8ZrTsB%@xvx*+uZcuiSDgGyH$>{d)zSatn3D+M^BBtYPuoLtY01hP?mBXWg) zK>$XK>N+|~09PE=dSG=L5>+M*5wBk#v73iLAS8|<%qyZ6!gNz`a0oQy3X9X#b<|y&mUi<#gJx@T?QU3#t(<9+A1fQX&p%7d+$ruy>N9Q)t z0sc0n68Oe2ea)$25u7r}4+}%)Tc_xi_RcsN5z(RgU(3@8@$sKufHHve0>q=-fUUF_ ze%udy1amb=pz;hrVrNA8!C_mTdo;1~KuK{d`Okr-Z~hn9dPYY5JLb6zR88yZa{AzljZJQ(P9 z*}!QJxXkT@!2724fuLy7Qme9g9mEAgamYj+Z8;v4CZ{n?x?T}8BV!&UMFGD;)X>4h{&m8*9%@O{Gdkf{%-2`?9s~-06Z`vU$F4#5rrj zngABySmpPyg#jz9mtjf(EJ?eFR7gzh3#ekm*$*DptBvg~I4CMPR9C0Ap z`!*l5l(#zRi=C}&Z276;qxba&U#|V**#n7pLe2<;y|Jcq6wkMxc0cUa7p+qkk$9GY zi&6NU{Ey0m4PGhq+f18RmE74LOuFYrx3M&dqRu@SytaRwSM?Ot!Qz>Ao%zSSXmVwa zo!9%@E>~_Rn`n&Eyw7!?ao91p+RxQ|a)N~9o2r~qCB8C5I8D^;S4v~6$djS%r($aj z4=O$iO&6GpESJU1vuV6s(|kfzZa=LmE|GHly-^A+$EnX#q1TCe1CE$DMLv4twD|K& zLu&L%#prA;&OVVnq-IBoy%WkWuZ7=|V!y{^?JSfvMRSft;k}7hfyH zv_EZl&2D-iP{~Aw#E6%4F*Mi@ zuSpZk=L|o{?|c&ZcuSp+Q{pfD>2|lcg zK?R!TWPNLh52TFBEve_OY6$p3NoUWj7?pEl%P(~B0?&Lb*Y(ZveS%J(`Q7l{zBz&~ zo#XZ}PP{SIUO)URn)Z<{3ymwy`&Q0KN{RB4z5W~}dJ$jt)7rnEDzG@b&o78w!>l`w z?CSHNhd%85+bhkpNnG^|%(`z1YwvRTaT&h~v5ll=RJfro$cY}wfDzEp7y%9#ax z-A%q%4vKv9b&alE%7y+JEh;qhlu5cfcIvic-(+3|sa5gsjefl2)Jx>Cv1d-Q;gqR5 zS2Z>`y%ME^^FpM9~VJ7bo|0z?Gz{ zo{MXX^WD3{LlQkRRi1nw4}FX}e{%asjRx6N*AP1~>6f4HbV6~&s~Li9SbkZD_G?7n zy%rAiU(r0bHd4&CaW>@j@;)R|Cx$5MaSWw% z>wGRVd%RPsUtc&qE+Wr6z|UlR9;?Cg`6C^Xnd)R$d4c?+M^!{3rf)eX#E6Sble%wH z%1TDGPrYhNb~wSZy7M-c_2Sk(^~3BWB_{c0e0YNoA?PLN`niFCe?Q2iqrko zckhZi61XJNG^elml%==sGmJ0&?1@cY@;*P~_+_7M&P-W^*vHcWlc#kbd&?Op^=_Yu zKCe$?m7HNh?Dtl`TaK}MV#w^Cg+5m%ot{rkb}W@;EappHkPXi0ho1o5gkIN%C)2m| z{+>|9jR9su1A{56lgq>B$=Dys@pGsA4F7C->p<^VbMc*nAA-EJ6(f5?$0F8Tx1CKK zbt#PZF|$s158Ywr)Yx#Ln5X&m?y?zg`OU{ei7TE>mH}>T_r$AY2J80exe6`ZWFE}1 z%91SDsw+A+c3ycxie|R%YI)bUtJXE9G1T;pu=fuR${_!u+^?$rPE+H-?_Fq-< z{+RtY+gy)|2avr!bLzFwsgqCrq3HAVF+qb$u^$s8lOZ$wd$`Sl`1h#G7bweLoTPFX zXK8koYu<5h+K7$Gah225?_7Pn_2sN=$2XJk&z?HxM+O9Gr8r41lO0b>O|3n!*W-N8 zvEx(>vK$GNw4+4pIswfeNUbl)4+_3>zjIkip_J>h3du|Pqp9Whh)yw(5^;)q1grT5 z>yz!f<2CV& z1xNM5-T@NDuDzd+U-r%6sXRD`HTGcsLA{{)@Yvc*A{HI41+`~lJ z+UI={n^*ejcoUH=+T%<7!SgJ8o@|+YT1YMhS3-Q@p8Gj3KEA;K zGQkGogE@P&6j+WE*-6k*hDc5AC!)yt^@t38zPx4IKvS@NkHr(QwFFzi^Qt#!h%VW$ zX}VulHs#v;Y~;K=i`y#MCJTv-$(@K$k)9Uny$b9wS%H(-&RZ*fd}hz)v7Z)abC^6OV!=dTm#1rf<%hy;j+_Ic##bnkWN{5F67 z{PuO5ZTbY~xq10gYNCg>N2%C8i0<2ZGW%>FR-TBMVsFDdUrGOT+s-+)B0|3tbRyI7s<;ZmniBkcZ?e&(YKe<~ds( z3+^E>zs}x+K}wv#BjyFezJY!7WJGH%q;Wd|i*W}wd$-tb91>j0nA)aOr#3l6x~V#k zC0|`nX=usbBt!JC5YrR_i+)JF{Fnn%g^; ziZ=X|lmz@q(3y!*+$W}>OYc0J@7M{d6#?G>ik;*mdx)r> zn9y$O=S#HIMepoysSDcibRjxEb$Cs`BFEMmeMxQg@b?7H4e{;aNs=dd3cT~C$pc~K z89&YSb7M4>Z(y@51D+eOy^lR=l@&<;W+?ubQBC9R;oKad@sRov6K9E06})8o`{<^e z@T9;(vA&iL$GPb2wz@~SZ+9xM^~Ux^s?13yIEpQ29^g=uyEEl?-S07*H_4-u>YTB8 zq1WQXh81SVb7h1Npj3Yx>i_=vdLzA;WK>}dZS&*r$L@Q5 zPk33O(cT)z{o=F!Kn?a5bs7c5A%3dWRb^XD^t+jIlHz)Z<sh8yTF3Qoj`~q5Z$>af@hm-A84cT8xIjuz4QelDw_iAaHY7(ejK~ z@p`*(aUeREvdqF!FGi)1z5Y^cUH0^SmXQADfuLNgug9cQnvG8end6c;ZWkV3ORehn zh=|%K<`K!gvAQR7dzwh~)nH0EXY;jfb!RMXTeQZlle}+EetkUJ>uK+FuWxh@=bS=} zvG%o)&&g54Qz`bL8>xO@Jva($$J0!sIA*uMidd`A-X%L9zGZ^p7`i30UrBi_2eUX` zbdOW*jNtGm!K)oM^#Xy!wQ?&JIKjMmU1j2U{#EIWRl&AB=4-x^YCnbimCBulS;Sn3 z*IoBT80H9|+@I&Z|FFR`f9|U1rS#mqqe*Y>)R7c*cP-TEh+W?2r|I>MKPv7fjd=Sh z*6v@K!A-(7J%>-W9i!;>3-mV+zAJ%h@-vG3@GiE8(}IWYQ0XX@%cAJx*$ABXn<*}h zr9Cm~Sf<{zD!!hdEr+?8i^@mqw@dFudn;_2+HQnI96fZ0sh4M(hu*H&3(Vq^(pna#3{~XfiFD5ms^f_C;T_!fZ8Ls5WV-tcX(e#mbmUqEIHr z5&Ov2?-`qNc+|abPZFtVYWe4t()N&))Z`zMHB047MBlfPrTG$f_`s02t4pWTS6ZUt zH$oM&3Fv|OcAP}Fw;4;C?YB3I3MW(hvJ9P^I7?JpeQZPy24q%Jyf?o5>_H7LN4{KD zb@zC&pntZn+RmUv&r9;tjFe+%g9|Xl%FnN5TXo1e)j5`mi7822j}MA({nAcn-zTjx zb|y!96NSb82wMJJj#cK6q+#i5jm67Qm$I+ElldSU}mkE8)a>1aY&48U%-8nk= zRpQ*uSqt{k)Il?^l1w@^w&H6;HQEm|%$2!P(@zyJcJ`AZe ze|xkRdYXn^+(aOPwF^02q(_(Fy1x@N;ZFW2CT$s-9} zSsY#m)ZYw9I$K_!8N2VC`8AWRqg*kyiSv+ZM)RKcH;poT<{|{TY#!^;OU^2Ff0}*v z2|r%Ed{C3A|Ng=0pOtJvwMXu*B31NuP8Ne$5f>tF96D9z?xgzM1O0zehl8+L`07 zqwBe^&-cAx(;Sx`CdPD7%Xu))yx*wo9d)i4O*ppi7b;2fnrt`oGhw;Cyo1wAER>`y z-O5!y%l+qE7#_dS7y3bWM?>&s`b>?D{V7Maso@g#nx>$6-U`p3+>eWri(V#$?Z3L# zTk6GvEl=v>b@n_Y`c)$qL$m6@-x?6!&)3s^CEFwd_tM8atfPJCEQ328E9Hmpg&E4L zSDEi+ZK=zz6)G_+P-Rz~G_5@57q`Q+c48)8%O&JQHxq}UTy9#`&paVUABP@o7ESj_ z;V~yO)s*`E59WW`eU=d{ex34s_32!N!=&O?I8&hq^NKN@LQ%LeeZK=mw*RH`{2b^J z!|dRd-0fVoL%$?%4Rs%FS|rh%PP!Rq@`?DS0t>$#?E{i~!{V$=MO3}p+c^DNgDan& zHIO+7iuZoN9AJ6-_2i@bFS>Ii4Aj$JbNii9-+sZLe9@JR^g5M>gMrF?(+sCX^F{9= zw0kepTcI&sAG3$D_Q|1lwWSYlYKzCcIlq7ZfYj~kddC+hH=d^IdyBGKtu`M*hxTjq zkelcBC-;f2d@y|?LvLC49Y=Z7{H=?Pb)Y{gsGIdz^uvoY`GSTq+QVwEg&w8V7CbPz z#{E3ys(h17S^1BZ#cQY3JvHtadr1nTea>#wC##33Wv_-f&CzK+h!#~Fo-z}4R3qQC z<>I~R;$fIjxN@?etLdU>??Q*=TAic&vlb2VQ`bsrJ4HD(Td3T1ntyk zFAdahNo2hz{ofdSrzXw10L(IN+qP{xD{b3ZY1=m5v~AnADs9`g`sA&&osAy$bHFagMyz{k)<%=wI!FN^S|%fk$t^nt(FdcYFRN0BSkO55wg7OdY_R@y6#HSNl3`RTe#A@C%@;19G8`;}=HU`aJ zKFgI~#S6?%O2!k_iVyEAE~itek@6^8m~h%id}GqsMP2qqyhX^pLxME^A*frdno>sqyON?juUm-i(R?~Ix&!at1Z>mTSBW$ zOLGH`Z6YinS;5GDa>Pq4)2V}Fv_gDl%~V20bSD#y{L~hX0&E00A_@1;vegAEk)I%5 zgBgi+9p5WowNbL(8x5CT!c@#_cKWuQb+d-LNz1SUXieE}fi$5^0Ri{4zGDykpihT* zk#9P(Z?hx!u1Z&KmYmSmxmN?G0K}m3=94PM#Fa=_@KDy#xS!OQ>^q!Rdcm!Ki8W?) zzYOc!iqXO2m<(>qF_fb}7=j;Vj7 zJD3ozukevD{^gx$rvIU$!cr9KRF<~Q1+*{_W4*JX+tC#y0j)^?cPt|Nc%Q8+J!eO? zT*_*2h3L7(ShI2g?^K#Jw5|WnMG}e(6vPod<%E4&l%)rT>_B=Q)&21U| zYSnepa9>2SNov0hn@P^-zY=AUjZdQ_*a}Spu3S6n<1`SL56!x!RPcHw8P;*8vUIk% z!3B}2WbI82^?C5vmX9fFoc`2h@o{SkCXM>3`(17zue%t#i^d?+=Vm&0Fwsf#&bNGb{aMDH?G}1d*{=3>;hD!4Kg|iOIB{ zuXf~s2XTdF0@{c@?|bzD~X!~?+b1SDx{;{G$%gJVoK(P`+oqJDKEQl3?TNJ+{< z-rXir`)7b`ezM2yvnNHr3jLKqTt{m@Fh8lDB-sPiB0%1!Z0H>}gC>&l6)XBnQb7n)#_)^v5BXuTYevX~MdQ|&@Gtd1u|2`G`5k^rBgvJ6_yL-5xfzm#?z4l!zeSce*&&3k_R&8v zjyWZDQZII^mI77JB@UNWL4a(^#ldT8+N^Ocu@s_UR(VGrtf%OkLZ2mWPgdYl+7Ktl z>n-34xuGMh?u9<5{NbRc{c0qY#Z>}gk+-$z4#dI)f`JdB=$tD56D_C<-^6}Kk+W`) z8mcQ7eUWb!`|do+45@-Zfwre|5w~4Kk?*qstZ)+*Jb? z0X+sGcP!tfp7G&tP)t}ePJE-|(7}FcJKeVe{o0$>LesXI_s2-~p$GK!mW(|)Nb05u zxCz~bx2XUl%9x((h?$t?S9mg_EDUQcY#(LIPeh%j&PL)dpU_rHKa?NEJ9xmV`} za%3Wd&@8BG$#bpURsI|@`)Sd|*yyldY^MSbjiKNZSZ1HE!tenJHEY>B!q0!pU09o_ zM)RN8nh%eDez_oGUmLSfr3u<$4xh=f@hF$=&m$FyhHAg{H%DWpPogbIw^d6f(UmQf zR$w7iDT;v&IEs^s>91vx+iuU4bW`$qoRLRKiXIae-09$jH!b4yzH5ojuNF}=tsi3c zs1dd6%9W$b;GCjlz7kXqG0^J#vV^@zuAI>qG^-uDHIfRdsaak8-mc5TKO9VKkH!mmBCqM(bDXeenIF^)g%+bn zcZI3uiNi{TD>}vLyf`nFscCeY^NGt3jzs&LEw1<|kiP_OOpcT1Z{wL?Hixr14D;s2 zM#{Di5e!TK2HD}Jc1?SlIP;-o7w=--0RI;Pp~n|j3jIL3U5J|CUgz?0{@g6*Wnxwu z)SP;@-P4L%wPuZjOoBHz+JU?#SPj(gPAKJ`^(uO`hFyHs zj$)YoJUTDhxtB&~E=ih7bM8VDjb`Yy6e}{J@IKxCRYtZr0au@rz9HfYoq!u9P(9n- zPYRuqs?md5-Ao_zt}~rzIdvx`dsVb&*r|IkBx%C&g8Tf=8&YMlx)Jyy;{a#Ad%F0z z6bAJ;mNTZ%o@R@mZSaOX%4|-{ddq^Z9JLWW60N?FD&kUt#{LZNZ}QMnKbjf5gZxhM z7sgBHjgy5CtiUgMq?{*_2NdLJ5)d#Dwas=m{n&+h4Nk-Y?B9W*f}7brg4>^zH;d^G zVN^4_k^0zxM!t-7_kUewz$$kpbH?BKgrq}?1%cilwl?9K)RVUxJbrTLh8@1X!7eb% z6_#!AN6xvM{HoH1C<~l1XSOol@S1JZwAC67DA6#8BdVhl?Tn5i-y?5bt(gfz`oQnb zxYaoaX1aR!9$ycfpb&Q5gn@Hm8a>yG ze=>*xa6(b!B@b?%L8U1nl%SM)>uf~Js9Zht#{}O%53bAIBx0w``Pzocgkcvtn|>@Ug%P#ox0$N zMI*;47VMb6<>Y1BUj8Lxzb8`>GhWjSg^ONx*r;x=5Jfp{d5;BZ;zo~`zQ;TKD5U5< z@f4KZJQcGLVFZz<03%T!UWMmZ^*hN!1~WqTCt41|yPUpu<)w3DsMucY=kav-?_38- zVr*dBozCT^<{6Fx2g6K*+2l(tH0v7*WyUR|e8QN1Um8-?C}imv{0gxr9F(pG()$o9;unf-#q>Wp?N_;xOE$Q zgwuA?JjPFa4W0AkABP1g?34{(>FTta`EyW5F$Z&eMhudeF($+t$CS;6Y(M8r2vfvJvl}Yt2G!C^)aV$#HPVFk{OlVHpwcD5o%sK-g(0Pu|E7h(=L#s1J zB=xpU&3R`xXecJ8R<7`Z#|v9l331Fc(1=C^+fKeXzg)dNl*G;@tbWcBzjX5Rkn=SX zMB6^0^Crb@X&6ayw<=S6e;bPpH!C}|`*V`J;bbjER)bj>80(mRRyJfT^{hE`N_d~} z8GZHjR{-5C)H=jFm&k4!DD`k_udNzJuF`c$SdPgHW9z652YX_N1~^N~YwOL{Kbt}B z<9&`*LGSjn^jUqQJ&Ybob{Gk!CMyb6GEdqL#L>=OewZltHBCYX^6ha5g+&nFuCdLR z9fs}>^NE!1*7%4V}%iMNUc8A`Aj*M>JZk#dCC{5>lle-_*6% z<02UPBt2-KI&yOH#|DQ@+POlT=-aS-3)CRbbAaa3y-X2K_6l+;^_9l?HnXIPO?#Q! zU+yky)yWgkDPLMd2|=#c#4K-|jMtGZ=7mDAa0H>UL)*<%+iu#H;fu3)DDtHByfVbG zBbUfdX80ID{6*MRm;WhP#_^geu|2on)!eozMHP^~eNfdwo&hBD8P3?oaE|$W@dmw6 zH|QTa{H&sdA;Pey_S(6gFH@&e{gPs*r8d*6Tbd=_AcjB6G#eaiLB*LcYKMHHAdmI79Ak|Y z3c}WnGb}CDt*|#0o7vM_YcF%6gco|~ap`}rW|v%dtLnRJ(ELmVA}=sN*>8H9$L8cB zeBp>Z$~nkhj|Qk_eo#-Glz40TL;ukXU~>y3`7U0(=A264E90(KG4%S_)Wiu7*2LCQ zPwXO*P^k0tu0B?)6)jF#H0E-64p*K&M3MPArI>EHjfj6hhxm#{q?E)+9tS5-sMsap zzR>OEfW?9zc=59O_2(X8W zeuhSI@eJtv(;_y*X?r-!N4g)^#-Mizc0e>^>!6(FSv5FypB#Lk!(x zxr)UGS>PI}h;nLbf~kg0z1bnS+`Y!XRK4Zz_Dp6`Y?s6u~qj? zh)RLQGOiQKJg0kb%b3ob(KgmW!0f0sc~UQL(k$u(bnTU7TahXJ@-3|)WGfF!1ls@F`#`8%C%8wRM; z5OhuOMF(3ndk8wnNoBQnEg^oMH&%0#Y_E*)j9NZ48u)W{<1~Mtg*WrWKa`KCx+r6B zf$VKwB{(JNN3}{vV|-WRtr0MAvx(;@#kd6=cidj8zG)GoGQ`|?=|<@jSX=PiM$wV4 zIb;D|vLI-XCL!3_@_4V}>qd~&fcta!s3CDM*-aF*0LC)N!=keBju4Ihq5hM{Z1yNH zHCO>BmbLxUs#YHCB#*gqesDNmeOcgrVkDxx|3gvg3y>!SQf^ES$uL7VLa=xI-tm{~ zZ=7QFf8?%lSaoiV{xlnxG@Lsc`*d8o$GDjXc<)Ja6<3XZt)+HdVF*r}re>b+Y&X9f z9BlYo+OQQC5N>5)jF-7`0xzy=7PqSYrQt^%#azX?zSTl!$MyIMJ!bJ`iW7f z>-+>bsM~XB?V0X&)j&~W4rMtswXKth2mIvf_J%g+l>1W62;P$^&V06)Y_I+d z+X9YITeV(4L6b1ts{dqFeU=zJQHI=(;rUO=G%)1rXg;mkCq2cv({51jl}ti~QI3fe z@|(Nvs!X)8ck_O$_AIw76c4Ypw|a+=ei^@Ew%!yomvPc{5s#Jtm>?=xkx_ov(l6yR z-KM(jp)hFC*UGx+?28mD=u;gZgC>>?E&1$6BWt=SYBgO7FTK%YRDEk~K?KH-MCsny zLlkvTcsXkxBTsbNa9&)6epbhr9#l2^OqxK3OkW<57_>+p%+jG-=c#%&{ECw0@6}e3 zqk})7VvFiQF9?1(CG$DSUyMAv=^TEa{$jqjK&rW=7aR8f$=lt)A)V2z`Ytgt*E1J5 zMQeFq!hE(#Y&d#}?9Rmm!E2ntfD}kD@JhMg;z~?{<0V9}AYiFxn2-SgwRkgCrLIc7 z$1kf&5xVRE`$P{B91!xX!@aFHf1%$?O|=*$P2p>(VjQY_!5^*bC6EBEqa6CzW;Spp zwseYSYwxqXpIa41!n1)*+tXvMAmyV49u#CMkoNSL7RHgKBbs~Cg&GjRJ8P*w$3PAmm(m>~dAtKQEIV}=*(X4{=b>C@_>e8RWENFbNZ=~mBy)(@y3 zJ)XEsv?U+1PT_(q#`@Gi8VTqMW2dY>%|cs}nZd(4PRO5@~M0 z49&>~s9Z+M71#Xe0V_wtC?h+MHc4lXfz{F=P|ktJN*incVbApCUDy?Lv%thAJblsT z>YLkVY$6eui{fkd{Z6e>QjcxJv*$Q4DLuVBz+1rWcf^j6IV7G}K>*D` zAAO7GjocNzX@Q*U3hUIuSNFa#*+?h2sRqA+P0?#+^4>K;Vd5-jQs0GDm#XW%<{;EK z1VB-W37qET=&UJOI6i{R0eWZdo1y z4hkCl3JMYt6Us-10}uZxp#aGg+U7Tu3R(JfQgjLrQo_n%!3w=!lpq1Z$#npd!U94` z28on`h5-oy11JA=6YG=#1`Oyk@dj`R3V}ujcp(9&B-HlaFhNS9l}_(U0#Sy*0wn>^ zPQURH6deLPhlmWpgm7b=LOKm;MEV^9h*3a-3w?f5f>cJ4L!DAkknUbyP9VEH?nt-s zO*=e*cbEXA{XiGMuCGBGz<$6GX90To{t5S}z`zo5O!0zVqQ(4^xK{|^hG-60U{QDd zVjd({`8PnajsXRo7(%P)QE!LU&trj@cdOe#LSOm6#h$kj&IxCSoxLth(IPlKj3qq2MEsM zo_F5;dwoPOUw?u-%+Nz}P!>kOql7$>zAqH8PY^;4YqvG_=1g;trR+m~4TAXLj4Xa( zLvqTh0+>NgPN3B^ex|^SNIoP_fy9Buz{!V0$wPn?If0fS52)^FdlKttpW2Y0WMYMp z&TgYzz}HNKgg}j66sHLj`ykg~VT3xoML@rQ+xB-+kfFfpgM}4=bjm^Dgr5}LVsNZ~ zB}d_Q@lQZK$RhR$porcsU-Od5!}Q&xz_wlqUw0qTnOGO*7ktMbA@BWdqN1b-0|W`7 z`YFk1pnw90g@GKWiSKr`eu97PulicN4A%^LpnsAT@r~la0>FL^`*nAAxw?M}!A}in zhrr+5q4CMWrWAor1(({8(9lB+1@eDy!Qb#7{13nD=zbY5e%(bYa~M$Wu$*JB9IHp&GvzhCnAkB^aWepLhVG8{a zU(?`5=+^r_6@`To-1=ITq*UR6+}t5QQH-Dh6UBgkh^99-gnj)U@rnB5g$kL7f#6Pr z0{9nl&Q{aO$$>!<3@Ud~pvWMQguXF;)xZzVZ{n;DIk}nWzvzGcfbtaysX{F6aG(VDr-ksMjfs`N|D70Tkz0vLvB)g-(5PJNL6nK7etFrN3(aEL{W2$z2nG-Ik4J*gfg7dj|)c#N*}X9JW5E zNwu#(GOfry{~-mdBIve{(6M$v@L9Xg-(?X$Nig=pRqRup!ABn>?Y`#cVP+~xx{5R| zhg;*Z|5fl`djyxSfDI0sa6ejke03$)mOi1~2w!2HgowH#JkR9cun(-C;csQ??f5JU z;K_XC*r_DSk#NYY?ip;xK*IUJ$bUIh&2HXh@rr_g*dI+pypCz-SiuBKe!K(w)N{V05z zjN_ZLqfe`x;>uRY;yfBLC+H@ZkMHHV1|pzj$tBTUIJyXN%jv_)B}@}fYidxbRN!o) z5lvrEH&bzE%>+I14DplXQ8WKzb3{R)mnxqma;YD=|Ng;Vu6f>fH@RR%4B%x@?Dq5> z)-yjEJaqZ^0M!IY3dX+`3U`@Nx%j8nCR@?>Mlj;3Pfq+qa@#sO+=(L{LMcg3 zkP_Pg_I@Hagc(m|s{&LnLbG@*6t{g+y`{;&Hjb17127K!qva${5zj(NZlY)Jd@m3D zp@@%T@QTlDbdDxA_DYhYMg%6fIc6V^3&CU=U3NcBe{bc3`!Fd(u3(DAnRf~XWnhYA zm-+g(QqP|8KX|5CerLIEFDMk${V%#z&Ac@ge@OpuSHnJB1qfqWWtiCpzFR@wE#~l} z6q|4;l>#bOrH1xMrd-AGvC~u}c8dKr)xX54H@faUcla%3T&i982dXOxO47A+IE1^W zg2T;MlRosh-0U>64*tad5r=3rNY`#W+AIw)ZY1WxWWGoP5$d&P#7b+JHIu&7XSRa-(Q7?9X#T|u9) z_L>*P@9_0xThvIgACwc$vmJR=oSA1ie`5L5HD;IHGrCFeZd!A1)YGDH@^|}d6p<1! zfr2_OpdK4qFbfmF@{MeZj21@A_Wk*jEr0lx331{m$irB!$xqr_((2;xrw)i?!ph3@ z!&t5Y_q}e~=5ERG7RO3;-vne7=t-4*t{6ALKC}1xKSy>Xe6AvEs13C(zl;oX2|mte z7mqBH7q*h@FNo9x+CavzHE$n@wf|AITT)dgw5cz>lf&_;e#a2KPhHfb|2ToIJ4Brw z+`Zk5hL`2$JWTXetcd0OX6uVp*@D4&T;~?aCSgHznE5c^7Ehj97DB_M5$KtIo9_&l z>0&HA%n{mrk;Wq*JbjeaU=7IY)e)t~=gOoWy?tWUg%8tk>&T;ob$=W6V?WhXX~sm4 zLx@09V=>#CjF&;AhvWVvVCNxCJxBKt(;_1&#v+%ATGU|Sb~;lB=JWW{Ds5b_P#rdx z0$yiLg{-@gWlvx3U{3xov{BL^d7TvA2|KOLStGMp$YE<`n*(ejASy*o=2m_+ z3oBGzp&@7+4bE8ay7d+6QFX);@d~QLDoW$A9hHXM;RE-_s9eXVZ6CS&@#0yw!|4S}4!nm!F z93ue}u(R%^HR&a?oQa{y5ZXjp7 zUF#_(?JIEbhNCj)IZmUO)u|)FAvD%fpX(Ey7Xuzy``=dA?jNBX%w1?u^T>mj7YXY-X zf!dJ+8STcV-~O0wk8L}DlQ`gN0k3|K#+*bs^H1>_zm{sHDrI<*cl+oEL?EvS5)kEf@|6aB;AMSuU1 z-J1uuwJ4(sULX~Mqyloz&Yz6R;4+zG6*8BfTr zIOr4_Qyy!BJJg|A z^~T8KiDMf6ZU!N`n``Z^nUCgntaL7NLxpp1FH84LA&XEiQs76UKu*r9SXG=RAAX zdv}EE$YbP*B9V;=*JEG)JLi;vucMWYUh8+DX9f2mILiz)WitrpAdtYt!9_E)~k=YUx(rS0VkK)`jdxK7zvC#7Nx@7W?L zH&gB9tP{zV6vAnF-Y|9>;p~ohJQdwIq;d<8$rmxSfH*LjEdbkLs(G&l16Z>bo zK59Bp%R+{8WNi8>RDr6flEHwl$#Q{}r3LE95}n-l^_e5zU!QuFkrJ7vX>9!=@q%8U zDBRg^0P_e~IQXciK3R+VPhNfGlUmBCMQj@_p{wz0HANqn-AaO)fl;J79Dlp?Unoxj zRA(`FcPb_+Rc_O5@pZ168RVW4Y_NqBC%-m9neh^LS*Rn_fMm%0*842hTB7SyHeu?# zn1~wuT?XD2W5Quxe}(uf8y%m?CmtuoiUte>E^XkUyR{r{u+3K%oJIEt)K}~7>7s<$ zq$|;;!Let6TA@gj`8Uc9W|6Q?s&N*P9Xd`n+m=S6`K-~f0_MlH-P)aJx}TkgbyKJX zGxpT|jrCuTw(p%v>!BsFQs0^oz;vEkWJi>_gnj38o`=a z+;f0$CvXz#zAB@(485#)#=ZCq=IRvuhdq6<=dK~Nv!=kvfzRqUihn+mi)TSmZ-jVdpoak0v0|itj*p)^6+g(t*&!;RL`eRyQz!0CHEGU_t9JaE)X>NT~i72 zXSUt|3L{8-4b`SX`>dt>B#rZJ&xrq81qYF8Tx(!|&_r8hYIed$Yg|n{T7~J?jA;l# z%(#5lF<0RQ#A*n)fTcZ=B;DIwtK6$vhfD?so%F`(W{YMmK*kp@{$bI!reOGYl-1i! zLkn3(t3q+=dke`HR46U!|ALQ_U330G|Ioj-&#CBcR4&%K-q}!fmj&1Cxn#Lh-X9yx zlabOSdHC0+SN6N(v4pQdH+$kuz%D3La7ComixHF3d_yT^o>57QT3Xzet_@t#2xNnp zI%Uy4tY>%nmy0|IfhF>BZJ#-lMR4}lXo{L+hmf2TvVp*PQjoM!*OD{Cse3MsaMIIg z+g=T0jLz&(kVeC$X3fe+o=LPncQwk_#P|LT%h%OeUb$vq8wlXW>I97*&aJ20n!~ePW@f>11XxHB8&8O||i;%QOVHyckw5zrDg>(&(dh@o?jY z-vrXRt+oDnduAAHh+(uj?AUiv=@0g2g+LW&=VK-wR*1X}X zom40@6Rkd@cHU+{mMsK)Mf+K19x3sydVDtdiOj_e%ntuj7M9U~WP{7Z^iipG^INH1 z?_t}*ED=wOR=I%46eYubzYXlg`S#B62JdHKbETUN|FreQ1K3av>{2-bga^tE#XO2d zDqG?+XhpMe8p!NT=RgmvGihx}MW6S>J&5G)>4C}+w&qi!E^#;fnEkDqDw>~nXiASm za`v0@wdbJ2R6*}j)c~d}VAuextdE_VF;HEDz2pPR&U`E0hp7ql+tGK&B{q2!1 z4_p=iuCKZXn@b%N?D%HoZZUC_Bx!N zxO9xBR4TZc4;lKv@YltkF?NBU)v}x`#-7He3W<)ypYb^-5%AK5W;G@gAUCiAPicd? zKj&FDqlci$ucc$$Y=e>I(h!Y4X&RreEGAn7GrP(oO2XDvC*vwn@oJ@$L)>Xc=}5<1 zfC4virF-#ckbIm>t3Qg4(&4bf=t)L$u!45bAx_MCnDuso0$TfX?{)VXkO1Q7_H1@WX{S z$f)=4`A5fjnqK0rLdd3t*1?b!O8?=(YoDTx61L_g;;=#!;&wwES(L3rb62^bw>tSd z5!mw{(W|J|UOTJHcjU1c9?jBU1X1}!AltZ1jBd6zcHsdnb5*3jhJT<}(XX?NW8BL> zN0G1Agy*cc40Pm@aVe5I3a^UIqV;vK-E?7)nOn{q;&hN4gPdCBC#FiviS(qQ}_-E3~2G#wJrF=d@! z+@vPsf4d;UnSAP~q$+s^jtxh$Xv=?ORB8xSiou`^QqDu~dBHhtzQEr7yA=I_i3H^x z%*T~!iWxGsL59;7HM3kR>mDq$DRWXAS?gNMNwgsT19^Wo zf4IUCe9gR?>Fce|c_lnI=vG*`zN~phE3uoX6Cn?kdU}*9qJwxcwD~~pQhD>9!`*4N zd8Vl>A}(GUyW=S&YGm7bycu7no>J(on!E_6WcW^eMxCA=9u~O5|1@8AP{6(vmp9HY z6C=~{4<+w>>x1d0tXdhA@{Gr*@9s#RJL^_K`sT#JR+Ops=tEtAIky)t6_X2AsSboCFD?+kK)CUg$qT zW-0E)_#(FC&_Q0$?rZ;n=;etY7KG|VCw7sIWl&&I&M)^-TjStx`QyWhiMUT$mLieQ zh%5YcC%vR2dR?wVWVGwIzVq7E|+#kCagqrHzirIq~k=Vj_(E?Il$tEc|7@jBu&+@X5&82jIG_lDkk$Z@xaua~%zg4YMJyUv0^vWe3sA z&<*~u?^{3FH=-*Jw8gG<#o@`Bkde30_HoJQLo<+Cjo{f#&MEa|mPdM_ys?G*9 zaO!ME$S1sJjZ8U-!uI6x*Tl+Pij~QHWPQ2Zpfv9D5>&chOJ*R@Wd!@iIWOq$$4(vE zc;U7ECwg3IrALfX_+QbsY^9eMLxhzrZTDHWoT#}PPH zMaQptUM`{#;nk^R$%`mlo!ETw9Tx*mOz!WK?qQ?OA#Xx+xIG#)pGEPLYiyHA)$^wPQ|DMs4X~c z>%6AVK?VKMDXTkENyO79Tdx{=8a}s>VVoi_mflC-U1(c%JoP!2PaaB?mRzZv{qcxk zYy4fyJVIL}iRk$3IVDr8aDa-#iJm6rk1ac*F0dZOt0UL+(n2Pw<>f-jM?9_TgorAq zu8D)|##;B&A2`n)6Eo{mh`y|!;SuXBKvdanH)Le=x+>4Y@zz2pt59W>*Ed$MRS0XJ z{^Y19aZN)u74P7*X>P=J*WR^=+PS2dcxfCx5+*b{|9l2xBZRgslq$+6w?w za?~C}X|Piq_ld6X*x&lq!{um2gmTxP%^EJ53o=q~RRrK@P&w>7xn{8e=GeeLgmTJ1WU*|Ot# z(_44idlMe3wHlzXLtqB0B23KegXC8amS0{{LIDvlAo68cPsEIyMT{35@LfV-&Kl;K zzfV;>{2wZO3J_-2%t1j5eqIzI26j~d`ww>$6`~|`p%^j|K|w_SUPnA600Hv#9lV92 z2^A%YjVz5h!~t1#kX!T6!Sw$HD)yQWL5L0x+&%rnK_6H7Qj3aZzkgBi_N2VS4T!Gzx4~i(9NZPsGZzdPG|}$`c_gtQkbtAN z(NR!A3~zv@$7ZGXG`vI&IM?h+kJ50WiT>@vA46~%3ipHTBQRYNHVEQefP*p-bjBG-U960s=(?V>;scB&a>a zftwos=~K>qU|>Hom|%F|`gBlWNC4!09dk4c2uNJt4#yR{A-unfp%Bo0Rir`Ge~RDZ z(_Me-V;0$(`cJBV9~e_Q;&hyc7l;`p_P#FuyoWBi!tG4kmlBLW?cthg!mUXnJ8`L~ z=dk&H;=tk+cC1s%xm!e3i*r+J(5K_<=>-38NhWVg?_ju(yQ(_=?HYxgE`dI__m%%} zKa21O1m!N7T%dH}QW298g+tOdsWoMcXVmW)tB5%p^_|p4R?=+-U zoiH4(CShRtxhc2c;EyBtgKSp)jf}_ptfK)6s>e<0_MYqh)%cxCk%bZ;C!Q!b)=U!e znCt*jW~&}nrI{za-A~yaII~q0>Gw1KWnK00;~pm+R6bO=15AiLrT4;4Gq{jZc}KXm zK8f2j6(;`lw?DK4wR{uI#B*9W^c*TD1{L^OcuS5ZF?)O9i}d%rXITrcPFL95-?o^? zH$EjyuoENake>Y~gtVv>1iMDZFQRde{J;O0jt3;ez*5F76(j`od;{Y4-;gKc>}gt8 z`y)iftj}qn4jZy*nLX&$=w^Ml2z>I8^Kw z-GH>#UZ0ibIMpAe$~J4Yb1M5=k`*&ub&t z)*em^67cdarA<`xHm6MszJwXv=PLc_V``T)?Fx%>)8{$lM zzp?K`J$rbC9wx?cnn+1*$%idwh3>1BY3SN<*tQSn!#R{<&MiU@>>mxWNr;1Fo17i} z8uL`Pl8iNpRH8geu%ghF1bcno-Hn;ZxN?a${UjE`QVZUCwrwkN2@3BEJQ(xurOnYo zHidb?IC+k!!qZ&Gs0C=OmdscLYWS@5K7aw%K7E!z{GA9H$@Iy7`5KUu?#g}MBjq7i zy1#BW9LDS1Mb|DYHfyd3oH@`FDtKc5RL;yyn;lelIfGYgEvyP&td{%}7@-sm<8f_6 zCStB9llL*2BE3KimDb}uiww}PX1R*<)4q_(5~(X3O|vs+KuWuv9#zFXD>y$zDrV~22yIR%`kOasNC~8 zdOKiiq^V-N^E-B1TfL&8RKJ);Uzrvg^2YZ;!&4^2vsIP-Ceuxe`-q>-6pqADup++* zjwqp@0wAU#NYL7JLETA1bCgbDc3YiV6Mozr8`Q(|8@;$wA;KI#m9oMtUBn>qQx>bX zKZ3>Zs?>MP-*-gy04n)a-j5de-8kPCz{6(+*nAI%bMYot@e6calz9w+T8oBZ zCJ9p~T^*&CO=OE{uYQ^9!Eu??W_L%bG2(@3;&L;t*A5PfgAZYO(vX|(UL~r!!8RB$ z+}qOjac-m6TXs`DS_F% zV#)^7C-@)6R7OwHc6&g#VYJK4)w)7QQQOQJuz2g+|A^d9YR{EJiZx?B!8kL6*loj~ z^Ow=3$z(s#DC6I(oIHTHK)o%hqmoJ!nCYw_%EPB7G|JUqxKqYPVfC7(-Lgz3Uv63r zexr@`4U+jVdFcOz+bO>OdU#iuj5!-L@Dv*I40{$njuwAl{DcBy&H#wH8ztXIRXF`L zIcis$Fya(ec<`!HtxV+bI62T9ccLkukjX$D0iX*FeC-B3sim!^l@$xliPcYVipjvN(>fcS-$1>fBK4&Eqw?wYu;an99;p zhZe{cq@$fYavc_B(_deTad*s#*w-eDmCC+x9^zd++SM{*ZhC|;;CI!eFsV3yU0fPn zd2x_RlUesg@g9#i>83^w&GbsE;@dqi=RODCm`=HOj`n1aALjMF?mOLX-l}dx`6{w1 z@fO_eqDW2bD4AqL&-EmB4YoR9E5VEEZ2>#Y3?;>cX_zjaRuU`a(tSi^WMx#Gpi?8& zi}~Y5JdEi9lxg=tka3rH*R1HRvt1;(osQFQy>ZrsDv-d3sNpEGO;s>EC0j#X)StAo$bIh7@nz(WLjxU`YzpEN#}$trJLemO zEs-pXxbW>(2C(hOIQ&a#^n)1nq2x#V{p3N|J9G66)Un7kJiKe^%%g?$xP(}%LQ?i^ zc0Bf&UMfV);5r8zWRbH@xvYebpbqk56!jYII6^nFLFY4USz~2|DGj@PGGM-&_7Fbp z+1i%BM^Xse$@QKi-X$Q4bS6*)4ji=;odp-pib)Gdd_*2+CYAAPV3VIOr9x6Qae;bg zRBr?4$TadjI|B8dS>WuRl?38OKc2d&5CV7>*MTmI8SKM;&RLQ!g&@c1$_dPrz`%1n zw_fz~bO$|j0T-^#03;asnZgJf2xz;KUo#gMWsrU&O)7w;lALhHX!15 zv#)YqwNp?DUXz58rh<_Lsz6Tt1#xIepXoQ6dD&7xgs;&KIAd@(c&6txX)CoG_jJV) z_Du7=@#f_euY{%$E)8~?el2_=qG3Z9M24lil~g-$Zmro10$4oQoO}WeOA=Rj)3Z(^ zg{6(oh27hNj__nebE{^!_~Mf_MU6Oxw9Y(Pve}?Uq(-dq;hTQY|tz|i1bN~q(SB(VQ>+M5Qrmac*3Hojp-fOGUNTvdLa zh!{Ip@I6|@k?AV`>zw`Js3%l?9NlC?pMQAv_ws4%BnfAJ(M(9-T}$>oNZDzoh6Ir| z5{riMF}2i*dbr!qwLqfZPiKayZln3sVLGJW4JVfJJWB0LwoHYhg^O7L$yz7b*}oUr zoJ`rzdn04MTaM##^%_>2+KNY}Ne$8siHW^DPYxkdh{bMt8p*b06VY{9;CSSd;+p17 znv{`-TiX0tA3n^ebP)B@GUx8SU4NM*B}xDR@eyD~eQZoOW)94Vq$pz3xmQs8nlQkE zIGCQG*Qh*66pmT7^&~ISEs!lYwct2NcRJ)8Eyi0ud8ObQfV2_9PSxwDPkXMwR72I| zuY2qcBSPCXT4PCLS2tQKN;(SbwY?oG`#m=|aA{HsIG#p=-CvHuYu?sWjiSZJL_Gip zRZbgG(7g#`Y{i2jZ9;Fx>86N6R(&$EgkFGqpVJ;KZ=E<8^}49DYg7A5!NILsDp>i; z^?(A7F>_jtgYx>Im4Y=7`*C`ROe85Wv)`L@dK3Dtbog)x07*@MpY)M%MI{UTDfg7bN>H&H!3L6v=t z0glRBY%HYQf&MLqTq5%7e9hYa=N^PI(jj}{SvT2AO+*hnJ}S3O#%IVz&*iU z?}tsYpY%ZT2*Sj#PG2>zI#%;E&3v?oaY!UUMOQ6Qwa&fHU7q-BBy&Wd`B)>{pxma) z)T#tEB{r{JL!9G%T}kwd3BFK7k!7>0Hj?lG0|UB0cN#auGP>{s(e&^K{&B&z>~sJn z0kwdYuLdo9nzA65Y%OgJG;l*z_jEV-vWS)SH6ul4wp4HJ8&c3}pBNMt)ID?c*NE57}_|3;jCp7gr21g z4W;UCHmXLnrR<1KyvM$$6n%$2?Jt8+X%CVm7y|0 zjZlQoS0l}U2WX@&ywnpF)b51|wF%CgOi#kDnRxIwrM1*~1tie;#sK@~@aq(B`Km#n zSQ_s%UoP8LSBsWtupKENsl9FdyO+Fw?cW7}3ylK)oy(2d%50=TDUHKeZo{JTjqHxA zj+QgDtVJ&H_{cXbe*5Lrm1=a9P(wcOEWMjg<1N4SP>`u=C}k$BBMFqY|K40r`rx$0 zJhivupyMpj$_|zlug?b|czgvyyj?{@8T;RCtg%mm(+6kAPcnK;r@g!?a#Ec#5y(4e z6Tef_lq_DV+kVU%n1G^G$!h$$M>~5>)3o5r6!OcdO$qz$E#8KyT4cKSb~-ubu61Yw)4k1j+BUN>s;W;VvYuT zCjInC_?B{(saQ`$#X;(IB-lW0$>zn#*Cn3}2}-85=A4}G-1|O?eAU+#G&is7bV622 zreOamV9mkM9P(VF&rBX-oRcZ_wjR@X{~>&KNlNiHa?hg&{^j45p43gPw))G+f37~c z+&VBOKDy{-&#Tf5wpurtg%LFFFR6s@v&%)G8k~q3lrcx0;Dt^;F=b+%^C)WPcq-sY zeC-V07xk5=%fBwEHyQIIlek=j%nGD!t`e#ihR07v%!-4$msE=s!5CNSDkIsvn&2lT z4=E0jl|)pimS!@qM6XR*PfvKKF>hwDC4BM^84Vhdwqu#x+}?i_6zcPIX1-VK>H%0L z8`uw?!g(DWz-XtWLif#AtOe@eI{dje}EybrFMI4LcoVzztJ89 zu-MJ#^jD1#mt=&~+d|HrOkRclR!nD3%o{Waa`kkj*GfW`Kvy5|Zhze4r3#(&h-Ugx zA{&ye|MMY8bF)<7&?~SONcUopJCp|7;f%;{wzy@e4rM0p(|sV2*=I|DF#5hYs=bbW zw)|vXmAm3+L2UV?OKWDkzh$ev*Tc7}qk;C%t6*L(IcSb*iBAd+m3zbsMK^dtP^Yt^G_IyF32hahlpR&KAEtZhD!PrnNORC*(QL|kk zvj}%S3O;1gq8!D zs|b|VnAT)BUZbDS6sOCr1Vv#_bh*^02Z;YwIKF9IuhzXnHUc_ zk9k2HB_>wxM5Z6&?w`aos0F&C%zKz`YoMnG$slIaQ{={`l9pyJV3~+Q z+Cz2!RhAMN4)BD+=OeYC-0&7vmwMI<*}6gvb@C8sIJE4i%+Q-?HFvZi%h=ZvvCjoU z3Y~rlH2Ra(7Vct`;tBXo2V!0oto@#TE5rF%8mVkd;Yb_$1k3{bLb!eS;fbyI-FDSI(?BhpKj3$JV2acB(O>z37Fl?uxzuBA$|X8 z&h_X*qSfh9Ll3zwM5afnL#C_9u9jWLdMsKd-T(E<81Hy|nYh)Yzz!4kvsc!nAd}YY zXfn6aDyzg7i9z*b(TjB|x8};7JJwedsc|qkzhtVB1RK`Fz5F^dmqpvH7!|E`r)5C7wU{x*RHb~1oh)oN z9F8XIIHKpqC*_YePMK6~jJr~z>a^X|KNM4ynm6+wn2+VZFdr-X|A4)J8hR!M_W#0s zf0$VQ{GT=S{~z;dueSIRY|}D2x&Hgufnng78DL-~0tpBS0-PwL3B-uCiMDBJX$cAM zqj{fsZ+~l_y(61LKD9b$nqQmYk+W+6Q?rPd@XBC<``X{y+=l_7G(Nn#0CaQ!ZFF>e zq{zsG5O83=kVlM|zy`Pl42ZIN2LT;y z_%X)%;eh5E0y_b=5m0fj{*lTuUv}khahi$ zdvpNadE^KuuudRfL@;wLj=(?tQP_!)dS^fnU%>2soc-Qc|47Eg6!WQ^dUqD zV1fu>m?f5feX#sv_%j*49CkoISFnDunYXu2z9PR8AOT-+Esl169qpR}U;GHBe#j6o zAZHYo4ujtNSpZyNhxDRcb>t|Bwx`zMK%48tI6k{uaCtPP;B`U>Ux_)Tz%WN}uSYK+ z{=V`@@5x~E#-w3|KugoG5dNM9KOMP55MWOHP1~`jvE#h{{N4nBzIa*u2%@FBBskq$ z?ok8;@bq~Z2f1_*5Rdp%m=NF)_YV&dVUPfRcmR2|fzY$HPa!@xeY+w(x(opVa(-M( zxO+hafG|LR01jLk z;DO(PXxtDt4uS7}K0ZGup$O?kDL}4XV?S@-AIzwzFw-g>zxv;7GrPE#&=LAb$DsEP z&<{ZGzLC-)4v5co&3|nAbdP)sJ6!Vk=wIi7n9#h0Tf_7R0?Z?&n znVZv9kRVolfvc~iVYM@EC>MMApr0XZ$7U6MHJxnl@sjiMbzg7 zIoJghn^XUHp0~rS34hy}_Wv2HV#l7F)@8d7^WrBYA4j=eY zmP3f&!M!?um-Qe7h$WxHzQ_8GCLr3UW7zXmLIAyc1J`AV9p)K;Ch9*SV>OUp=W?0$D5($HG?a!>L-n#Cn~lZmF1>LtTS! zR|U>~i@cPmI&FAtY6bL+ZjLR;NO;ch1>0HcTEgG78p*;Xy~d^7O8lG?iWV3)rsza< zyF@g@c>pO!JWu3QtO-q}sIlRlFP3eMxDCx&2+kinm+r2n(ub|eT(GaiL8pD0`CyYkn?KpJ>(MzHINjNwEdx3q6};%I=ng&Ecw=+W z1sqVvdquJ)QB7S!-t0Sb7OTjxHVEHa29ot#;yy}Rh*8D_H6@~I!J53 z0%iZV5mY^^VPRYycZ7LuJN=R4YuiCIdXOm*4VhREjny6>CNi-X;12v?wV?chcIbqZ zi^j-x-1$sCgRRgGGU7jTeYce8X%^Jcag<-8D77uQVaQL*9k|p!^cv^U?qn_J)5__8g=kqFNZ!)g^xT#``mA9d?~Dw z+Q~S=UV6J|8z9&4A^54x7jxTrWc%LBa*@q;LTy(&YDK?P)W&#$0S|fDak6=abR!E< zSiRKU*xh-vOR1n_sz;eNe>U?p{M<0T6@e783>RH7dze zhxc*pAR7K4I+>v?(O(}Et#Qez;52MNZ)@1)dy>o9m#+k%uYbDhp~|ZZB6U=63=4eo z;rz4dJk2NhlEIcQP_eMsV3Pi(#Z(|Q(Xb5@ZZ9lPwqb^D=yWOaraaSDE0Kd&RC{%w zi4g%Shq~w_!L~hxQ9||$++Y!T#SUV6DLlJ&ro$ne7E-`G{hmWa2lVa-u}y9E&n(LV><~puAaLR$Eg< zu#56sj^cHs@Z8Uh7ZYUXVJL(kH5hrD**D8B0tGK8U@K;+ypPIih%CVOHD+FNo5MNB zpkCvK1FFf!Y7Kb-;j#E{BB)iydfdzRA?GZ#(0Pm?Io>I#?NU(eQ=Du#qRE@IhfB~U zn8Rf4z7EPCa_k1vm5-hm*TFA7&V<9hxTmv3u#2mAxksXixdc%cslt$|I&L#ul>efs zHyk~$7k+iHx}VM9qfJ>=GC2nE^M2jYRD@P`)q29Azc5s-QX&V%avIx%V zC|8uOM+1-Rw2wN?SYqW+v}4vsa1Q3xOCzyW1H%!wnHCj`2`co|*+(jN3@!ccbKxe; zW6qp2Mzw}78JRKLz}`*MPeXtNRSv(FIk-G5Y0dv-pTz2PL4l`P+D+V6jn{64fyJ%PTji|}n2a~@#N)bn<1`?5p z<6fU`e zX4HhBcD#{PUBZLnuTn)Et!kY^JZMT8%-dGX@WdR8WdxMGh-86itascCffftDFIvXm zxp`}`kq&)BhbSw0*He1)?q?QX4``ac9UL5F` zZm+kLtr3H@C5{Zgs@o?i`c|k>x!0d9E}B;;WR9`)BOi8IOfb)r1h4J5E8!0w#;;&n za1KADZ=f<)#%wd<%fDna{N)`5mZv-?vieWKLnq!d=m$EFOuSex3(-9s0~H{&F}$9y zdt%{!#S4T{aZo&f3%G`c;p<%~^z+DV96`yPTb%2a1T$#z^9|-1b>B5(5T`hllI6>d;u*Z^v+@HDT|J3S22mMugrxP(%?w|J&ZKNF`*$d@M<+CZewzXFv&u?Qp@I0VN z;nnUK=&W7XR6r!|8hn4oUY(+5{q{b3ulRkHv^8ObN7Ir)B|0HHq#h06^|C@z<>#Vqu!Zq9uum%>vMiSeIeqNI_&P90wsK~%3jo^+3ET&P2LPs{J@wa26$ZQCk63!p#&RQQKc?P35zG_Be}*&f|UNSMMjrXIiu^w_JTGpjOhnn zhL6C#TcHbgx5;*Mz^$I1)yfu=#{9{BhhK_e)ECUGRB`Z@|8QUA7J@AKq=b-uOY#CRE0=@1`9N$AYwp3xMT1Vd~WwebaQRzkd zvy<%l!_6;I(buc4ZyO$e<(>Iz(H%;WRfaO$_+6c5lq~@i6OdpXbl>Wgy1e3VLx$9S zq<>6QW@Guffg!NQJhCvP^1%q`p8~C2k6G{i$RS%#L4vmV426~Dz1B6J+~y)N@6&ra zx!H@}CT zNatcKSV{V?gU+Xz{;7ho09=9QS;v`I#e`lP1T(=WcC&s3?8~l+a;^cEI*LV)=__x$ zh%iAecqTuWx7!wwdZO)|o$Hp6li?8ntXXMRK_7isXDUPZTqjo_j+z*g^7uA)r<)^Z z4#F~bK+(HjL6JP#sD_*?s+6r2%9LuYO?KLT>p&3|xw^g5HuQ`nqCn)H~8UPcxlTD)O3I1!WS&Q2^fm-Fu4dP5r zhj~ntmSGBCMF=@_8Y}5G9}kIDA26~$I2-SD8R~ZX3Er8^_t-wm*6FS46|TtVa*4=J zuLA=W`9qZMh-U*RF0A`&)3Fy>#U#pjjh{@CLB$*_vom4D*1BoT4IBh(?0nMHLw-<2EuFDMMU zzr65J?_iggB<3<4>~Sr zLdwA6gUzgKAv7V*dHW3~o0WZsjWVqaj<}_@Ri-kw$)XiDMCh3zac9{^aZhBD11s~L zSUeQVF;QB4Xy8sh7n%i?e?K)zW*yLX!O<5}Ts`I2DxjL@!Ei-cdmd6YYls*a3eDGB|)M6Sw zq!*~sC%4S-Z>c#D+?n-5Te~H+c^Ea~HABDKmiHhBd|_d!$u@3WJw zYc^^jA~xX28EseH|dy zE~wwWQ$ctisOy*@y~1MgQj{h0Q#s((%&ZJVUa@6~0uw8h0Pzb$%*2KMI7a$9@WL8| zdj4KfaWbQd#MIVlfOw*E74L`9AK``cv>2}6S1?y%An?TyU&`}}!DMOQp|E%j;t zHqunNGEBneqwP*E0P=d)2wT!Ov(@G2h4I7cG7jDtRvA;N#7)hY(&EQm_$a zsDgS8wrVQWQ`Uy^*!=r@b5*2o?jFI6OCI$dkBBsEGyZ%>rq56ED5aPlDXZb_<7SVu zM{IPeV znZKiLZnesy^~%msw(OY;+zoiqQ6Z&rF|Igl=jOGVVenMP)j797{d5K2l$vXA*GLV* z^Mj^QP<9brcF)6r6O_Z<*#W}Eou`Crrx9zi^Y>eWH~wl^BTzYP&SVQHk}A)*^T+6|5=}B%QqnGOxbS- z>-&Z2I|pBhp7mgJNGy=TQF4iAB@?a9(1mzvkrp!0KKfGLGp6$T@DM_2eBCBF?8lZT z=4tB=O~1FzRuGLY%nBE3X6Q+u4|~%Q(Rk7On#t)R6h4*5R?o7!Zbb#pMAW3H3U0HT9sKYRjj6*)P2?#;$!`@7BbWP$)ec`vgAT!1fyT$M$ z{sE-@V+>2|Q>0u9z_^1Q&=pV3!e1GKmS(cfg#mxE)MiA+$Z=Pl*E6uqBLggPlzoux z5G+!ck|=E68Q^hz=K-3PIB!FI&!=G2Hy$NJ>26#5Ve|zr)ryrHIdqgW!Nr-k1zr2- zF|#7(`Ob)33yd;Emz)nb}|9*@BXZ;gcW;j`=w z_U@I(fmnF=hVK!djSbvW#GdQX@cJ^WnEqB=TWp01y0fSJEB@`)Liecb(_T={`6g&` zVi*TpuU;O4&qe|h=Cadt`kj^danU8w^UOGk**6v)2re4{8&tKCuAyI+mt_L|DyPAg zGr(%D)DsLx-+tL7VpvUcKWl47#ZqgFpZ$eWz*&WKvfJ6|?v)hw+4V%R65D66UNp;1 zE@3;GrY71@Q=xOlgOeRh{ie6rY|dLw-}=ok*{2HS8C=QKD1Oc18wjzqbGR=V=M;(4b)7-q|t%Whu@-3*}<@K1^b~$nv z+{#?GiSlcmBYq2WQG0&|f!vEvElN-j|dANVog889-{GY3>1uy^#@{idw3uY$QuB3=O*o zRg!9a_>lST{hX`rUHI1*d?@W*mXIlS<<+}F)us6~=nVR_|KQS)KWH8`1r(ud6F@Fu ze1xM#<0Hci(!)Al+9%W3(6&Ikz%!TYk4zF~qx7iUV$W+7 zt*^v5a9&ge^sB2<2+py2MP7Hw8$)`@Sf3c65y^>188^4+gl>di9HlnOZ@6Fz-2<o9=_Vx|-+)TOp4ndG{b8i*E7pcnIgrC-z$r% zh7^oc2q&1OisE^z38&NM$l=t8tdmH=qM*hHIe$d(ch6HCRWDph`@M(vn(F;ElM`q? zQK|-%mx_0*Q#?=7oa~hO<6jtbZU{{CV?!B{x`>94b7`7ryTnY3&KI|!B$pk>c{Q5| zzN@tlTHqbh+WrvzY%*p&cw-<&wK+<4OA)fv&Gm=X3^<-a#)4Qx2a}$h%*3E%+vqHK zRfC3363aO)LXih1TQ|;r@2$T{BicT1yNkk>fCSAQbLAe8vW6wI$FhU#G4L^Fzcr;8 z*76f65zna!bOp;rqz@Xu>0uI=Eg=nk{1S0xXv3*4f{yu@XuLqoglWwZ@{cHM@MsJ7 zJfT3ERt*4&zVGDh9&%UyW||bNfW!+uA(j>jvm}`?SY}7PF4eJwvf4n0cqe-8IB!%8 zJSFb^Y)r*Pgj1aIJWiT*8jRgCg|E+!2{W;vw^#$8A=)v4m4vjpLbc`-;RBG7O+7lI zIx9NbI5~d3W-(ck!IxF5@xr`(aPdA>b>VWZHSul zt)%F=5vhO1r{LwDb1Lr_n^B5(kYR&kNcPP6h%uTq4629)hZiiDqM3L$4=qAxi*k|I zO4))yPG%cMcs`~K=mQD0cxXe)Q356aN$P6w8wj_2L*wO_3(4XaeA#?B)?NU*rJ4IL z3^y#ss+)nLLzAW|B=BeXF=l#tA~rU2UXYby@p6Ha%ym{|p8SjsV`{z{=Ie|oEC1S+DFa&P1{QP3eNvkfFjFDhZaSa<3g4uoCjvhHukFn9*|{( z#H=O9)uNUg?-0Kdl&+8pX@-;7!(k+}PB%hWEaC8uYrzuu>Nhp3MmPTjN{JW*@Xp1`dAt4V5d!NjE>3j&#D`kGj{=_3D1!pK=QG;-pC30cPwftu|?@-&?nIH z`(t4aNLi#bObH)|3irC|x72g^CZF#~J)Ki`hA`f+Quj(^nwiH244rHrJsgJhaAJUw zSYCe5Xxi1%*6_HcFQP+hT$HqywL+O(IcKLSoaSB|)AlYbQgV2eXHR#0qvIm+I5WH_ zifbXG$bxAF&fCzY-zg~IewYWxsis~$1TdC4h&Oxg1=vqe@869~+iXvTBSOFg)QOn* zacjlvjE4Z*Uap$9+68LN+|UP58@Lpya_jlhiSnTx7KISA((2vhv_&1?QB^|^U^q;W zlV&-@g_0Rh zf2B!uE`rZ(7GX)vO)2rB192&o!nb-ES%`aUijYZq&W+#^Ghv@$s((&iA5AjheL{NG zG8PFosQcj7iKD0b*j#z;mtTfxgxhN|Ql%t>e|cl!Ui-7HYK0LO%KFFP|2>}Ab1jNE ziLn;t8g#~b&%p2K>(q=ERmzQ9?^UUL7Ly$de@Ik1Rq*qjy(D}x2qc+IL@nBJx9GPY z_&4|>IdXvC1Ra36ZWW5&X$@ATiPgsU5gQct=umiE!OwgKHP^+5ZAF1pH@htW^c9eF z+yC71%QkwwCXmRmUsLYOK4VzS?y1;yxm6 zI9gKWGE8OX*_Ar)c&Oz$^_C>aB937$Y4mP7U-gGd^;UR?mx88$zJ{CP?`ES9 zPYHP0!$z_P%4Zi9Xt5;=*TiLM-Pf7jIVHrR1ih;R+OH;Z{)B8Tu7o*%h8z3X!4mbn zvVcy3<4{dBYA%V08YlI&e&T@E8U}$TfzeF7WY?L7CFpApD;M{lS#$!KO|JT$oLb!#~)O%40CBiMojJ4n|#z|dWyW3hU*o-e+1+lNxx`6 zA3W1_=8_?8^c=_cv^A%&PgUcTTLRZ*bZ}|uJY)tyBCQ5yGL#sFjw6;jh`UN8o zn&HDkoW|kATd`O@r-<0?&VW9pz{YnZ3SWa0{fA)Jz3B}jGS+)mhIgbK;k9VvtcEQ$ zL*$&57LZ;UNvOl!y6fCp2^m_XA53D%dM`4XSShT{E zsOM)k9!c1f-6vF8q7O9Lx3R}1W*26S)dO>7!Bx>PydbdFhZwZvsja2Pr|{5RlZs5& zcoC%e*bfX$({kzW0AZco7NW*{pKapb%t@9vGXXHC&aH}RO%jRTd+X6&XrVi6`G26aLT!an`ZOYDPbD~G10}c}5eM!8=l{I_! zu0(7@l)W9zjz;@EakU8tn~0a&VrZ(L|K2pLPXh~ox^lRSLe92IU!vIgW9A>32Cni!d; zr=8J`Pw(Oh+%=4BR9J?2B;@4OVo4k+sbzV{_7enN?5>&fPz z((H6<0i*1Ab6R((q)0U9%h6)1dMwvMi><>MVLyyY_oV+#69Bg$(mh@V6tL{+yz$Xm zNJfyYox&c#tn|gF7HMupqIM@c4M(PWH*I2kuazD8A11J42n4+ z2t*u+U>RT$g)~B31%Yx0Q3Q%W2SgYPr9zRUdjFehQRe*X~-FoQMzDhPxKhxcQM=Lg}#!~7q) zAoL~7+q=&_xx9Z_0ECFu*HTVh46yy^XVgbww{HcA58=RGBk80_POR{t!nz(m-P1*W zy*-AnYH)v_)MeygIR5<~wN4^Ax|&{+wm0`c8hHqOzP6f?Ts$}AJ^V~;9OxvVz77(K%aO`5cfgfz&Kr#e>M*L9W&cJY8@bMlzphtUH}f=GCrKJ;kSMv`(NC* zS2zHF0Br;YnmNpy5PrZP{n5<*8sDq?)%Ii4IdqyUU`4ryI=l%u^`pCT#lZ|@4B~ehQEiWK+m}~DtCM#YX~<1cS1kp z6_LRQL|)AZ{&widAZRB)qQKwEz}(&FK%ndbpF}?1CVmA73~zi4Use6w z_qj;AUd28_c3%|VT*YKiAujK%jt2@0{1jlout0mzvAg1c_6T2g9eu#QudE0pA%ceY zg#2Aya(UEPz;DX3;_3tx7%>9B4M0D`Fpq%;YSj~X1RdOY90RRZ$)pq!nL{j}xQlVc(7dzZS%WxbC9f`X-Z~2?YpUr7oP*W9 zKEh~=X%-t!NDdci25enhAZZvK4>ot>9Tw8)9S+f5V8lWLDe2!@4P+@ zEM&n^p@6o{z?L0UC47Hl=`(A%Q&&p4tKTRx%+mGHX5~_ zI(!)h;@I8#i&KeUAhyMlC`Q(2B6s<)pmW?U2yZq=CMGQ=2gLt5F7@9yWvpq1V&9Q# zs@z)4mS$>6WDXp${kvV(-iU&u1QCdYUxFRr@0(FugLAQ~lVH6m5UDx7BbH~c?dpz9S?xv^(#sfV>gN|ht=a51SGD&?{!+u*H~y#%=? zO=p%t#7T0XKa1d%OvMSDsuJ5k(INyqia}NE)Yf;KvAd0ztVv~Tf zKrO;y{9y0mb3?Habau3Cznb{#kjXy4T--ly=xKEtsi^5<-Dy%>OpxJqsad@YR~(uV zf7$(V-V#EQs1q3kxiFFtD<`^hUF$Sk=K0N{l~zDba+8^WZ&XpgkhXA5JG5T}CK$v9~eJKMR-<(^mtVyv|;@_$R8x(PQCee{&YC6lGhvwBi(uH*R9F z`GKS`d-NOIG`;T*t&_QiXCpv*ASQrL#?In)qu4ub+_70t3tcmx+W%lnKO36lXEW-B z*hh=}NHH^F(oaM!jw#il`M^T^n0{oQ}~hZ5tiDkz;yfSrdccl|KkvR|@kMo7-&`Q5?65Pk$`jtAAPd ztANAw)G0u4ZQpXRt=D228$hG+R*NgHav;~xaIr&&T`sxoHFUYMi`2D1TQ>5m`m{L!z z{2}nG`RrMqZQnEdI>vxu1%VdaLroaKK#@B#LTV)gv3M z|2gP%V2bdmyvvJ@6S`z-wu_@ETcG1-=nCD}3<)6M&nWc8-?!3>$)YfoB}1xZPERDa ztY5*6OlNdGpOx^U9t~Lmw61Az6uKqYt`Q?1|aQm9_A>~S|ETAp?~O^l6vL62bEfoUagN^y485;0kOkxloMF4;^4SZE zr#>}2q#ipfRa*R5YRT9<3(>`wgvP09wVViCg{-xy6D)`&G|xNQ2>XQ-_%VJqr-H2A zh1CSKvD$hV_sb*_OD?hdQ4(sv_gDR99|J4X?Mn`+WJ&tNmge)$F)N`2feg>ubrX| z-&@64G1VqDM2g_(g5iwSI&ff{%Itp7iS-sgUcs)HRj|${op>m2Y(_5Rrr5YcsZLACx}Lb3kP~Jy;F5{`&sN0xL9zl)=v6( z)K#WWvwXNua>Z^f{y)afsY$S~&9doA+jgaG+qP}nwr$(CZQHhOc6H3m#msyc{U1)m zdt$Hs?1lIZd>t=juAr1zDX^7RJs9<|5`^W_u&LmquQ}Oz)E?BlJb3)7V*%laH4hjf zvSw2|x@JP4&Zt~ZaS}*?^(WAM%v^u?A|lfk!&$8QK|17w#6?gh?4dgzu768yJ==y292_xg?H6s7cl~(63W9GDMj}wV%WK&#oa9G)+j`J_ zu}*&Ylhk_?Gf)Ra_XYZlx~tQA$NiETN3MQ^W57fjZ_;)e!L7(gn<6t2j}r`5>EvW| zzWRAxe0)+}6Bd~JAbhIfbj$6kHN48p!m-5~YeFFA)sn?wInv; z=Ubvtgt;=igGQwZvRN?hR$_w!lmmVNlysc}CJq7|i_EJ!0XcQ|wIYskQr}EARF`MW z{58zw_tdav#ZjjKOJ}>TkOzd8b)kaG(wZWvvsRCYYV4wQ4=;bw&>O+og2j>KQ`|>o zdNdi0vi&eiGtqH%0qgaaN&VBZp9|}#PJCTQVlIzC1_2-P$Dm$G@Dof>gLBv8pYgKv zZn-O2H=9j%dZ_ucCE@OVd}6C_j|%@tYu~dRx2EM-E022T@r6%$15IgIuWx~2!7OIg z4<=H<7VBh7mfNwdc3aSO0xuB~q3V3S29Wc|I^KxPQs@;+eJ-ilT!QZxzVJuRL@>>q zhVa8-78h{sxnDtE9`1Gg96S|-Ufo&oI$p{9bVC}_U)+S?@hqkAa_uMk0T5ZS3GWK5 z)<3AW>HJ}-rI5G9oY#OB%1U$2z-5B2G1;sJh1#s6rcM8{P-1k`2Zmno4E4naJC-DD zlnIniFiD@*m_wiO!!9u_J}bY;U<4t{U@UGTe6>6L(^;R?I9p8Ki~w)%K6~PspK$|7 zlopZ}bqvt1#f{M%T!sBL=Vbd(W19B;El0V%^c7GWe$3VpJ?CC zaajc1E7LXMj*Ln+xUAiTQI~6x6~nhUF1GOtON>VxXuiLSXIvqALT>B<394(4S0iKR zaD=68XUe$MsO@R|;E3g?D#HQS{H%tdOAZi_aazjdG;=MJxH4KX)~O7%wPsJMstE66 zenoy`Lm{`X@B1f%YK|p<~F%*_udBf{?~!>bu{HUwd(3Z`{& z8uI!}GDl-9!#M7ZQ}ihv4(h#@jRUJGonrO69HK9$B&M(pSIL#| z?yO_3+5&yjKjxHLniY|^HeSa3f^MZGjw-%-RMzw5q#&&?U%z0jy_*IG#1X=xyV-@x zm_e~uwEB95RGFnF)v7M9s}3JD6uOGd>0{>VtT0mjp8GH??KB2 z!~~{}@4(6Z0jt6Qh86_WjHk)%ykbPJ-I~t2#1Em`A&xVCtKx&B(=j5p?DZG(VCDP- zr0VzV>sujP7fg72{6HG5Y1nd9LVD+H!EBE%(7*b_Bj}Me!@a}5$OyGx0k_xDZGK~l zYds@QfB+|A=Eli#vF;rS^h=N%j?X@!I%;Ayv-Ob#_5j!yNg%=n!^AUtiTd zD6~VHzg(nbKBKb}tsA?|Ltt&sZOWAbcK=k5XEfaX}HKu@jDNdFdN;0 z^Arq=c@|$68D+LaOmk?c)iYhSZ6B_G%q&Xms}p+cK$t`8R-WMKC3wDPGlS7`t4hqw zOL}HB)^!RbUIXpZ7Ep4c(zi`1#C4k8fX1u6fwJT`MyiByj7+UY{%*}-c2scdd}RMt z1uOm-tGdTe9!FEI&mZ?k^Bd>ae<^W-U`g1b+d7t$6Cg{`i05`7iAb_Wzc@}!lr z7Hf%GdY_hs^nNnt!#FNH<`Bd$^aK>Ns_uxos3qM^vOIf~^4|aXC`kZ6-m^qYNb?5G+Ac$)084Ry1pNH}fKvF&LPQS=AT)kr1Yzx`a1lPTN zHq9_h3p1rDEGH-XvMPnq6#H7%*;l%|Qy;dJi4ZSuk0nav4j3d=9`czT6k~OK-D!KV? zLz{FbRFP+;@?jI!dYaBLOxA-*QF{iNYAlL>%3z6P;20^cQ4}|I)&sa2P?io#A#eIs zsz&~opEjA$i>$TVbM=RMN`IZyeRe@!4G%N9t^_PZe3U=hMqPNayvtLj%oWPY86)|! zK2S`N9_qfuK4{sAaYc@j7~K6=e@jEhMU3OMaRi^G5BOK$lY#wPSXOzzML!8`S$Im~ zi1(*j!`#+nWDBpN4kV9s!gCB&JBlFEU30#!SYATs`O33IufV$w!NF*nsE=mBH}ZXi zx^eRsx-)Z9?I!wXe|C13Piy=j|I*|G@a zBxq=#Ll|c4h+gLv%p}J48>;0KjbCR!FIU}8%A|Q&7AsUuk1kq(bV951)_oO#1RcZ= z(A=L1qRMXK_}a5Z)~4y(|3VpcvXzNDR6mlKc$>sgayz6Y34>%6d0kMPYKJ6Aqb9?a zG-99W+Y^0=q>{8$Tr0GRIMQZCN-NtwGvpEn4?M}KrLT^$6&AYfnq(+fiwY-3=G&W6 zuA&9J89$m6cV%@4b~d`lILOt*i>nc&V#0myZ(L$Ku!^|HSg?1)>J6GpR4kwh8|8NY zMl1_$b)!FxTW~APeRTdhSysU0y(YQ2Dzs5QgGun3%GC7Z7i81tON5m#l*= z1+;myGJ0kfPZV074K~f(z)@Cd56o7(3U+Q-d&t-5RAEh0Usk}mYQO%wxK+TsaOyf< zs734EO3<8HxC|n07?SYprtvjc+gGTxE|gZ%c=K#`>G z>p{UsuzY>a&vw2^u#mNUu^zW7g?pK0WfV~OE=(;b8TwbO5l?D2b$!&zC>9?wYQp4R zR^@vHiG$!KPrX7xb&GL1jchY)AxXkkl-6MTcz6AXd^5FH?79FiMf4PV+dv6f_yl z&kB-_RpC?-HWwXZj(p+fRsmb(C6dqCf?MMiPxip}8$ue$p<&;Z+*qyZpnN4tDb=O~ zHfPlC!9+DE+W)3n3>XyHNV)wSkAnq`x@m&Cl&{C4ice)UcEun|5>W*PVs${COt;^e z@KGh3X9vp&^-j*hu3eKNn9Jq%zL9gxbl@Lw&y30L*2eQl_?b;m{~YfE^=rsv`C-Pnb-EDKWy}O7Qg5bD8ki7IK3?e7O+xjy z=Ulz4oKP;S4m>aK$?7_KM;yy5B&zC9-Lu6qG0rOUO4KTl3|I?OxV#Y)irIoEQ0Li0 zWkqpSqy~FO&Oyp-&sh%5MCVSW+cQWM*KnS6-_lNeH`$IF8duVN0ZrZBpIK4zXro;7 z=KTew)5^aPNGac=ah6*e;`Gz9%H76FY%hd~K3j#I?H~YajDvH%x_LmHQ?6_^W4Hai zV_+hImO(zWxYDFro6q)PgK_*Vk zIv1iL2o|91%5~mimgr}0zd5!H8Leo;Jf7{GM-H>+Xt#4+7NM_8;vSZxp;?rzdpE!& zDON+866T~%_c%|(0meg^)@AdaJIGJhw2>ZxfhQ(cn@Lee{T#4`vWLmnJ#&SXO$B%3 zP!7fGEfWnvP@Tl15%%w-ai8A5DW!gr6pI|8^H7eVU=+QQ5?TL?C?AdB(*0r2&4c=I z=-gYA*1j*ud5HWLX>CGG!ciS^J$ZsTdoya@_|>#Idc0%M+GC~Ovv&`En6C`B4nBso z85=t-evj)Lb9laK5&9s3H=wo=;U(M{!YYIJw269DbM9m1#h&pHo&7D8T7dtA^~s5t zvaxOKgE4%{5dq;X#Pu%17-(D;9wK_Jz^Q-r0LRt6monLqiy~@Um9*oj>ovj2fYjQ= z@J2jhs9drV=9STKJN%71j47QTJ541akc(}svt-2;ix6Zfx!&`2GeSxJLlk{~;Zj(t z(Mgo9o)e*LG?cZrbO>iR&d>%r+bNoe8lLk!g|oPX0FvAM`aN!%Sa##4-B=RB-OHF$ zoV%xwb2e{#KF-N;mkO|N2>lmt%#?A0u$bli`G-fHLF=xb@ z&`GMP7OPA#u_3BM`&TbtOWtu6Kj(ZAra1PP;_{0>Q8hoyM@iA2KrpYU{4)F(6f0i9 z`9DxLw*N%gnCSm6%0|cXpRWH|*jQNq$CSbIaA3 z*v!5T9R-@4N9LKv0U3?}0s&YINYOEpf{zaXj*J2XBrL|pF1?2ia%Ia2QHn8z10zaM z{0p3a01Iqb$D&LJ2DKzi0QkxU4-iKNKuiOZ5C;YXNXVDBw9A*&$;5|p1@X_R8w~I& zCx)I8qzHO^atQ0{G@y6+LSQ)7dNx4Cv_S2--B1`6i5!_s1ppJD*f& z0D{gwpzzlLy%3vDN6!@=?zfQ}dw>%c!~U<+{V0>F?O$FBzq`W;Q}l-3VmZ+0Jm zPaw~?_!H@y5&`?26CK(=PiwnR43BLAVGlsG58&g1Ljc`23IHG~=m#hO!3>!N_X;9} zsP9Fs@3uM+@IoR4fG%Yp&&Mo`a|*O%j` zoeOXH12CXpFVAmB;|K+GgaDz}56thj zfj)}0q97Fa4{y@%v6702JMb5Xa1lU&!T}!uI0)h&F|jZ}pr7j5JzSFKPX*;T$P%7OxNbGk%igru+lot=T+Vs(&xHA4VC_*Yc|`a8WO zu<)n?1$1lh04at5eSpU@50&-!esx$a7-VEFUG+=#q7lxCUxgq;gWEWlU)7*i-@U87 zqPSp>A^c(|CGzm;bf>BM)~C!8QaS;bgCLTVIP(xG-SP(LHR+~4G8{qam`HHR*LljV zAq&tZlY}Fs-|26#GooF1UE{DiQp;0=du7ix6nKy)a9*4~hv0_61?V`UBnt(qGni zjmURu7JH_drN`*(^Ms6MleZ2tcs;5&M@*uBz1>^8=-OtS$@{ywHoGZU6h0D&iOvo%ooCv zuu!LNHoFa3b*30UNT*$?C@M51@=0TcGMF+WpE}WfJ2sOM)?($xpzz79*54_*A}T9* zn3M-{?xIV+ktr>i7+$TkZzoO(#f3RXU<)+-E;<_91A|m<#s$8A6`U+`CLJ-+ z{4u7YJ)s=lP z*m|XNMcRw*ghU~hvy^{d6UDN&SpKtO z&S_5QaO-h8=k^edY~)Pp=t{jdZBog9+qn7q5IRu-U;%lvZbv@9OtFnmL(c29K-S2o z+)$gaWVBZw0v~T)1Rs+qNHmTq!0(w;qqiDyXs-yZyd4~}xo^(;D4LO?VY2V}-4n;y zRRHfiewzbUfX4%&c^29GEHB`^g3GnB-NfQMR)krwDFtur?pl7tRuEp%$KZ3J?H}yF zkw23>R#7eX7+rC~kYo~p2NAa88L)rS2kUB@`6tkqGUDp%X+Z0iB~rd*W3lkyJL=?3 zd@J!*OICFep>^4Jfg5}&e}LHms9R5Yw)s~(kzk=SqD5H7D(EWdGC!d#dwj z-Eko`Hh=L2CRK{-3XS-3!%S99>`(rZ1qL_9C1~Z;mc8|a&eWng<=3Z{sl_Xe_I$Vp zAbsyj5)>S`HOe055~GD!tZUs@CI#_y>Va7nC1*l?{9L6bl(Fkltcemc*ZdMsgIm8f zr3DVwx_;`~$-9inBJvOm7_*O#JH8nq!S3F_btBLqw-|64m}blDZ|1Q{FohU{;&36< zm75Q*!LMAqL$MmitiHL%)(iVfv#MLubI{RZB`MlWdoi7_USa~eZX5j#IALyu}AuN}V zAlCa_R^de4>gfJ*xx^~ki+JRd(lQs^8KVZi{wLI4L&_xr;!f}kl zC@1Bqk=+Q<7^GCfD;N$eMK{+5M`tI@s)8XxK!Jh33PwJ`kRM4E-|-kt2gYl)lll9I zY{vY9mp{g36@8A4Jd6q0aGeJrkOb!T~5TRzw}^IKwf1L z{M5w?>sVSNsXs>tgj1#YIiG8Smh^CdJ z^}UnO;5*bLlDoVBbC+MrxjlbNj^qI0IE>G){&kea7aWBtEX#CkOQu)n$Pm8OY~szr zW<7Z*@g?y}o8)Z-sDBba$FZTFnCuV{Fs%Hfd6|%rtB-*fvlg)%9`a7$*5Gu}2%)FJ zAuIBu@TzLg8!p|4XoiNlWp|usw5{{%uH~WZEXI~g?YLHGos(`eYMN!_WwszP%a=>yngKGa1VAm-uce-RURo3~>W6zsFq%)YqwT1}4)D z=h=6@QuO(q#>{CpX)LFeq{l2y1`mg~{zLkh*%Nu=-ty_N%e?m8HhBvxtab(z;m%>} zT)HIUWpan|Be%+S%9+3D%{$f0uJMd%xvR||VLQp!?As@hJgZmN@MaKt0E% z15vQx#`c+5e=|#f&6l!{*Z+*NZ31~GV{u`&dni5Lqw_mM=zb<^ikCR`w|^VPq~;sT zd=eT?a)-SFnt>SiuTPHmc7nU~#H+_;hj`M2L7pAliM*tNt;f(aA~MvjPll3J?&n$3 z%Ar@1WAk~>3wd;_qfaD!JwX2*doOpH$;UC;f=xA5P{oYt;HO(bziBjBfY_4wraWis zRhsc9BA}EV9I=-SZsuPE?8#D6m%lKW@5S&asTZcz3N*9#z_QtEtMS%U5x49Wpr#KU zj#Hle-M9UpgTjN#Wklm|I@Yv;qp`AE4exv`Oh*I)i}dpBMB1IrMI0vcu`)Y9U0kjt zo#6nnaq5mcTSx}9Es|!`jo$iikTck0Z6_}uO{_7_adGh3L6j#%MhKX(qg?b~0k4x_ zj{f35JTmv>$VJ(zdkXURG$ZeZdcuGRNQh^Wx;6I!#_unKXR7y|dkl_))-tpMjTfZboaXb}^{pQV^={3s zNnQP>)6jeS2HFHrJC!V@BCfRgH9s5iAfoz+vKHg}WBRi?{LG*b8Yoc!6CkSVmWn0v zl&Y{6O*1HhL0UsqrZUjOFu?&rDbS0oPg2vj30zI-&?)>C36XIK%rmWPHdk#e4D^gI z^BB(9NM72@Z3*R+K=Lmjp$uu-%$}$+`5VgyTf79RafX<6EQYH|2|&@}@YPkLx~UKr zo`X`3$0p;lvOO(7v!*e*p-54kr(@&$=I~?}cJQ)rIegy<6GUGX9}HpmCl3t_wsi+d z6&Feh>-8i&x2i?k)aOJ;%^>;hKDu=K??Ow+#;xp`EC+D+EEAj034JiibrdA%5o_$0 z+v}4u`FH3%?DKw9Xtu1GNvNc3Of6He||HnsyzSw@I4lC)AQ`=eiiin^n2rt#ry$Ur2&lNQUj}9(&8{6|cOVdjai=+Co;ID2k-C*|R zZ+!Od$2-gG7cqvEzdms1*VOJu>!-x;Ex4}G(49#iVL62=1~c|N00A+D%&MJZ2g=G1n;CX`1(o>nrLD@_MXeLR>xX`{ z5%*ljl9N;v$sEx{?|Tm9g4S%<`)KtrG$>}bgY?&kR;t*AyB0bG2ETNMss8_sos`S)gotoZtbgAw;X1@QkoV}>02@yO{0Q2 z`=VBXwjo9C4AaiGqB3cldY)bZvDB!JLymt>kj15Sf@E6JyH&O>C&` z_iib8z;7OoM(d4uP1+M}xxSXF0NU9g&pC;#DhR>q=%6Nsan?72`{ZiJto$>pl(O<~ z7#P#}rtq>$3YzN+@qEsjx{&!4tUdM})UjgXK^m`gxx$y3n^n(t887t#@ukIftv!NZFo?&>3USir1oEyrOmub5Uil zEPKM9(+!iZpyx_o`Axh|w=z=CO5U}MQXJ%bK1BBIK@jjgY5kSa#p2rJo~4UxeeZ-t z-nr+N^}nQ&{R${541!Dm{1g~32~58FEWC{k*)LWe_mx=45s2LNB9<%Fl|vS&8Exvj z!TB$mFp9}RZqhlfx^E(jX(FnDH&sLiRVx=z*(h+V^Wc+JbfoA)-|a zTeEGG6*$M};kqlG%4^Ck;{1i^nbr#L$aKRnJjSP2i!ZH=OR#TBcP`Ikg3N@R>=|5p zX_RLbq6!jc79B;-i#hX(7z21^E913%9QZ2O!@+SJ^=2$_c!C@`@RsGa5|mE*IWwg2 z=$RL>d>>=k!b)1z5j@Igl4E~5({$UAQIeVuVbzr!LwmUN$V(S z12|~&Ovi-DiH^k?Z|LZK#BoOLG>iDmi{F-sE#RJ4z{42w>JxmrS48V;rvD{i(5xRl zawjb_L-VNo7~B}Rng=5AY9%>8ZP&pLh3xAydXsXO^keaIs(jm+*Y+%VaT@Fu2D2WA zX;s*XNSq6trgreIgoRdy=(V~jR3FuevhN{g+GT$lP+||46IAftXJ)xHy@A%?I$w!f z7uj`a*MmX8CFU_9Uy-XXSNa1SP)v58;I5>Wn6wOww;VMF8)L{@c&~_iHf*-b>$VZ% zad`1$t`A2`w+884lULQEO;$zdw4a5YJz>srq{F08EK_l5%~8%s#6-J%?T>h`P{uep#&f_JzT(%gUx*IO>u%kmbjr#a z>E;epc294&-SQ)mNALT3&3(2SpvXg+k${ue^270ak(=!UA7w`tGS!Zkeo0&IQrIZ6 z)R+^tRWwZoHK@mn7Mw^G;E_6W+6a+YnEK7CSYJo4H$h0X%e<9QqQeoISHn3#2BM_n z0{@*{1&j?CooIrU-xuT6e|4a;A!_pNTJv%x$t)cbSgxSwYJSVSXC5-HYxM&7Y)bqTi-#dtx?b|dGEA*pH7#?Wm( zF{z(TB5JsTll3;vuv~2RD#0zA*79X+Lb^WDxhRnQkcj82hZ=eQNH>$mKlF$V(mD-`XrnAA|FDF zAq#66g|Os4(_QKZ0w$s>APa^)F`SnynkB%r(F6Bnb21uaty7aTUw#b_Sv4>vL|S&_ zbS}@-#R?jD%l|RWgCZeImoXC_#X1h>S75S3+NkJ+nbFDxwcPu`k>i#syZh=H314)+ zhVjrekZ|d6K6rISCjGS&vsDA~tT?HO@mzXp3+D=wG!z%8A$dVhKClj%dTYRtGG5hh zmhZvc^Y6Q$cJ{L`56T^khIAnP_mbqUwQ8jTR3*o(=Cr5cxeM@KxEp$`xMhJTp*c3# zxU8qRSi2`ce|qVcsLQk-?&dJ6^6d*62TqHkH5$J@O#)ud1vqcv|bmz`+yuM->hoZMPptRW-W@#w?8>J|c7vic+M%u^+lIaymyIt=t*rex02IzP{^*Pmf64h(I8 zc=L{gq2EamVUe>&z$F)`x%Ez?e>_$0T1#nGyZc}~#_JNhdb;%`WGfh5_!+f2r?=!8#XxdW)ZY;23Nap5V2;?V3!f%iO1O&hj2pHZAj36fN zN4SP#0yB5;r;KP%PL&WAG^h~`(Zn)Tp!NL|r4Mu;%#WCO=;l}E&lo#@JRLYX>>N<(6@E24LB?yG0Nc%(Q0Jbkb$PYzeP6OhW z2H^e?NN}N6xX-pMLP(InoZ&0b&w3Rw_CDb2`=uUmpyuWmkpA@vv=>NddmH~U@-HNR zX4p^tx_~?Y0w9FEyuLla5-7lP&>Em`GV7B=$d5~aPx?Igmsb|T3;-4rcp2UlSi}#} zgFR@cARt*0*3#^$FXxXpA&@`73LQA49%yrLfA~*%42z)kPuBdT=l~a>36R;1KLAj# z&#${@KuIby(9PMi?Az@(kn%E0lyZ~%FaA%gtPbuz#N9q{IKUgR5FbDs{s#dm4fx%s zYx*zrp6y+4b%)-XZYt7SX#wUI7+~C6ARu>FuYKFEFx0=}yFr*Y*FV-E8Iy7VtGr9B zXz&Prd3brhwt!zU@4fdws>#1-&%d7n6E-n1z1v#7-@l<)S0Ij0ACv&n#;nL1s2bo+ zY2Jvy8!sS*!}{g0CVWy04(6d^R>+d7{E;evEbA0P1$F<%>*`L z#2W6s`Es&kL1&Z1Ko9s!Jrqsnp266Ke|A6ccMcpT8{HCT#1N2AmniW# zrN5k#>CxUxSBhId6`e|VLtZ0tB4)5mAxnG+ zUwt0y#ixafWoupxGDk}n0taMqD_HS%ci-vQi@_x@6Tl=o^{MUQ(yNi98Esb9(dHW$ z9>1kaOn)3GC49>5(X0h=Q%>Z4p1J(`V5JJo1lTuC##5xX%or~%oRl`Xor;*R%^|6D zGawAhFJc6$Pg5Z3a?iV)N$r?+F2Xp1ew-#HwW8dx;bPfJ6<1>4+8BUIPj~{6=^QX# z^UU;7_lD*-nYUCKyO&ouBd+h#e59ZWG+QwrW_6ocC|5H5OZDS|J=bjg(~xv3*KsdA zg%JxC^y`S}Ons~Yvp8|s+}AhF{Bg^`n$9k`3B4JF{V!uw;>PY^a)EZC+f|F^$`0D??I~ zbT{$15+yIY6>r+Tq{GaUCtd|LpV>*ap*DI1CG7I4f`MdxnBKhrMrOwe(N(667QQb% zIZm(^bJTFHcqVc($cGpp@&afZZ5m)*TfCegz3G6iG7E{8~ zT8MX>C(o1pexbHn*gn5HqS+xDR$Pf*wfs>Gswv|{P$}N^}THZc<5Saka z`@$f^H5iYK);3;EVi{L@%D0P*o%o2}F8+(v2qwo>4j<3~iyCowlWg3Tk#foE@`@%o zxDe8f*uiF_-ra6?r}o2R01AN&jh`Th6M0lq+s?MV9IwMuWy=#s&MS*SD z@!YFE{ip=*5Jz60Y*@1XMQCA^LKf}+<*XN|Eadj6*a^X3g86Oly)SP2Li@j)jGnR*Ke}vWR zgaC=iZXUp;E7F_KD=1OAKe!~$vXJ=p z;3e2qg2~9jpMYV?I?MyRb#^ZJ^94v(Tu91s+=pb_;wm}#mO^U9#3}QT zM3dai>-w``yqjp4OJfDZV?7+DK_mV(!aJ-c-tG&JwMHvOz(XF;@-4@CgvH=4og{fr ze}&)lg5QV?oXJv1hvbK3g52_+=rqBZCF=G1F@NZ8x3OC9RMr=9u>&7lk=$T8M zj@go`(4L}&@}TU=2Kf>|QsuU#RQYrfJ~1yeXt;abE=cxeh|PKx^DXle&QQ(EI1SiS z1}((;4nsqv_1N_4sY_I&4mT{@ z_R0_)ZvIxkw^hM?1qU2OM9U)wuf3jEy)V376*AiknL^+|CkvR!9Rv|d3t=?pNqKrn~1k0z*ZOrfXR2BKSK*-ZFj=p?ol7bfd%Pkzn<@|c1 z;J#TBS8b+R(sg@m2}vw-9Q1m{jZuroE}3I2%PQ*Nk(|?;w zhKP%oJxXbvE;5H*i~HHvYm1eCz>nOBdRayXH9rliP%vFHMD=L*Ewl+}_e6*U8hHpO z?ijh~4|qVk!yQ~Sh-pR>gpd*PEK{%M;&W%QWn}Qa*oUJN?<-1A3hCS*9~~y0J(JNb zh0m;p0nw;DMro(J*#kL3>9{X?GEtd#_)0zNw7_UbTGJ*jb}I2P5iZk(dxuSqqtX-~ zu-zAL|JDgKJ1Ub5sVL8XE>SKK*KOF1dn$JW+o~0{ifH>uE{Wn}DJ`R#DZH^$pL1;d z+VH=}7%R@(Nnb63Z{+PY#cPuUK99-wivn3SNo0m6B^6vYxyWdgtd~$iBQQPHWdFKw z*AAxWt>bY~XW*MP^yeE$x`jNYwQp@IBs%zx{O6kYnk2*4GXxMs(8F-Eq_(zWL<7ai z8EV`tu3)}IEh$2!J;c!4{dSakgOICq#wt{;pi{`HEZ>J+CUhW6m4l# zOs1%vB}n71s}_*m2irZ&BsW|i8NB&95FQii|SzCtTEvEaGHn~q` z$?Hq*9;Z5{M>wZY=hz2o70byH*+%TGk_ zY5d$>et)dMrhec~j6Iko7wj=5qarwHk++9DZj(0~SeJtSjw)C7+fE7E5Ix`0O?K0C z?zjm^Xd3(=@$8a;7wa8zov#-}ZB=`Z&>O%iT6IBkMf2SJX6!S@8105}w<~jCWs@T! zlW+3259iq=0Hsb2rjWSJP#z42>moHq6;eQc^u>%GeUpA5o>8CA^}Rm3kdRlGMNJ#} zZDi#6i@BtkF)m88lnW~A4P+2rhMzrUI+<$}A&Q|cZ?-U!*x8hazh0%-p_0O}-!eDq z1ZC~?#{d-Kx7=DeXb~NDZv3@q8ky{G9L~%w6h~!n2iJAcI5?x_nPlGYtC&YU*A9o@ z#%kTNB(D=6pb6*8nCHYQ3pjCc4+Rr}h}N2n1m=9;@uA!#5Y|SQ(NBmUE9G|AfE#N!08@0(&znFUlv zI8LOAuDb@QXBmA3oO;xXzZ4Fal`-E^dLlwH@M3bo@#<_9PT)$nBX;NJnfLB>4lIfpMr4Q%N(Uh$y9L=l&jCaSO7mdoNHA2WIm|s&lAH$ z0c<|+i?gqOAM}~-co954o2-I!LvZ)(K3|zKR>KjJ>LoTqw0$Od(~)Ce$(Uf7s5W%s z6{zE4YZNU<&$BYzN`OWJuS+PcJNfL*wO`CmJgzx#DZ1x!vp^XHa#<8|T+D&z2|Qow4`-3t>@jFDNh6OBS(S81*dc`B7}Zv zQArclwLjs0$i_iCpQM8E+^jX|O3f7WZTihh^?`W(exhGmx(nc|vNu>`DGW0eJ#X){ zlf&o(i^PWxk1v!dq=X295`D*rJB(o<eonMT6^S?m9ZKD<-a~n_?j}MzLmn#1Q+mvrF+`rGLk+`)?iZi zAu|uPx?g`>ufUm7y$?6|bGKTG(e0ohFq=HfmMC$?D{p>|YDLY8NZ*eftUDO%FPmIyfT72tIF(TsF{eJ9>v+ z_S0ajk$XlFU1d>bu>-zD`(HY+&9@5L2`ytd6@tDAxPJKD(g&YN%XxN~IkafCs)s8O ze#Ae0Sd}#AEP8-}++riSn6mRONtM6r*FS)fU!`+IuBwQr8ZJxqO$%x(nUC+baC!NS zNMG6~yzd`$6v|++;@CV5_j-|SiMH7$NOHb!3lhcIsim9d8pZo}ivz%)lpttqy;Qz( zqb~0E!6twS;bX)Z60UM_@XHpIIOPzZP9Ts}k0qzJmYq>P9yNC9j@u>2dWC=aWq0(B zOUKC*(V{NV9MO+34E)!XaEz1zV=l8taHWyf7#HM|qiPz%>Q#Ne$s>xCr}USI2-vsC z+)_2`bm%H`f+cOwtO;CMOcA9WLY@vV6&$z=U+%4V%u z?iP%%7b1tjI7c#jRxmlIbIVZ^k$#Nc1Xvf_2^lpl&#sC7tx}HTy!o?u#=kXoMTQ$15BYNqOGkTR1pBl z$cnrb=&fxz&4B~=qYLSa1co1GLbEdJG5}(GKBlmjFAU+S$19j9x1pPR!ijUsv~dn? z2FAdrS34s62QgM_ZGBd3wJd1ndZG5l_RN~Q5mp}AqRVLxIQw{i4YMUY=twUq4o z$e+>rMm=}} zbDn3ft97yGPnh$jYL2S$5@q5+H*RKtE^4HGNQ9)K__b6P!)89ETTt<8Q1VvqXVz?c zy$>`lNZpx1Q>w44oQN7yY^(H9|CT(03F=13ZIK!WXDCrBZjhd|RCiLo*mf~c{@2ir zT*k$2LOs}qv42N?IW3r&j`AH?f{s-%-oLl6q2Bi|1rd5?A(PKrv+i>8kC>D#Og$VM zu^M+kB>5@^7298>$$v2$=5AtISCQh0BtJBLIurXwiK%$s`*h`lUcp*$Rxid}iLz$JU6z(Ot)z)mCW$py5Wv8YIFy-u zFTEgF6_qYmoLb&1IV{0Qtu!=Q9-7K)^V!Rwv{@l}6++Fj?QY$hb%h*Zor33t$b$X8 zS`!g%K11xgL`!r*kU93&k^OQeYaaqMUv!$FrRnC#?nIAu>b66zI5Ht_{fYvfyfS_V z<}|^oQfBv>wrV}w^)^dpgUfda%X7@9nOOQRWBGQ`{Vc#8921frsI{0iIt5i}$gk-H ztU;$o!uLvah*ia+o}CD^#`3?t<4VujpHRY@)Ts+m)n6qW2l@dDbwlT>L8AT}2mJ2C zvU6$0eMLM{1F*$vWU1{;(!We2CFJUqynEK;mrOnH*+i0FGY6tN3ti8|2<}V4T6vh68<;%d0OGnA#K+*;&)Tky#xAg&*?9@1`D=}z-d}^{7YcZl9a>%r(!+W? zP^Ct5ih45eW-%s7fQ)fp-kQGGb=VcQE!)l$-@5mi(c|GiF;u2vZoG_4wY#Er_3Rn zTYweR%#>rRe}yE{_;U$ZP$P68iVt1Q)rC>k*VSK8>1VFwoq9Cb1e$Adq6U4a*~%HQ zkx;?6vP{0a*J|GvX-()SNcE4_VBZ^a_wfUl$=IuuS0_-|3Rub>T)<*4%~>ltKrz3C z52?%)HbX4S1CtNoZJhLTs4>Q)_F#+RxYTlBi%~>=bh^N<2RL5)xfT~fg>!3jXPnDY z;Cak!VcB(DOXGLA3o0LJm#>HY!Kc2!c4v@S^*V!~f~Ue&p(i^t>-=Z=_v}<$I_^lD zb60b86V`7Nyn3_={G|6h)*BQOzCh+-f?sqU=o=NMsJSpnsDk;sxYFs9p!0)oawz)@ zG0CL-olcSiAL+(%5#^#aZe2BA5I5&`luM0IdP*hYa!W;`S0(r?7Kf@Gb(7vhxpsbG z@5l<{t(@46G=k=Txp_a!&MJh%PF7}JmFq!Ub{2W4PNbtw99gpA{8TeAUh*TB2FVG; z4t*$R87v;VFy70n6eJr;o`cE{Kf*oF~pbl2#8b|C}O=3$Nv z(EQ%qyjM|F1z}aXzbsASmGPeo?Hmw`=f-~ z28Jk)Al!Qq0X%24O$-mfI@B$Z9wxEklRH~5P7wzP`e5VF&JVDN8w^hmo@OMP2)D}I zt1P8A2#03g2zTC|em1X43f=9#%!PrAw-#9#IhTq$355K6CrE4it1rT#|B%f?PdDN? z7j>(w#3QIRR#`V_Ph{8@z@Ef9RWZ8qYkyhXywqgYIaK{jksoFF7R(p1FwB#7kj3&hm95^;(1_1Pd)APSj%d7!uy7q|W`3c;bFC840Dp&$XlKtoA=Uxf=v z1E=&8Flpx@K$S)Kiz@khNkeJakxgv_$521KkjA49fTJZRqn&)ABdFR3kQg8_;gx|( z@CxZLp%d$yS4|Q7wR4 z!hZh3dIh=!`I?3UYlCES^w0M_2!-NpqQrs*Hv}@n0)vq>Alck&Q6xiB!80$*hhK6D z8Svw^`f=R_|8B?4Ba*t+JNp*4$iNr!Nnq_Ni~ z4~~LGi^>X~f|C^F)0QLIgL?1F}WBrTF;Np714lb;{U6eifr%j)z zub0`23Wth@h?;_e1Uk3_IA0eD@;mn|rb{QkH#$(z01nhoPa~Li4nY*;9I-LT&=;tO zstyt@T%tqt%jakDb{17g5y>1jC@+9R(F+Uj_T~}`%kt$T8e0J67`zFo&s+hC>h|HG zmXbEQ%Np6EJyetwkPPSC#g`hoQn$xA!m<;RmZ1yw;ad@5TXoGcs)wx?PvAoT&e(@H? z(cjW>jOtOLkTj$e7~(ir{x% znr&daP}01NEEts@9*3rLuKhExhH2lggU^bQ2!F#lr{7V9tKgP{U$Iijaxl)S*(4ih zaliJyap|fyd$H{dQ-EZ>9y=96mNR=}Zfn1S?41JH6h8d+6mg0+#EwrFv6{{#kaVR) zLQXbQoR))cersv%#AdEu*BX<2Vgyf>;JK*rOwGU=IWL)iFf>?s9`4_i$igQvvrD{0 z)kPAQm7RY_>Q2+_T(Vqm=^yJqr2RgI_qaP(c@6Io`75|3x-t{?0C|YjwHve|?qvF& zyyBos!QCkq+KL@P0icIAV~J(H#vp~-s(o2?xvId3<@iT)J$1Evd+PiCLfz7mT45}!X3E*x#O+q0=?Wor-IQY z;X;RQAjtE{*;f^$txd2QHV_03SN=`)eOA( z*9?7~uH$P8beH(P+)E=+LpJ#)A|-u}6$I9_r||KMtx+~kgT}8}x7kb?tKq^?a_$}F zu>iju!31A&lVLbRYyaZpS#l@P8D(9o;S}U|8b^w`r;c`Bz$GbUL`rzi5|i)-skg zR}I$PsceYNBgmp)|WO=QPw8Lmu{g$}A$^r(FB0rD#@DA%n+ z*0}2RXg*aU((bV%z^B_L|A2G_fs&_y(w-fyD0R8)mj0A`%c>U?wgavEEhxTO0=4*E4;0H;+x4>?%DNYHhcW`j~4f;H?1k&#CjuoBf+g8}rd>;;@m@0<{v$K`yyV59eqbyh}XH3ez^R;$uly5*mm|Ld(*6NftghIL_QCP53h*1-rCiA>MGKqL8Y^qO*U{GB{wfHx=I*pish(nX zH)Gbf!rQW%br21FNlU4io@eN}^9EGPI(DE+*-VCm6$5CplYV!dOPqQS#ei9;guLO1 zrZMUG$|ujQAbda+3a7XU5jgdz^U@g}`{-hLNdFYjeOQE9wnDb$7mWIH-R)yi=aVHU zr)ez>uNsyZiFWnDuS@{0#G+y9_0Mf5r=7se6PFgo0KUIrh_t;41kdE$g?9Y7))Uj4cbs(5C&KP)Y8@Webrle~w#g+(8 zVwN!$eqAV=yi#%wJ8Tsh;+)dRQunn={J))MB9VoLrIM$uTfUm0mAAlfE?SsFFq5^nx#5|Q3bM|{R1{v>NDy&P zduLRz5iu;fRcLcw8YBxlzm9_8nI(r38>tvUi>Y-qUl3W=x$AHiG2g=U6=?OX>O)^?$o z*pVO`wZAhzSs!S6RD8aQ>^_bEKW4HG3)6Ca*3*8UYw65@zwr#L&A>>c@y#NMl4b3n zlpOV(?O=o}Hs10~kHE4_xDNUPCY8KrZ^CQzler(n2{ktkpE=NqIL!1_V z^lUwBCg8jAth?egI1r$-<9?LBugo%wyo+i_Dh%`cLImSt= z*uU70EfR-uZ@nr^lKXsTu3iILk9ASC!#ebxduLdlcf$zQh;gm(Be5awnzZespsC`& zVF)h5K#iPGM+m3v{7}!}a04k|%K$#y;%3hbHp65s0wr21kh{Z#G8%A#-wA5!I5i*< zW<65mv^w4tC6YbdPJB|;gIYPX!nxnZt4;8~H{NsZm$tJM@sJL4EAyN74hS;mm`ZH-K{Q{LiVu~j2XuqWvunH&7$81JI}-LlaZ~; zvzN(zZslT(*Xpp8xF=*AT>JL6dY1f;M;la_1})YCYY=3OtNGltZ8aN{=^Nb+sXq?I z6?oHRb?ZacL{@pY^R}Y?jei#Fv)i$TeAp%oBSJe3HAj;i2{`?p?Ydj!-}{4%Y?u)! z=$z=hrBdEg3#+|f`+#wjpgD=M$kH5(_CU3!Cgk(GI2Z5Np5Nm9oc3S!N&Ver%#stb zAD!RlwqOSmv_md<#xAwWW9#97UbEC@dCjdwK%|zy2E@|(= zwg)<=Yw&a(*YdKOqm)t6DNheL5{yV*7yOX;S@O7KT$3~T%;b&Dh32|5V-@GLYxAw? zQmzQVj=9sTOSt$oRk1++ud?BU*%X0mEBZrOHH6{OMiMVoDZ*A|rIO;Xv^T@heS+k! zJigjWb!wyH+GAk3ibzm1I=1p`eF>&79Ra^4goeb%p#KG7c`^eahSOZluBgWx%eqX_ ztSyUgyvjp5zv{ERMCMvY%iu}|k)ve9WK({fG-}{1Mf{1m5!q9Qu$yp?NYh7(#LVYj z-2Pc?0IZE#G^^s=0I-rKzDI~Tpw_N{P8ChjPlmp-U9Rj3WoJY%i?~o&bXQqx7t%^R z7!yc8gS#kRra*;FINvZZQ_DAncEgvPv+23}_h9}=j11khi4UOXFM1zDp(VZ30I-X7 z=XPA-5^FOgQXmYylEmvN!cK3kDwtP+9Qj>m*9VUa?$n&9vbk|6sQFbPdoMlXw~F^; zdR1?&5$SbZxJyy*_T0sphKu7It<(8__EsU(7-GQihQjc+3=m0F#@xN>IZ!JG4$B$j zH9c=nkuhkF=!d0lhaRXZh*{5vqM%LruaiElzx~Wu1fg7cN2{a!lEd^fJl9A9`+Q_- z0Ii6_&?)UEZL)~^a3M4(q!=$Zr!KnO!Y8C;Js?AJ>We>VVr#hXyz8G^6dXRThySr| zmm`5r)|S8$(w?icM97cA($;h72WOR)1i_#KHP*V3>j-1-7Av;UyKO%00%wh zf?kin{7u9zjxsBmQiB8(fpAkMyY`t?DD)Go3d?v0+(Yav41wEzq7oZk)-p3#dqE;K?56-5n^K+g8I?2waBi-{To3+(~W;$e6DYp2n_3}vEy?#iTBEL-iA#Nx5t?R7B&$8S3F49>P4holmbIq%nRL|MldIB z)V@oTl6TvKYA>PR(6D_dmtUr?=AEOKU+so#LKRJxOX%7A_YNkLdU3LX5+@OwjW!IM z45sDlGjuA}%53@sVMvQ5^TL4u)1}RKCk4KHQFA*@Ill5U@0uBYB4{a#=5u1j$n%V; z1DP*pw}MsuvHAT2n^K}u%BA9|U!QcZxTq1OtAPnMaANiK8evLnojw#VbuZ&PKr{31rpJv*Yvo)SH zOFenw)Q2Xaf3e9feLiwIM_9Z@vaH&g=i``XMjxOYS^1+B-ulo<`lMBuB$D9i|MAS$ zqXh{gm?rOGor9S+eh+OfDCH>qW)dP!Nv;EPNWbAF;Z1Pe2>SeM7j+icc0iKI#_iz+ zebor(psU?zf}f3i>9@9ALOu(ue|-5=hwEn+@apOypq;c58U5;0-Av}oSLOX**lZ1u zSfby%bPdBSr2=h(r`ANe_BDDjW0d9F0}#u-FxPQ$_rnHEI#w^1TSsT zCLP)i!5xI=XI^Ora&)TKEtvNQh+EdHwdC=xp&^t01>*2O;|xJXATBT1(D;kjok}P;Jd_4~b>Hay-DcErEd989%G$NvMtfTWs{GPg!K3%8 z^x~)(lLbY`-XXYEMH{zx%}yaSbWRhpXt%zmU$o!(B8}j@t2mtpNBytGgFCl;yWXm6VzuJw zUTN&I__VF3I&|-(liE9Z#;m!?TF%*TxGUwYp82_DBmK|uSD!5}#CVRqi%8V-h<^gX z;gi-Y``G7*%ny(?VsW?1#xS`IE4C!1aXj()-M+TWkimoX9iiMJOnjz!^U! z3=gatz8aw9t{1CLHILH8uQ5}IiqrkMqt@f(+C9`-ZPlz4ly<@{18+lq^}a3%oL(yN zPodr0_4zF8v>*8!df@CPY8eeQ%9=|E?3Ce!@NIvCcFV;(D|Xlrv8@#V38Y}xs;rSe z4{gO>>9d~n;TTVeEuOtNXVH)+LfXHc*}*Kb({fG68V$c(zlh;Q@cVc2{HF<#5y8?Mf= zhqxd%OY%|fk);$gOg3Avm&rs+7Cl zHN8s8;X1jZ#!1^rf3i0K+#lnXeAK;GiQb^ zayz;97V^uejs*ZM%m`;%z0$Zmr<+q_JvxhInD!C`FDW^?lgfUIM5!SOsm&4=mJ9%B zKTtVw(A$ZHZ_ZUJdF~IG>YJYo7)y8tpA+gsNE`cx<4oQ0ItHwUT_tjgkaE;#h_aOE z9+Gg{TJ7Put8lDP?ZynR4V1m;L*&0sgdIZXtr0%U+_rY1q~?PAcc_!B%4%Rwhlf!Xc%%2?$I|yrH?8l~mhxwW#oo z(Dv#(OS0r9tW=Tq+uY8nycM z9GQHG*QT;D_K(jS&3T^b3^yDXZr(dQ$+bPjJrIDgIa!3@j@elQMlqcLzqQK?TfA_? zVOzAV2otWLJ3{jz&u^@Nq{^+v52_^9;mDPYADH_Sb?aTK(F4@;ZpUfdrx^4Av` zcPkeErJl#Z$f}|Cb1uQi(wd6e)>*{O6s{%AGli}{7bvMe@+tPzl|vb?dQB8~VTW(AqzHZmjJTZ&!oY38z4o$)iUT7j4$R~6==ICA-CBi~ z@QNcnYY&brqa53K{)q(t5c??vF*eK;V8>79D7plz&b&VT%WBNW;Acd)yYQ|cJvs5g z4@e~>*66=5T(bxA{}#P_ zU0y%?*wK$dt^ohc)yG0B;R@CTZMIrtkCu^AVnrEiq!w2Oa4{bKCf4tC%~v34A}>}q z4R%Q{a!Flq3GqB|s9WL_vAiNQH{gtp06cs$*)4x>Ae%gJArNx}eIwAi`}=zmMUWx< z>@FQ4^%Ywn965FyElY2O6n(nffv)hfF9Q&435mZ)W6y<% z`lfN9>cG~3f%hk9IvS)GfN(6x<^0*^fKLrAAr&1s8$r`S(S(kLAT@~S`xfTG^_IwKgZ}6UZUYl(_@_jb2W?0q zZsGwGK|1leMfC!CkJ01*KpYW@ zAKXGe)PG_Gg9F0MODT^E!Jk`xBAt@F?Cp4{0A_aArMOI#T9!1OwIZFGd0^g*F8XJ z0?{M?O~Km|PzEvoHlt(xx=Hx#6}tO@>Hnd9{QgP!xWW5MllkWf&HdqTO76_gPAvZ# z1^P4^1rkV&E(hH;ngv1w@}tLb`}mn0ULr6)`TB8uceAqD6`YIYUjO~sDZeuPSV&%g zpibCS$5j6*3gwsr;sH#rDr9@S0wkl-8Rz>&4{)vn>R1iH^C#^3-ckl4rG=gBJ!7j9 zK5jwqL+*P+M4#*5-`Vq1eByLBrMIAlcY%NZF>U|0DZ6I|v&Gq#CtUq5L=%^c`r-RT zmyn&BhuxhVn-~VwH$Kt-YV#uWcW>AH{K-uAgEagC{GMN$20sL!`zgx|dAd3OId}t% z-|h@Z@%-i0`ef%gw=F@yAWVAB4eVVyzGh$`1pD!M6Rh|?dAmu61nKrah7wH0pMD#( zUT9?5Ja@Pcr6hm+_|PN{8_b@_V2gwevc&fST_kmLuawn2A4tzAecR^gN|VpheK|Ts zkoc&(D)Uka=!J#)8n@`hEU-~_aabe_X2MM&Hp#LaebuF-u@*gZs5i&|%u-cjrSS6`X;yv)(9a_Y#du&5V=KP>$h!RGUA-b z2J<*ACayw1k~~*!9PK;}Hc|z>oV1;!!P`q{hEcf)OHSJ$N)Z9 zq^Mg%)+gp|l^sw{R~Pmup9R?X`$Zs&&tMKI0KYkJz{)G8QNr>k_e<@k9odol?8&E= zuoVF1)wwz#7%+cms@11R8v}mNKfNwz+i}@QNqPE<`eMwahC9qgyQ;24OqZEqyteIMxg_r*Yicw?Sy=p-nD&mD~saE##*jXkOR` zB{nCz_8`P>avS>^(pTEjeOb32K>fs+@<2HFZItK^f1Wwt&% zH~y6xoD=5-rQJ%h^z$_PVf$r2f)C;Ur;4MH$RU$k+S~z8T|prF9*PCa%Luyy>npqK z7BM52OyK0X;&l(147OR2#tXOISDrv^obnzg?W`D+D*dCGi@_q_Z7(debq6)E@iFqz zeR84Z?>NfRk5b-jA)jz)Ei(@_9ZouI&S7f1x>*MOJ@Ul12EBt)s5>FlrsAS_N6cg* z<-p%I6XTvRb-M=rZQYMZmfz{X=;9z_jQV^!Wn+idPpU8_-#tr(4beT%>xz>-$6WnF zsv_r|i{qVeP5cOF?BB1cL9hy)9W5bWk?M_CMPn5xHPy{XF3NJW58Hd%Jl#1j$kl;ohG_TMn zdf1)I(lDH$#I#&{GV(}mZV@NtIB5FJR1Ci-Y>)sf&dre7+o`lcTgzYl?F{?t6mzZ^ z7VQ@-w_tY(AC++Pe%%MGdA)H6*ycy+-hMLG2TTk=FEPLW)+cW$FhBRj3J}h`YC7n& z1Pi3B>#~Si-E-@X9oKu@kC(ZAY)J_0 zNPI%3{tc8UU%TZaB!N>ZT^uRjs^M=>3#8n5LOp-$+}AFeU_N!zCD@Kx^|E!1+#l*8 zr3%-5yw*5Rf9BTIXNXb3+T1i zgv$dZNH5TEySS(|+iK_v9NR51?9!3zUPja`b3*6kh%dMFiHBA?;C6n|a zhd5!c&?TAc0ZG6K(gOnlRmQ+?K_Q$}`kg7LX3+iwN;+Ne_@}4^Hc#ZDF-ma{EcC*$ zM=~^s%Jok*y`roV)}Zed=WKB)^wQRbMuxNvqSGD}&ha+F`QRG@mCvv@_esr{%B5BO zM`ptNQxdV4cTF@WBs^~AhJL|`kBXV zYR3Lkf+KVE0Sbp%!Q@h&g^pV-C{*0T zZXwg#>*%1WiGH=T{e^9be!eC^3dBZVE`CogiDHAg~kpp_Qds) zmavH-{~YW#mTpBDf+Ex1rc;?w6}*5*9UL59tA#`$eOeom6myvSq;rym4UNLvuk)ft zZ>cJvP2hX6b$qd{-#Hnj%&9g(QTm^{undZm*)*>E_Z2bL4s_JZMvDF;8-SvHy^2eFs7YYRXEkd^rx*I^7vs05q6JH(<PpAG)$?7COZW~(yNhbF#X~)+OJk2+Z8v;WDU_jf4^U7&&T+IsBExC^_x`>DH;x)B z6g_|*NzM6qA!O_23ATPUUS^~ie4Yq{uTQb8ldlxN<;mK=WG&r>%91yZ{Oq!ADP)eE zu_35~2$KU;ASLJK94DH@paJrn~qTXPPj&$`B1jf3S=fnZ-D^2%zR!d>V&Fe>jN z<3|qn^wq*>W2&lFLoZ94RATd|85@9WE{!N%+E9_ORneWG4hz9(tV+XixiX@y`G~1? z)u^S+iuXxWI`7?-SKYPFI!WcbLzXSN<4hSzPuow1aVcGax;N9>!)y@*S^>pj-P`2d z;UU$8_#gJiO({@u=VHZzN@JxVyO1T%=D6Eufxp#=n3CVa?A~}i?KoAnJMo1V0Ru$X z22Nkav7JdM(aA9{kq*WusB_yKFke+u+0YYCEKI*^y|a$2n+Ql>yq>Q?juU{3>gBNn zctZ)TQ;5t$Xo`uF?MuMb4)HG8zV3-?&>{$i8>nvWL$&HS_PEk{7puvSp^O*{paW%P zGV%Qfxn!#kk^|_)ZEC2z(qvmS=;iP%vgu5>is);)jwrmG4^M2L`Em*dU!HFNiTE@A z2tSEYA}VoGB-Slp@-OST#qR}ymk}s`dzz~mWat>cN+%ndIOf8E_#JsD__Sg!r54Tt zvf&I>U=-NUGKR+TDxaEn7V{PJ`s<|AUkmN6&AT~Sgvl_qnY2HwytyS*#fVqooz!`u zXOe9Zg4mEP|L{?I2WeCfY2_=s&BcA?pOq?nXzPLrGh*$}V)&T)NEM=UWfj&(uS>2M zdAHh~v>Q&7hm7H|)Ri0ADIShd8C;`p+bVWuXsbjtyYM))2{QoVk8_B-g6Yl$j!7pZ zzf0|%0028ihMka_vYD)m29m)~lmfxbm~o7>1chC)8gAe#mNNauf#UKSJDOgmXofBB zPnM$8FE+fUzgbhpyHCr{r9~ZbT9$qws(A}BbSj}7z$z0eiVeDqSx3~;0%C$c#^GJ` zEdzsYm_7lHa3Kn|Yb)eqR8XKg_U3qAKq~LtHI-4P7U5*ZE1ip*!{bV^Bi6&>GNV?tn=sLLn@_;Pov zlYau(#OOjY)l#d`3&d?p4xZ%lc8h!Z#)MM{(de@lrkq>N{EcWe197x?yh7(Qu&f!? zon~bn6L$ix!4;EL+~w5;jS2=zScTs&16{eTfIY@kO!*Qo!_X?4Wt9Vzus#+cu*ivrd#}n!oZk6#l?!-tQ^sq9xf`DqRLiMk+i z_7Q&#{w4LSACBrH=0TR1;H_cip2QyFH#%6e;-f?EX|2;$0~eq8la(6sP7N2eC!j6{rPHvUx)q*Ei;jZR zLxPXT0!8RL#t=!jxohtFfQ?`!8_WFqRt46`7qf0!+Xt1cRyW|)bE<4+EI!t6wG3uP`HCw2U~? zz#EI2rF#Ya>|4Xjy;Y_n;hO(r>2<=3p!F?a?udr3;o*DbU; zO8^Na9|?f%%C84?#^H1RPAC@3{>nNapkKjwHh$pcaL>zoV{$dFFEh5zT* z_Wbg&4y_uR(2zV4Nn`5`AZf@gUU{!HsPa3-7Ay(ui4w0bwltPgN=$${t!atl+xMs0 z11_r@i&qRdpK(O@GGQeckBTj4A)wh9ORYZnqVD6Htz2wvIOOqP${7BapuGz^rhmNrg?%0vS$1$o#|U&TGauCz?3-0Q4tLDdlEQb zD|FQA-ltS}HE(ImPGOrl`5Z?8Oo^I75Zu9Q{c!1d`PM{GGWg-ng(u;BO**s@6{0&Q#f=noO&Q8{KHk zR!*vBf^%#6@iwUKQt(F>3FrjqcvtPHwx06ehhwui)jHIAZXI;htlyJyrKdw zv9n|e*9Lf-^@Pjg^8=9*Zbck3yW?-*MD#k1_6WnKIQ@<$y{n+F<2SZ&^Vat*2bH{RZ9#1Z}pnbOCb9#E5RP2)<8a<=zM2R19OMUceQ`lR{H3BY~AY48pm78 z4Sjep=w1vIs|;L}d2(vrzb>-Yapx>4&|2q@Ryc?l3vOSsbLEaS!0HeL8)^7}VaAl; z%_<c(gxX#zVbu*XzABr4^6LHz%UO>4YXMMa11_?5#lpI$EifM3(3V%RWn?Yg9f7+K;K4V$qOWzDU| zIN&9K&9+gk#}~)KLi_K_ikRZV2b*OWPZ@1jjJ$m&bD%FVDnbG}{tK?$H#cCw5BC)V zY4Xk%gOuPyUb^AiM{}{okzkE`saL+#2@F~l;`8}-B^#SA z0vsDT(RIX?%e-7|;v4zHkGyI*$EOJQ&c-WI5+FIagILmIZ;NQQ;tq`$V-{khei^=_ zThV!2`5T2V$i$E(#x;I;#Y%iN^&*)wU+&02#}s5dzFli*l%@oAD#O$XoKeK7x9M8)5nO=gjoSi6uJ$*j-L$220S=9=f;a6Mo6JQ9~d;Kql7o*vvQ(Uh`Asg(2hiR zv;n72GK9^!(37mOkAXeIRTm4E?Gv0pKppR*<<@7+6y4e5EI7tzW*c%A2f-ou0kZ4U zkP@64>=;A>dFI32=*maFCd3Me>TwE#qVA{p6h@av&L-AQq z!vzUlyT<1rwx2(NHbnX^`Y zBU_V;&H436#PTI~OXZ&nZH156Gl`Dqpwy5P%F*zQE%?OGlecxN!xu)KvwmA+WaDs( z%>7ill`FTJITC^WN3BR7Mc|}$HX2W8-5)?H)GFHY z_09tj@$?Eb$1U`sR`|VNZw{Z_W-tCsUB3W;-mnpU5YS1Cf!lYWG>6>C1@{%}*gii( zi+LgDSS|I}NLqRA#1z>}uGRGfzPb8M@fO({UJHm1C#2-^`kN7*A~06Oqq+pwz{4cj$%|1GJ?>*agBTs=-B%#6-H zB+W)D8!k{dmT|5B3?6fA=x~A4arc~jJuIFf-=EzaqJFft#q1W%j?$E6Q2JN!*)#qQ z+ymC+_92g7>%pA^r0>5~1v6Fqa~tA6QWB`F(IVYF-wm<7obTuk=5l@C#QQcvjS_Fm z0}|zrPB_WE-fIY+5GOza@d1dQ{y%ycmp;KUiXz zq8npo`}xdy^HM&;$hLaXm){gpO1Oc@j%%|zgDHrajg^f$GUk7G-%pisMt`pCE&zdc zZFcC)UYN+{oX?5qLRqjWZEzgnb^y0n`CZ(xu9^>iB$_YJIeoW1dNZBH@?KH&stScw zPJkh!;`j9HaNGMP5{`~jEh5@&?T(?iE%nDc;J3i=?qLg>633&Q+=>nT_o*}sjf_^ zob$x$_8>i#-v0NqCPt7@JC++-s)Y>2R0)JizY1QSZ38kfeIVz(K>%g@XmsC&Nk?my zH6TR9hrG+`XZ<0WB6M%W$zM(&Ms}T0)BVXA%C~2bLoz@PRkby~^J%r9ixja`EF=?J z21Mg*W+!+%TDbSGFC){JIcj4kc$)MBdkTm3p&XdQ=4~1BE{gWXAYMfNSzTQE03)@F z6XqFK67fXMgFyd^$9+xC|1kDW%c5vuljX9ly=>dIZQHhO+qP}nwr$%+pNfvEsEa?M z`)~92r?_FIgUA>~{+1(qwtj6?)Jo#pl(T=y zA4?y@n=&IrgG%Gb^63wS$x?ODRI8&lG^*+nbfAUp1A50+L+1rEL&X_)?w%t$1bO`m zyl7xRl3cTB@Mf(aoF-8HPg|Km1X*QKul=n2!XH8i11142Poy(25aUHIT|c(2i^jx>FEy zN^11HXL(-+(|U`k(Gt4tP@Am8y%0iR|*sXr;YhWR@=zPY=Q)-DLE zgtEi}NEF(@xQw_CglHBHZ9&;8&z9|cu|?EZAU~`?K*1kUSPc3fB6Kp(R=IRtzGkyj zRPCt++CTSF@ahit+`oe}&a-84V2|l14zKun-e8w!P4lb%gVJWzWgY%5deG_63qe~KnX^@ zGKpT_&7Gz$TOhk$iw1AOxI@MY%)t2ZFdApZPM~qPZCPsg1e*^r0B*E%Ma;MF&g(4S zCt1P7EPS$x@hoe0Aaedf^vO`Pk-YOnq+P(@hx-sOaWPZADVrE-ii%d;$=+u`*iG9# zi|AR;1=}Sx0r7e_l{)UwnQtUsS@<%g$NQX(C)U{h^NTdN%#;G5cT)7pv4yJD*&k&U z@ntqNxDH&wvYX3R}=d_p=?Q2U?AuyfO&AvT^n8L!n7 zi8NF+T@w@v>&a5C|2W^T4W}3uA}(O{xHqQR)AB;sD%$X2a(yn9ODTPs39>(}!MMfx z=k5sFDOolq@MS*khNw~EPFDRqHXF>b-6-sW;kx2lWo!RBcLgQq{3;wyo$@Ep=ToF( z*YIjY*FM6Xz?}#__(de2hCRq$R&H>8o2XKrFf>suuH4m6xbU>}zrB_30R708v1Nzm zE`pNuk8U@n*2yb*Piu+*UW{?BTLXVo;W?7$3upU+6b1Y~BrEdOaR(Z}fY}4DUcG)hHDml|@FPs9fNuj2rbznmijcY;?sM zH4LtNVdW$$HIBFo-god#b7QC5Be`cr_sBPxF1>j<`?e~CWl<0OTMz}*VyOYk9ZO{w zw0Ej5#^g1zELd+TLoeni5qf>)E2&&mU|Fi?4e2n98NO%dvnIL_bBl7mxEe*o{K~tS z`%Cs2G0x1?jsM{>968s77L?UJK4V5gb+d8PZmQ{^_r{jKeDObx7UFv$`=;FVGw&`6v z0j*>7TWfy{BK{Vnrwv@W9hft=WuQ$H+*)IngTxr_enmlwg7&kvUSBG`cY%}T zd<|A^$K$HiNeuJRj38ne2;k}ASmju?1mnpr0aGQQV*4%nVMUYfg5LlEKUTp+iP@lf z9GTUQn7WN!brK}dgVnrHcntt1>?$tMv!=Yu={m6a))2F{mGIM#q^;L~R`2Y>Ajzvl zZp20jmT0S*dD8%5@4fSjIeWbM42tF@5dvx;CVb`w2yJ*G|AriqgrAQV-YYM078;zUKwxeKMPK?b}9nrc!t}O9>Oa zpHAQwXB>b%rv-~6cqO)m5NdE$A9*8Qy|P-Dsjl|?oZ7GcH&c7UZ-eaTpOUONdefSs zZ#n5SGR}1_HoHjo1LeA1Jp#1XMnq^AN$0kXJwnO9E8csja|BFr=~Tt+>8f9WQxHw9 z-@DoRh-^x0y|00|7t!4mi=2X=1t+qK`Gb!Y>uYlEhitR20{BCXJocsAT{_!STb8`Z zZGXHnra8W%ML?~rQyRV<5HMJvKvrAYqa$d-#Y~)4t}2}qNf2{I9*}7B`;c`h^j>YD z-bG~{fJM4|O(Z6Uyoh_gq3bmFej{i_AAdp)i%E4+X%CS@NlHHCHRN}(uycoFW$$DV46jC2O2a> ztO;I76L$axx6b_!T9#j!KRgC#0zml$OE`P?T_E~vC1zaDz^*nRN5~skQ6<5DZZhV^ zYxPc>Baus!(3PQ>p!V?NM{z8MW2QA3 z<-Tsay2cW5WzcKkN8qC;#w4hzv^;UAgQrOCNlTqZj|Nhdie>Q>bCjWmFKolH^GvxR zHSdYX_aWyCIN-zwoR6D9Xv2g;OyoM}?=pv!UZ&}G{U1Cn`l7?&8KLPPhY8X@BaJHs zmw1ywb&9FjLlfVOwDJO1US4%BBgImmsY$?6R8u}ey?$>Ih8RxWCulZ#vCMuhHUliI z+?ao7#7-aZMurB3!)_a`h0;b+O>@`6de@aIL4veBE~-)Ezv;IRkSaP{1xk}k&?By9 zZ`sB+oCKrW5cUZ}n)3vTbylGXZ3J|auzKXQqxQ*0GrS#*G@#x@iu}@7{u6CrRO92) z78Z1-&IvlU1E*Ns35E0wDyKpA1O=;Rn6F}N4cXLhmLJSpA^*%HYPPi6#4>JH@%x|K zb8Drv(EZtkS3R+DX6as+#2MO{+G=8hkl#Y_Uunn4U27UqDIZN|6wA3%Mv%#Tpk?y5 zxHpdaJp{FWOdIXs5LaqW0Uis(%IBY&+8ZD6HI5ST&&a3JrZUT@6rqs~x9YUohjf`? zAj%^H-UQK~5#9=K<3d%-Ag>hS56NSk0je zLD{dhZ<;M=4-yE)5|^t)sPyV8apvLCN6#~G?YjH|LAuak_hm4GSlT&=PT@DASv$?; zAd++{(duTCh`2*xZJZ3qh#SaAXKBTQ4WYst$(zlh>T}k{W%ix-aFItTt`RbED%ELT zEn~BmfXYdHz$PM=$1xD#*Y$W4E2viD65#6hw6{}zYMxg$<+b5rAxUnStw}|9PXh}dNz9H#fDadztbEnx}u@u&3LeKUlDFqVRF%vxa-lg(w{HM+H!yRieV42=Z^jWI3a==7Gg7dK^V zH!X-H*p?Dm6my&Syv4l8;5X#(^`)xx3QR0Q_4 z`&C1hd=S^TQQRYp0B%k~c9A~8j`o2*FbEdaKpWD}HfwCR|7IS@Hq)ZIFdnBTno+S9 zMlW3uWQSqAuv$2?90)Wx&+ufU}KdK>1LXUR5E?X+h+&j9;<$qJMLY>QP7X-|pq zRvsRbfC&+w&T=Y)#nKAj!=ry-=y-p=IVc_sYKbr`iP4*2AM}(JUpF&_@h~0$tZo(- zHl`}`?dDQ!CI#<3;$gXYW=`jQheUJRJrne)?1q!@NnLDPSssVQGt>*MGTOl`{f!10 zVAi4lVa}A&D66y3go0j3m zZqN&g%7rzE;rSvlO%`Q>W|)^m&`WpAA4dFRuFPJ~04~NA;Kl>^@sSW!@E6V%r`uPTSVLT}3`bVH9n7aYKb>eb2^OUO_riX2qsdQC8WF4>GyGbbuk$_|U5m}=V4xFW z3)@PO$b}kkZl<7wk%gD_BI(<`ACO8?TC3+J(v#a{6jAQrBr_F5VXh~2kOlCF@k#~HBH+`%fYEzRQ5f<7}70=U8erZ$(nVn|a z^Hn6k(*Xe%-N?q9)4FSPao+@mHxX%7Pr84zziHgxxa2w#RmsND0^JE;Yc=qu6I}-iKPP$h3 z#e7YJX;u0~f`m#$pf#J~C>M;=OU30uICU_6&Ot*3u!}vIDB>w7+7U=s!O&AZSMinIk2e7* z?87I1nA?Oc6&G&orM&Gdd`2c<&nICMW>Np9bIHSLBo`a=^NF3HnWWMp2^KH3e-zHS zB+&Fu?l}Png3XNCwM@Rl2*#b^PgJ^ z+_ceI*uMCH=X90FlSus0L@8#`XCom{hMLEGWC4p5$%o3YkLQ~ zl?FdZ!oEUI>X;1obr7mwH>%8xOXTD>#9=T(%u61N>Ntrs6 zWE>xO@$p$E+6vjy&G+My1<0A5n`I_fBDuQntpIZhAt$;7pWwKEscgmt!Yy#Lw}8Fj zvZLx70*^fSBi3BwsCtu$NgzD6cE#o-{ZI#P9A@DM!o>=(LZ~Z_hy9t03Rcp&zy0^(@wpKw{u|c87qcxQg@IH zHLQx?8ckP-8(anCb9YZ9w=xtwGv&l-&4%z3v`H@iFb6%JW!tDqN|ldHHiv#ONEVTzG5ejPC_NqI( z?#7sJL*`?Ff+@99p$Y3lpTw&7VI78P!$wm}#3=L@63R)+c5(1Tcl#VFr=Suu!rTpB z1Cl0;E#R~7e^e3DJZ=&a6p{(;jb&vkCjkodD!+*v0qC3NHi#>E^s{$r%4_D{EPgqM z5$v}@ydFi+19&V5RfiB5la7v#ss4-qkFZn)=;^)31n*{4JDA=#sA%8}7++@`U8U4# zAOcrub7Ge9LRxr-kiAYw7zFOcn|ocgig|6#*N2f|>#^4TiIo((pOD%Xc7*;DXZ}33 zH?FNrvJ;@Q-!HqtG3GB_J`3A0Zz5m0#ohi_-eE6S)r>$_!R|IS{YDX)t3qJdv03n5 z(kv68V6-u-=&Dy3(xpSF^8U?Ie52nBs=j%3GYO(mCz^5Az+aWgXg`6dnPQigYGPJ{ zoV_HqWwIxLxTbRcY=r$ zq8OvZ7$)r%Yv`Uc+rex(%i1S9O*60s7OJ}W zsR^J<KvoqjF90oHuu+s>jy*l(V({DM#0npI*L{!Lu9^fMQ34}->w@>pk=D^&Z91KDv z9}qp9?Np6c3<3Z~q-)4uUE3BrgA3}j3+BJZ)WNqJXdnQ}Fh)4g5WYEcEZEr3mFw>% z^1a*+@Xn6G`rg9$p6*{cV5ESMzU*Lep<#PAJ`8Oe6N-T6*;=)?e*$uJ z6u<$i0YXB*A!(g_e70da65>C9e2Du!tbU8vu5T{UQ_D;=Q=mV?rC(RpVHuE7 zlq)#EZ#zPx zYvEuKVPU}bJ3c&VA~u2YMGaB|#6(#r&>K8s8l6n~vptj%?eg>X02qYWxYkCJ)1Ic7kun0WHbl zACrgq2@N{GA1tc}U=An`y9{~=VQRATGP6W(lK}FTCfGJdFP7Yyk7`+3+j47haqgU7 zo}FEqa1dLm8KAnu3HB3!7r=>Zb|eP%aOHL?`BH;SbzS90ca#Ffz*+H29CxnbiV2Qg z1&OQBQ$~yaWh*2y!J0M+3-G+cRcm=0R_2?$>{oPPA4b1 zn1YGU-F_O2b;gLbGQD!StYkhX26bj?RwWchoX`nZ*~jK?BbseB&r@9?+E?qXkXrB? z4@^yGmO4~6kJBi&+0wgcEo4V5regK6`UQE$VNTT93MxY@kEn69C-^gTENu-j3}tuX z!nnxGaEsMJ4`g*o{~ZsrX7JivFR0lWH6!X)LAf-D=hig6+M7}2N6La}1U)8SrP#Vc z&xCM1QmY;=Ga2kXp$jGv(7R6ChMw8@6m~B0-hP{2tJaiHvD_%efYbtccxjOORx1i7 zB^)LF*FE-PFE+iPD&okYHq@|<%vJws&rYY%Zf z!fobuHDI}V#ky#>IiA0du9^@}^Ka$}_sphJjyKX{JL-Jim_@B|IS3*l<7xDIgSRv; z;5sDM3k5}<2BuC=MO6+kmC6#(Fn0$0b*fG_;&b84T zFYaIxyQVfNP4<=dSCJGEr)zZm%=+PV@i)8v6g4F#cwk}-HJ=AmY&98Q?n}EGq!Qja zuQeL)p?n;BA+q@x!Y_u3s{$8l@cD_|u?E-X(k>HaH&rbb4LY8>ck;)`c5iW_W+OdJaza2_%OpW%x& zqD(WTj!Gf-k!EPa`K8^#(LJ%D68?HHmQb2Oi+We*U^F9rpcmOt^)awz!BO_(S#-BI zHsKDrv+4GglGxHWw6WTlFx&AF0p%_gbJHcV6?u*|yg|n((OTscxdCo#$P_Zw53D)9 zoOnn)Vqu*qlngfiFzE))&1B-~swj1TG&t3z6-m`vWHmK1RNaQW_+TMEl{LDFj3ULD z)qxe)iXZo4bGct~v@DLhSmFGYeOSc+M}0jYv+bt(A_c_U-#@#VPF*}l^|f2k`5Fbg zlWGeB_L>LfPOf+*J?^Qh*LlBJzdmO_{^XO&2S^pqg*6db^I8<8ulEC_lvPw*M+c*dj zc@d5K?SMQ-+}I`ptCfDQ@=OmfQC`gXBCD_H>S~xzG>E2o z2u>vUb(b+&$@$QRkBLWd*CfVeon=6=_wBqjh;V6C?A5G1`9`de!A><$95w-yrESdA zrqAcWBulG1DCZ*nebGroT4{v7)B4zapEw6eFNz`|yU7^2$UKa1UR{=J!N!=#=Y(U` z&l6n!1Gkz?$%n72h7TCt$g5)>b=-NTLjOE%8^>r_kj)>DUAdID{~)|_PVnh$%JkcH z4K#1jDQ`g5b729c?dRbGx25Z#~a|18*bq1!EEu#XI{8#t5@8{2JKqynoD ztbKkl^x6`FhSIB)=Ctj5C|qbzEcl*9ScbQ~Oz_bYkD(Vh%Q&>ssiVzYc~L3s!8T6; z!eF2Ece;YHoq-)K;rIFUvR==h!GNy->_L6qlIeg|;4;%IeFPEF$}lPWV4+C=hcevy z!^eHg+dKNHePDGLczj@<+E<{Luoqe{XfdStp0u70@T%bAQ9bqU*rWJp@$o}hrGC?y zdCq^qNtFmrw5L7TDD@pEHBHMW74YmQe7ai@hwOLu6Y-=z2-;GcBAqTF+0;jPGv35b znYKECxJjsqbp}OvVbwi|(PWL*`czE77>gax(w=QQXs2IsCm{Fa{%PCa?U_yHJ96LePY@P3v%771%doXn^AcTC{%Be&a-|ckWcO7nm z-xGF=FCi)|xq$(3Nic)k?EzM12aZFLE>m&2Y3rMxqZ{FIZYKy`^MVf;9ZqRGt43Zj5`l!i=OWHHCphej{thB+NGWli@A-sS{mroN>xv1p9mM zV?Y2Y-!f&Itlr^eSc3|3*YdUY>_Mr#sLLXW((+}mnH@DQkd7qM`Bm*hb4;=v)$VCxxyxRTt>YyB`DP3sX`=3Vg3NO}G zB=RTr&jF6zW}l9EiZZG8(nsE^ytmtqUSbpHaNv1u*5zEm#*R5>ofew0hUzu=aukir z^XWXz!}S)|y!i~D+srp|4_Z=`I9UVh1fTdv${OMBJlmYq(j(6zstxut-z3hD1bc)9 z`}a|v5sF|L7A5GL=dz{6siRPpx`65eRj!zcG(DL#x!3MB)#%=~Zs=ND`|6nZ6&@|9 z=lZYW^fyVUFCl~zAVl*-z6R}tfj6Ud{A07n>jcs!m*qlWB$<|z+?-TPR@@V-jdEf- z9)=X3*$f`$$d+x;V8~f*z|)VHYJaS-CO%$>Sqa=tW+K=q9#%u(K`{j;HbB$}J=+EpRJxY{tTcO}B^ z9Ij`PuEdckz%hWPY)@1>_-n9>OO0Pozu)A2~LG8<%^lB1+|P7KZNc z0j*6?9o(F5$y9u8pC+?bVft(b*y}6k%WPx`#C?0@p$jeMIocZiDfu_^b#ypoCGoyr zY*iEsmg|u&R|O5tSe?&MvycmB<-{QITxSi&TaREC1CX@=Ox2MshdXUN=jY-#`}dQY zz=QBirtF{L3R5PdNk+=nsZOP8eZZrrRk{Z~R~h)OjN$xoVXY0bOR~$=rco>h4}_WEuO*RnWN?R0v~ zY<+@mhu9b@YipH2H;%n*ii|!9Zbz>m_$!Sz{ae}E9npgPYKuf~NB>527#?2M{Y5rQ3)-x~fE6!4w^WB@M~=*kaget!sz}1w#F@Pc;GDPHzUB7PQzVQim-;!iEEGL zf8}(=7KVGJ%%LQWKWtxy%H87H zX~!)OByo?OUelW_{*)aJ)V7~7ef>dge7(qY!~!4Jo;eqZq&bZvH7b%2*2O(5JCDT* z)sA?WV0h^Xd#KotV_@qgh_I?1v<(O*=dp6_G}+X&(F2% zmPaGr^J{4e|K1xPR`yX`tY@uqg==qKxnvkG?{F02RZ1}HAIqLsJZ?@DUWda+t`3wM zV3V_B_e`1?%^~ZZs~6m^&)6OS{_%K7tF2cP3^=TO2lI75h+(zUoyDvdWz@=jVhx7z zOOmbHjo75hYp3D4c;}WUiZtCaXvu1%;&NIqF+h`u-S9%DtkYcs+v996US8&COZI8e z+VUDO4yj8w2Ab~9@B(v^L?8tJFTxSl) z#cejLISGZSuLKS|JjVxTlrb>|*1ZYLpT`)c8e!s#tzws$md0r%EoD_wy#tlReqVCZ zQMUc9y22=by8&n5lfTOO)KvSt^3M_b9(p&1X=+WWypH(x^qudQh19LKo9~LV-0nx!Z8mu zC6m{H>@ zXTO4dypF+#-5VJ}iAXH%gHSGwj%_?aCCU{4>4~eTzF4r4;}viu!5~hp{+rKlm{LgZ zDmTPNmJh0e>Bjy_X-9votU%Tqv-um9!L^>Fzd}FzAGyOq5;u{jJlAWjVRt+ed6&<# z5MNmQ*Z%IvI9iCaV^dL`pPJCfV|~@2F^ES2H&w_-DZYm7_%^*-Cr}oU`}6L-P%B)k zbPC1qeBSU<&K!QNcbAY}x5RW0uD|zBB%WT)Tgd&6`ber!iAsJ&oKI*(b^@0h2k2+6 zdYkUhTN!qIe4_x_CAMY$&l2Ou4 z>}JIByv9AnV>+t>AlbVv){~esa@3#@aJj_u&8^6(%_Fyhyly%n($R*Qb`Nb{`zk{k zihHjrhh8Iz!o0jFzDOu8#>aVeQI&wy@6iqHimnOnyi(#W>x?2I7z^fQX*KKX_q2yl zzkWyz1TWi=r_PxJ0Z6&IdQ}D6>&%p!>0&TMRt^6S`ijHQCG)3cRg@DwgN%LY;8s$k z|5L@yCmiP=`PUYZ`^j^_j|5uI4qXVCR&@2$V;UZR*(o7n-Ks5a+nM7rGF7;6?oP(@ z*JVg_WkTXcsNUPhC>a!fFis#wxiBo#Zf|wt;f&wJBPvF=Sx`Ab>W^s+;8CPn5f4gTl$KT(6x6 zKUz_C!Zk8X$j4og((}+^SQ&My}HT5KXZEkI@9v|4|S9$Ft&K z|r;E2W=N-Hbr%IfHv z&DbnSYD(+h=c$UWsAwRD3~UC?rG*G=hD__<8Nt9mJPgr445EL0d>l*w3bD1}#jcs2 z!39jNoU%+&QDO0`^b`l(KYzqW?MIYDJ#7tW?8m1qQ+;!7BW<1YC-|)gPMMVskUb*< zP>Qxn3Si&?DkH(+01(oiP07DKygIzlkD0%3Xl`Qw65l}2*x} z9YgbLF%xl1mzs~<53p}+XK4JuHa)yEKKzS^4BNjuyf8XAadF4iKM1LRYOa6v?FKgM z3IMG|WcBaJ59+;&t>sHi;5F9OkH`9V^EZ%Uor8l5gF|zj3;5Sm1p)EPEob%=Z1(Ti zwej5wY(3-mg}If<@uRH7Z{v6HyM+@=eVr39TV^}wZ^FbJh`!anv5ocqKRq~IdQZ_v z-=w`mV?E2)9F#dgEU772?C2_~tgN5Gui+n4&fhiieV? zbhXTdK6=LQDYN5m*4FeOTIg?{PC_$F3ot$7x0cAI_BXpAYdLoBa2l;JqJo&!64#uUhPHn%MW>XYL>%8+~KrPZ-FmUzW6W%%2sw-^Hie&og5t<|Jn0@?RG47oAv0U(|l}p}}8U>)%35 zbd%5MN7Qlk^N`vPO51Auu3JNjR5UmvIgW5fHmo#HQa_yeDb2C$hJw449yUM~jv z-^$P5`%hW%m!7_`P0V%lp9YSJ8L-w--_|Q1>R)<{Ha5;*;&&bJecRPv{9nr(Dd{b# zD81E`tLXMXszt`dtP6TaADKuq_$Ru6U)XvYYb6Tm``Y?{HlmO_d)43Xa@Yc^%+pWH zH+9aYKkoQKPV5_@Hqtv8hK|Xx7lP7jy7vZ=)d^W2bn!Yhs65|V+#8o3@+WZVs2G78 zdpAV|iMnH8AiK__4aCdOjK#e5mVUgH;|bh>HS!h$xEkmRNQjQw`|E7#i{p<7Z*%M8 zH~Tvp_dh^57g=m(iZ;MdyGM)zIAaTpp?%Mem@sd5H;{1Ph5N|A@z`le;0r=-Y70%6GI zk2sa@O;qyOg)8URfw03Hz)DpKtm-*lwfvtMD?mxCA@^gnkNy53eEfV13`rNMKI$>M?!!;?pEjl`B&K14KFtFWw0 z^X4L1XIDyxM$TYGMlYg`S6_!C6QJB$jrq56?GKeFrO^YS9ikcpG{dl~_>xh7yqAj^ z^lG^hOXhqmfbASjh4jr*Sh|mdLRNf-(5fz9Mm(jg_`y4TOJDpx${p6H&6}ce@te1T z9vvN~w8JOIs)g{ku7@<G*0vIX1+)nBrd<|A%#_jqW5%H8d^RjKN5@rQ@EQPl z4uVhe)1fXi@R#(!I2(3_!Ag2%V<}xAmD6*V zl2uauA{)K0)ypW8Dl?QZHa6O!ZCSZ^L3a;#w}gUg&Ll&@mjfxk$)MJLaFdzq^aR^{y@q5;-m zzubZlB+YxyQsa+*+67Wn#QTjL6nrXB*>M~GgZpd{B0T#l^f32+@Y*|(N?l+B4-wcm znDVjWG6F)G3;+_+hh!#Z-;imRkWP>N%V^zvTPfZ;K+(1%&N~!6AZxT2x<^K{P zoVkXP7U(^8@0IJVJ6EQW?Qb>kca%)n@K46aj#&JAV>^dLh2b>-R{*0_Ji#gmqDOUg zI8RVbSuFgW8mH%pSB!wnahWpxPk3mcBY|CoR>8M+Ct#A9FC1qr77ND#Xn}_%eW4R1 zRn~e)a<#uhTVM|nj6>aLK(8yN$|8=IBybKOXf8ysG2Q#_V!0T>UedbHeO5q#NZhOx zP9RVzNlJy<0p!-accf-!By3Y0)@#E8gmp8Qdm)Ml>K#G{u~Wq39d_!PdKG^T(IfV# zqW@OzInea}4&28_o^~L#?vi{}h%Z$KoC{$gMa|VZBvY)nYt#d~kXGxN!OKUzIBZ74 zTP{6)FFhyXp#Lr_ks}k3g6Q1Ga?VF)h(pD(8$Q_sTXS*rCh7fbAG(akmajS&Vcb1F)jUlI&# zNOyncMNu0flr9XJrHF91(%O{0vuXNtC2!T0{M79+KMq&hzsRLlm<6)CGk6ky=Gu1` zjTuumtlA$RcSZJ3;Is^dY6{x_#Kj=I66qaEBRId!q(wMv3d zZGtO$$@$!e0(BY6T|-D>G4HhnpO<3-RX%_*Ymu zxNw)dZp}hr?VrzIot!x|wYFZT+C`MK^(9*`y?m#p;;}Z{-5P>qNH((2hHwIYK9m)! zYlkYVhpXjvz0Wt~@u{ghr=e(}sUsW3ndB&F8lp3m;GmS!tlIQG#@8lZM_pxh-YX0y zGK$Z(!^bYzRqLs>1aWSgiI{j&?Vga2l?ER%(D4IV!_3kPS+Mj zA7(;RQY9wS0ZLtS=?@?}x?5aMZ%D4?z%bIQyL4WgtFGS92q!!=Js}o{ zVp?mvXE(`S8K43sJd=}u-par>c&=S#VDRz>pD%ehOLGv`*HiE#PNEk0}#edJ@tn^rQx-j zYQ}lgLxVtiI+RLM`gxtYP!i&DT)JI_2jRHX&{tszGTqqkQ+4?p?Dp&@)k^JnfDg+c(iQdJI;Gs{yc8GIyd zR=fUeHo?ntSNp$OjRr%U`n{FnZMtHZ6haP?d9cknHy?vwF&X~WTNxJViBR`$$$0nL zMa_9>N#3#D>V7X$n&q4i@VBe?8Gzzw0w|+pc(=$~=(mB01&3{f*?K4#)vPf)DmkA= zHF%uFm_23U-&!G)-}mf$6xZ3)Y$v2uU{%hhGS3L)@nmqiIf2zn)(*%eBu64J#r(fZ zywDW~C^<`d_AoQvZddz)&ZjO%at5@rrdWc(FWV8Ji^Ply>VkKALC&zF zeNjZNaVu71lU$&wUr+~OmTSUK@Ti;(f}Q6HIaCW4M>_pu;|Cgr-z4*7ZziDvo>8Hi zQoIVr(8k6)2A|~QR~wKpv=68KlMw9{MKqVR8PQbad!4FT`)%FPD?UE8yn$BHS0CLiQ3?7{9G=l}rA{ zG9RBeR$#YX-R1oGZ>0v2 zCxfxi-;ew3Qh2F06st5xKZ$J`#oX0Ict%52{kXaP&K%>iDnA72kbN&1EAGE1~qQ0_Ol#P zi`YUwoqmFAPC~FK!SZpJJ`MBoHkc!+w@a&tFc;+NYmu$C((a+6^8@g(rn7=i`w~Aj zdEGjrCsR4{!8l3=!87~IaLEM!3q2%pf~xLc(EqJV%-EKq)+F%62w)uU96|KEI}1Vr zW>gLWcUm1X2?5($Sg?WiGBeMegCMgS`_W!%*$uy<)yzboo*iwXS)EoK20EIda4tLa z!_)ea)&1ICWX~Hp)DDj&KZ0s>@ahZAiuxbfl@3cLJ)SS&k&t^ZbZXwFd_dbs=RAP> zXWp-1SXx-|qc!)Y*rpS92~Jo%b?!x4*eaE;{V^#s6|E@w8M(YgeW)=+MpXUx;hO&5 zHjvMQ`W@EWb&L9-5E;!=ys%5!7X2;%xVB|K194qQrIC?drA)0+awWFHNPSqE1|}&^ zMNy?y;uv^)I7gp!D5;4cl)9s3Sm!b8SWz2gH<7= zhR4xwG>C@)#@?REjG;SnV=Wr{G%)A3cg@kWp!%Xf=^xthIzmdyZe#pysku4|HcZw< zN8~b45Fp#5q#yVTOTn>*qrM8J730a)Xz4S z6x<1UK!yJ zzB6Nk7z;t}@io3>m?Nt^afj%(wL&jMQrew^y-s>Ye;jKItM+RvT77!24cYJcm4T0j zub$viCD7$N=_!GaPhhPaYQn+I#z6Pc%8oAw5-zlxk~jYj($l`XRwZ7krlCtqqI0hh z=Ra!85*`zrTlQh*z*Ie|wi3CSv=`Fo3P}#_fo|FVq(rHWnPOGfFo6VsCM*;ZKzO)w zgyL(z6Z|+AN24ZLpA2TctF=%EIPJENkc@AGfVVCvN9;jrcixw~NHdfPZxllC+R?|U z*@jk>giP?(YY^AEw}l$eS0{aMEB3$L#PtrgU6dk~^ZQI63_9g*rq4w0 z^PwE88E#Nb^h(Z1H8T^Z85b6U#Xk>mTpYTTsJ06$$iS`$gTmhrli57xsMekfxY=fyZl_zZ3@LOo_>y!h1(BnB#eK z(47|rH{dIkI17EpDmrdR5=rzamubNV0|MpiN%JmkH$P{vWeRka+=ey;_w9`dKIev{ zn$k1{8Qzab2L=^^MIb?eLjxR()#)Tgt67mt-5Ht&eh0Q87bt&lfd5cA2D}G#_m5g%5yRR799E9WBZYTn}9DVI}Iu?{dMg?102t0XUhb&5^7GKE>d*;qsQtw1^xEQ<7zkrJP!ucnJP zp{H@oeNC|9MC|;w5lG4wSeXUL2$#VPxB-cJSu%0vN)+gAkbsw|n0P-wiNJI41Vav? zqFJk?`#qK?S|(IWw;HXCZxY^Ral=|9h?YY{_nQ4NFax|-f~KDsA4MEv%Rw&|6&{5H z!qtR)koK1a@}G&qt#<%(ZKDPOiyD-h5ODRRGfc~y#DpqOuzwQxKm#aNtH#l}5r(5h z^;Fk~%PxYC60XOY<4vNNG`E+qO{|in_dogfz!0bgsGHSSU}$667Htt%sRlrPOKOc| zC?s;3HK+rv6%<2w-np^tvBR|T1a({8$??w@i^Kxjavqx^{07HqUbeIr82p9wF53E2 zGb=~Xy56++-~tqGd`i|670qI$HJ?7AeivqvC>SrVRX%N|wt0~!z5 z@&0ZgR;5_ex^d92rpWTIllFu3-5}MjwtvYZhZc`mIY%7*yHHgzxdkz&+63D=?9Vu& zr}e;Rzs3vpkcm|xEjRyuREeuV#_M%-+|>LV0wOijF${P~oO8JoJi=D ziyxLi&Z2Ngr9PS6a$o(#ZcgKW&w%T+HhA|TH7N01 z%i5`NAeSiaOy{Y*7S{{HsAxszdQeI(JOmfs8`mO&v9Fr_4;UsHttv%@h0t5jfcv9w z&OgmAYq(#@x=i;Xgj$&E4~=zur)%m;A`mLfA(X~UAPUdE!_f@G63WD<_OM%*5zJDS zVZO?F+HW_9RY|f!(+T+DSd3 zn;OWG4W2$z03jnh9=(EfMN3f;lF9Z4B)KC<9oOU=E?GHGZZ<%M26Vl%Uw~_g zV@d$Z!3EW(iiqHzuh)WUzGf)R6Y;`#&zobjQCMdF?ltAV6`kX78bJk$b^75asABirtv}O+BLBz zp`MwkBu-Ug-dLzPxu)i$;7bv=yybfk!=U6E=)YAQH0On@E}aL0esu0YiSF*rF4^D| z*f6N-F}hvY+HvI$Wh~G*NF1T*JTneOU46hl$^`?ie5~UWYS0QJ8DzliP=PPb4v+e( zd?HSQ)ded1BMO#JDo* z4G(Q5uydGCrPO9f{y&=$aK)>b@agY6DD7YF&=KzUJMiDqG8^I{HE98M!fyAZ{Us z-LRK|{y0D?4%aOEva)ypPChzB3_WoNy*%Q=9%im$?`u;=|cNN5H@l;!aqexhxsz3V{%~hq-kSxyT6?4QLAh-!D z`mQ-@-V_?^^0*21JyBg`3W<~L^Rg6fp3vSlx)Ga>TlRAY<Mhf)|9DXQ1)p7h694|KmaGLFRUcUqRUzcWKgqinU+y*FYy+(H zEQHfWNnh$sFB!ZY$}UdOA|$GAp*vT03ayMX*Z%+qA--bO;z2!`i*dwN03}2|+1kD5 zF6OR*_8p+h z;`5tbKmMXj(swN5c^^ujN$AVlZnS-!1>Ky5tgVV+{^aMmJV`*4+H=3_GVH+Iy5{Er z`Stob{2e*79?Ig7>d_J*rdiAHNO&5O5a0f6WWx5r;tjGIY%P6A57e z*ko(!cl#=<$L*_@VIs9AM~%kFrCySv{OY*cT6|=gSG=kuR^obi^nW){yvO6z3BFB5 z%A~*!1OQ)u3?7D;pwmv@G^&`Pl7V* z9PyJAN-Nl8UO4MRS>sL?De$Skv`n!zPBhP?jeekEE>DZ2&)5i3e^!~`qgADH6j!C( z`xefiN8uHoF^%}4Nu`?B37=eQx?UO3TZAu1git$tC>xA@en8oI;mpmKVTMQ4*l?Wo ze;2mjc;&%q8pr=aIpQMo(C=3nUs1&}i1H*D|MTEq4G#IzUZST^w=ALn1>WP$Lj6UW zSxESY;elJSOz4T1wLt2ASe{qL_3DgUIxlH!>_7m&5UyE%R7vw1R-U*GvwkoguXF3d zhRC!NwS(mC%K`9Xai9TfL9LWP7`+?tU$UlU?Q(tfmO7QIgW?H=W}y^vVLXM} z3@o*YE)8*tt)k?9qd?k97xJtCS&Pyxr@-k;!6vtpstNDKKb|x%D=WUTwYSbE$~o!_ z3Q9+|sm?oL{0zaR$omhwN&cAX2+VKebxR3)U`UC{MuSTwv_`eD|*=;l~>pFjKx1gt&z@=@k)fCkmeNsfSWU@t~Vx@#DkzarjR1|%h zW+OIilv;cXh0{y+!2{hAGu&-SH{!`BjV@Y0yL~|ov!@?&3qE(SdUn~<1bGs*tnm+X z5TcNFttrMrIwh`fF2VHaQ07=sNLC%AHE|(G)>lz9zaa%;p_{CI z)4mg|j#;lkkHiuLNRCUGiA4xd=$Ju<*MUSzu|(0r`fZL+p0?fgG`6F7v{zFq$!hYxpOPtATDo&0NQJEIjP2g- zu}p7Q^Ym}yT3@V;jGybX6C?UvK1!Z0m)+nc!T42HgG9V`E(M5#ojaM9Inp_8L%cSI zpP#KEz)GBQNorJzi1Oi!r;)(@*|FWk$7YC?1J&5_aQ%qapeB!3KUY^xPp7ojoi2!b zm=q32IX1wqY`4u)Kiii-eq-k7Ouo&vt=&*jLsKtjp#SnQ3?@^_s$Dp$!E&UaK&xi? zp~_qoU>5B+{q!bqB3yy!x$1NdT2)rnP#W|81XuVpT}JaMA_Zb3&t!jb?_G52B&P0K zqP^s;JuX@=!dhWkQX|obk3d$5cBW6?H0w6fWGNhs#J45QV(Y<EguNU#Y_eHr4n3-77!bk=CY%ZIW(YdR!OEM*SdViAdt+`C{=SDo_ zsdC_JCv}9HPTfHLlR8bxhuv%C%0+>#?}`m9%R@~v#@3J)pA2n(dSCS&B$t|uCxAgJ zz%452i%C1~WLsoihvg{{CUEth10WM1wcABotJB)Q-vZFqfZ)JQv;mMkQf0)HX*Q7_A#vHgl@)Te?C zDyW-4fL3Q7TQP^td!TyvxL%jYSoZ6FaQ<|n6kc6)*+>-#utzo`tykZYDSLD}NZ`vj zeX0}sQbjzr0HYD3cnq}Wa0>i^i9Vq=B^2#u~(`&&fK|JatP3y&B zaU|@t_>P=InJyyA$4hpIqP}`YFJ!b)d=%ynb)g1v*a+0^mL1eq652a3w;a@$y?(+r z<9j}TxM{~3k)5l~;%)Ntu#5%HBk1yKo3&TP663TWdn6uEmJ`nLVEn)0YDuZe`uUs| z%SPw{FHM~yQD_+Hn}YWNw7XKZN7r^H+0a}Qfc zfDh;UxTm==zXx3S-W0!)P%11t-oXB`W1F8Pf1xV$A0cr)IVH|XleU$+#V9A(+S+Ie zi}#U4@@%gMV|#92(H3Ev65aS8PUCy#)Jq>}w9_3@!r4b~eejYK+U zv8GX_%f3AorL})uoDEjR_t~q?C&V<@8~&_65lJK!l;hvfRMXAW^b^-T&dZ<&OI2O%K)-E%I37~4I=dMiX$C27g%_4$Pw#h1?gRfLTrA+={Q9T4* zZ{&`)b_M{7Ld!aQfK~<2aTbT?TUU6+dOOVt#rvDHT5F0WWso8+(Uk3dFCpTwugO{H zC89|~n>5AVntF)_`HTmgA3x?UoH}VfnU!M#EA6~_=DIj6Qh>{$uKj}zAdg=Qf#-5M zOu#i^c(RjvwzJ93F}3}PooO+UShqrgB&;dBugj}}u}$cFvAUF2^3hIVC`Uy{{w6WV zm(n^PupPUumBF%9Qbclgw~p6VJS3EflL`a$c15JQI8k#>=e4mQ|?Hgj~zd>WIV-~$vjyvq#$D z*^|djDA|@Lp5i!BpfE)^1wQGwdlbChq;uC+VFD>GhI3gXOUXSpvpj)MxuD29*ITt7 z``PE^f<*wTDW#7z1^^wgN&IhP-b`;~;lE-z@h#2uoIypt(v_>7=%f;MeGl%n^IW@u zBkGx!xY}^{=MqiN*&o|(N_*9miIH9e-_=>D4Hm^Ak?OE;t?^}7He1POz-U$PbVRy7 z#524obhL~0j7+S7Ta0!)(ZN(=-`RUeZF$-K>AxLfy2qpM%^ks>WMyoRf;El8lHnTQ z6nvBIZQGIeL@`^Kq8(`I&4fnKijlT#0*%2cfomAY4XX_}E|1SRZ?UQ8t06&A4*cc=&R8{(`q)=zLv%eeoE*?4RT5VGVe%{OuLevpk}x*GVSt zIe-6FW929LQ`u&A|BA4-I#s`aQGg1a%`^i4=Pv+k&sy{7=^YFn35~?TYk+0Tl2kBN z2QzY#B+y?mlo6EpS3Sz5V#^fZ`CA$M+w(D2csH@72M7Iz*{rxg58Eva=Lj2qkc}_0Z0f42iP5gJN8-B5lYYP`fxs+#ryAjZ~U7(Gw$r6W6Qmm#;k7WlaKvq+d zJFOuIhE2ER=kZch!+gR++v*X_FLzs8Y9vr4g~DvkES*W}uQ+axp_HJqGG*OWX(bpr z+Y}7dSrm~?&1kS@1NYMN&%W18{p_#$8xU;2m4*(Hqv_;m*~C<9HYxQOG9Q8D_zU+Q zFM8|pcf+Atq{w|XooC6`q_EV(sDqAWC{&URU_Ep;cf^v)vv@B-J9=4v)g z_2#KC2y~TB_-9UqOsS%LqNiTm_9ZdAgxaP8Heht3MsPK9Klxod?TG3-iE^uor2RHl zl#meH8eQd&;eB16DLAzwS71FA?`7}V`+ihkWnG`le5MWXMbrbsywvAlwq{4#m12sa zoxd4xw2V`hkqanPTB-6zUyQzi(BczLj7MtdAQOX#Z*-^Yw{P1dc8e;eEz!4)&Wc{x z@{W>Hf8F{ZZnS;9D*Ge-BZ~d#Md^tp?imt?lD!~$3+-QHe7ks`#jJW%gF{K9Cm`85 zoLS1aeWX%tur8$?NRs37dj)MOKNiej)(lb}#l0(@k3Xcr5@mWVpBZD-3q0Ro$$w*( zk=>J0O!qrTLPB9i-SBth$KWUZ+T81Y&1GH-r7J<#enxa&I)%r?&BL}?tpf9Q^K#}( zgjhGEpk*G(QRCDFfP$z?=LwLrqks-CFL%Lt{56$iu*7_FN~i%JaVvKduG+2{gniuA z1?G)Dp}fCU^OsV}%+ZImZrr2H=Zrel%5cXlsUeiA(Az2ks8vcIxZyc3II4ellY! z=RvVs*AqA!Xu}uE-@x}tKtGyXZn!unSU+vejRi8NWy0&{fc1|AGL?;36wx2VzGkrv zi}4#@RrI(DOjPSJ4icEj_|fd3FinFrWKZHfo|U*G09hpV^+X|Jt^%vDBCzq#9t_%S z9jGEZDN|sX4d%E&Wg$Cc!)A>^)q}sm;^rE|5Ee3FF8c!K`{)JeH#<;OgqN#NY_kFE zld6^7>OL%oaUXTAry!Ofr!!)Hry|#5xz7`0eD-q5gXfR!I5CTWWbHWfc?Q;e_Xa?F zg(Kuf>u`3oXFcZ8soItrh?}Wg>B{x9OY!E<9;4Tr8GlAqO~~~}^}862(mB=kFJZu! z4AGQbgsu3zY+!V!w2 zyh6sDuN}V69b{V7Uz{IPj!_UqO5-OMqq$m;Lq%wshoCx!O^!QAygD8HBArV?1UNQgeK><1zWsAC$`>09_f6;r~1!$r>kd zNPXkHP4yj_b};A&<1XDCVkgn`tTLt%ZZ~Yr8deGpS>K@*CWpgp$_Er!suH4RK?DfS z>R&enP=Pld7~MaQ8Wy1}1_PaAtC(i2GGQ9T&@QEh{2E z$t3GQ{8T~<&+kz1MVsvE~;SO1Ohw_N%BEu>u0?U$>d) zk}PfPpJwZRCxLtB{|Vq-K+B_$-)`bw&nS^-rG|x^UeQtJfu~t_4aLnb0*|&T1;iv` zSgZT@HP+AKz(C(cmXQ4HKgEmx64NipXrC3Qwvck&GgiL}!AZB1Y zZYs=n&&VY+Z1B|-p5EJ4s@-{Uq$3|K$d|06S}WMK=pC^NliqkVj*q2XA-Y*#otyHi zQ&0R5apQY13vs3%>Nfz*LU{jhL>PPT8Qka+Vv&qHb+x|KO@U@)h)uF zv+|DO7nL@}%)-yIfl>Etjb|@Ewsh=%$V2J+Q4uFh7z<;`DuNs8%1N=H30t$&x9 zPWxa=X0Eh7Y<;g@qu_j6Xena8XdvlFvOKPmlO{*5o_)2r08hq&aFi+JsLN#dmdwPb zB8&S>#ym;D(`w+{HLXKz84)YYM_VT0ne=9!XW`9I(QjPuoH&HHNuuU6VNeHFfip|n z3*`?92_w4Xm_xj!;!JC|IX0UNeu|q^qJJ6i;v{~nB)fvY*C?;XG%rVBKw-!~V<8w+ zhp7m5NX$=Qb^`z)Up^n+}g$(OGUm)4Xnfml;x7ng*JM|13$`AEW;*=QdIzOFL3 z|L}VD(KdT{B3Z%d#eXu}U09XN_4L5y?ijrGkxtUj{-vEvyTli)_gzopehcQ40N`N2 zt-MY^^)oe36~Kr0iv3!doLi#JSjP$N8Rq)WN@|}a69pN0A?K{WSIuuYWey4i^#s{) zGxnr~nb{$l#65%I1S4Dvo1-_3T^y^A-dSpsna3@dqi{`MlwsIA*el3LB)2JK&Ghqr ziYIG?ue1*ETZb96f%3NGq}@8rpgA}ADeOvN)5d=riDLbYVnj??y-V~ryn#&IXoB}m zm^tdX&mbe#eh?UYcAJ%nWe~fL1@1s(F&t8Z$MzA9Z0(Qef{;KouG}2^%6hjJ02WWU zWSlK`lb^zN)emqVkgHt^;B5j!`prW0^-p3DLg)Nd4>=7swNn8t>(bEEEV(ldTz9-Y z2(v8t>B@vn$mc4GKO@FRG}(ku19LJ5cvw(BD-JhQQjqqr)7v+}xunMrLG%86$H{Mim7-UF#5oGHcJyVnlIMfGFjQ ztXlj+;2})$;!;o1xYDK3M-!;VX;k@lNw3Jx#{>S9ntSUSzl(b$v4Dv?r{%l4b_+J< zmpw(mhS%|ji6tPg2~_Kt8}%PL6tjurxy%*v72q?HK3JyY7BWTZ7K0#l>UCeYz#ZaT zeQw*frGU5(q&;t_D^JK%_Pv;O@#PliH** zS8YUMMHxLr7-x(X=Xl9PFxQP++&k`YvtuKLIKqgubBnZJnD@rNx>GzV`<<=i+j+Hb z5(}lY)X~mWf2r+Bo<=4vagRi%A>h$Ac<<7h>wdzrC?mtECg_}q{k*=mXt1aepXZ_{ zC<8D&Z(F#Q%+V5pf`*T|6!8mgN)`SENU;~A*{GZxfNjU*J=IkuxZoSvs=8RwC=L1N zvpVhYiWg(N*f2Yw=gpjyw?~|`B#1dJ8-t>HAKoP^YFSrLFA1@DOhY+KKnYP%2Wy>pxY8PNIaqo`FNYjd!vR58JJJiYJ*NXW-D zO~yeEQ(vh-oIcIvq}s#B+SOs191t#>yLg}BS$vwDHz*Z@_2g=kc|PvcuqO6{>Lr|k z!k|uz#h#`rDV}?VuDP7+@zJiC1{Y;3Va;rHo=$;}pDRHpwpE&n%fw-mEqRoP0<}Sk zc$PF~_TIJ$4^oHfF+sTAihUF)9EfEA{ii&@l*_!%PWziEp`ZeLq;pMO)Cge>S}zSF ziYFKpfG)l*@7hU&osu3#NG=LQYSLDT$i|V2pWkvL{Npp%qD8$)lw8J1Ou<}zjp4hw zRU{uosA`XWvDr)9(%@)ieh)mv)N|*Gvp6T*COCLbKhT<~rP$kJ1<7mM{FFNj?^)$M2Ru`<14<&dItaI)-9xTm;F(xCM!;-8j5IDvSVYT>%O4}8S3x;H7esWoFncX(X& z&TIk%thF++xVVgJl7+eL!>XTG@ZuU&J*c4j;s28c7lP%X1qWSI1N{YS=k>4G8l}xs zHDmEBy#HZQs$7DSqQZMi&p<;uK8n}F&r96g0q)zNx}zp%^y?iCnV*X?DBt>mp-%Hr z&U4FD-nll8(hE+^Xi`*dLEI59o6fQ6(@ZHqQ1DAU{6&yM<*l7D`fhH?_yfsKTfm<) zkK3Z}14`1BsS@2P&EDQ#`uBF`9t{_>P?=C zQAHHuowu_SqJ{Ye2?j&R+u|%3ko5Et;)t91HdmeTMo+65?h_L1gg9t?;w)1!U}_>y zR=q6!{WcZIsmiPncGOx>ygPc6JFjLT2XEYtOmZpu{2LdgP1j=LS7jFltR;6eD7d)( zI(h|3xmznXloP1TXAWK@m?C#ch`7dhGtRdeCULg4%&7t`*^~W`MFY*1n5vVywLQ%; zsTr1)aN)J`d7yfzE*;r6D1Ei+5R>H~7c%;i7s2(x8!J zZm>^wlj2%Q3sN%KpOYmg!xERGC-U|d$Qi(ZworR5bYQSb-$;^?#nLq}#2;)o8!Hw8 zMM*33{e>%g)P3UIcMHai*(5nIdAQvA4au(AiKYv5c@N88-SiN`Dqh<)dVyW&+Sh%; z(Z2?#nFf=%jg@veq|cU7&J}}Q{gN{NfX2O4nV~bto+*$H)T3ud`R{CoOi>0iN5eU~ zl60(; zBrX#AZM4motq#=X^vzD5ZKORr%R_gaPtD4X1D*n(yG$01=s7L~r{fe-oSaL+@y0t!+qw#^0`c{>vd5L*Nk zHG@b2m-(9V5esu8ebo%YQ(vmmb!Ua-4h|gqIF9d^#@0h2q5{l!e$nEmTmw-^B$>Ew zixlj1t!G(hqzFoG`c!6iK46YQ63{>k1jnj+zym^9lUh*M+)-(YFJRl?G=>chVu2-# zlfpgZ9zvZ#m=nOL{mi;{1Z{g$dLlIvCB)i!+y*mVeo;G0twe9fVU|G1(sm*?A3bAZ zLu1q^ck6gCs@{j_cra=d>NRP*E<9C6`D&3I#%IW$NYCHIt;XD*33mMc zN3&mIsh8VsjAnQu)0b9GVum{PXm(d-E8q+)LiCrP%)QA{okBn~S!(49(Fu1$>M=*B z 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 LSXI^4-;E0ZvpzGV literal 0 HcmV?d00001 diff --git a/extern/hyrise_sql_parser/example/.gitignore b/extern/hyrise_sql_parser/example/.gitignore new file mode 100644 index 0000000000..96236f8158 --- /dev/null +++ b/extern/hyrise_sql_parser/example/.gitignore @@ -0,0 +1 @@ +example \ No newline at end of file diff --git a/extern/hyrise_sql_parser/example/Makefile b/extern/hyrise_sql_parser/example/Makefile new file mode 100644 index 0000000000..387b553efb --- /dev/null +++ b/extern/hyrise_sql_parser/example/Makefile @@ -0,0 +1,6 @@ + +CFLAGS = -std=c++1z -lstdc++ -Wall -Werror -I../src/ -L../ + +all: + $(CXX) $(CFLAGS) example.cpp -o example -lsqlparser + diff --git a/extern/hyrise_sql_parser/example/example.cpp b/extern/hyrise_sql_parser/example/example.cpp new file mode 100644 index 0000000000..943de4b259 --- /dev/null +++ b/extern/hyrise_sql_parser/example/example.cpp @@ -0,0 +1,41 @@ + +#include +#include + +// include the sql parser +#include "SQLParser.h" + +// contains printing utilities +#include "util/sqlhelper.h" + +int main(int argc, char* argv[]) { + if (argc <= 1) { + fprintf(stderr, "Usage: ./example \"SELECT * FROM test;\"\n"); + return -1; + } + std::string query = argv[1]; + + // parse a given query + hsql::SQLParserResult result; + hsql::SQLParser::parse(query, &result); + + // check whether the parsing was successful + + if (result.isValid()) { + printf("Parsed successfully!\n"); + printf("Number of statements: %lu\n", result.size()); + + for (auto i = 0u; i < result.size(); ++i) { + // Print a statement summary. + hsql::printStatementInfo(result.getStatement(i)); + } + return 0; + } else { + fprintf(stderr, "Given string is not a valid SQL query.\n"); + fprintf(stderr, "%s (L%d:%d)\n", + result.errorMsg(), + result.errorLine(), + result.errorColumn()); + return -1; + } +} diff --git a/extern/hyrise_sql_parser/format.sh b/extern/hyrise_sql_parser/format.sh new file mode 100644 index 0000000000..2d6d545bdf --- /dev/null +++ b/extern/hyrise_sql_parser/format.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +unamestr=$(uname) +if [[ "$unamestr" == 'Darwin' ]]; then + clang_format="$(brew --prefix llvm)/bin/clang-format" + format_cmd="$clang_format -i -style=file '{}'" +elif [[ "$unamestr" == 'Linux' ]]; then + format_cmd="clang-format -i -style=file '{}'" +fi + +source_regex="^(src|test).*\.(cpp|h|y)" + +if [ "${1}" = "all" ]; then + find src test | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" +elif [ "$1" = "modified" ]; then + # Run on all changed as well as untracked cpp/hpp files, as compared to the current HEAD. Skip deleted files. + { git diff --diff-filter=d --name-only & git ls-files --others --exclude-standard; } | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" +elif [ "$1" = "staged" ]; then + # Run on all files that are staged to be committed. + git diff --diff-filter=d --cached --name-only | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" +else + # Run on all changed as well as untracked cpp/hpp files, as compared to the current main. Skip deleted files. + { git diff --diff-filter=d --name-only main & git ls-files --others --exclude-standard; } | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" +fi diff --git a/extern/hyrise_sql_parser/src/SQLParser.cpp b/extern/hyrise_sql_parser/src/SQLParser.cpp new file mode 100644 index 0000000000..b3bf0dfe11 --- /dev/null +++ b/extern/hyrise_sql_parser/src/SQLParser.cpp @@ -0,0 +1,74 @@ + +#include "SQLParser.h" +#include +#include +#include "parser/bison_parser.h" +#include "parser/flex_lexer.h" + +namespace hsql { + +SQLParser::SQLParser() { fprintf(stderr, "SQLParser only has static methods atm! Do not initialize!\n"); } + +// static +bool SQLParser::parse(const std::string& sql, SQLParserResult* result) { + yyscan_t scanner; + YY_BUFFER_STATE state; + + if (hsql_lex_init(&scanner)) { + // Couldn't initialize the lexer. + fprintf(stderr, "SQLParser: Error when initializing lexer!\n"); + return false; + } + const char* text = sql.c_str(); + state = hsql__scan_string(text, scanner); + + // Parse the tokens. + // If parsing fails, the result will contain an error object. + int ret = hsql_parse(result, scanner); + bool success = (ret == 0); + result->setIsValid(success); + + hsql__delete_buffer(state, scanner); + hsql_lex_destroy(scanner); + + return true; +} + +// static +bool SQLParser::parseSQLString(const char* sql, SQLParserResult* result) { return parse(sql, result); } + +bool SQLParser::parseSQLString(const std::string& sql, SQLParserResult* result) { return parse(sql, result); } + +// static +bool SQLParser::tokenize(const std::string& sql, std::vector* tokens) { + // Initialize the scanner. + yyscan_t scanner; + if (hsql_lex_init(&scanner)) { + fprintf(stderr, "SQLParser: Error when initializing lexer!\n"); + return false; + } + + YY_BUFFER_STATE state; + state = hsql__scan_string(sql.c_str(), scanner); + + YYSTYPE yylval; + YYLTYPE yylloc; + + // Step through the string until EOF is read. + // Note: hsql_lex returns int, but we know that its range is within 16 bit. + int16_t token = hsql_lex(&yylval, &yylloc, scanner); + while (token != 0) { + tokens->push_back(token); + token = hsql_lex(&yylval, &yylloc, scanner); + + if (token == SQL_IDENTIFIER || token == SQL_STRING) { + free(yylval.sval); + } + } + + hsql__delete_buffer(state, scanner); + hsql_lex_destroy(scanner); + return true; +} + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/SQLParser.h b/extern/hyrise_sql_parser/src/SQLParser.h new file mode 100644 index 0000000000..707ba8ea34 --- /dev/null +++ b/extern/hyrise_sql_parser/src/SQLParser.h @@ -0,0 +1,35 @@ +#ifndef SQLPARSER_SQLPARSER_H +#define SQLPARSER_SQLPARSER_H + +#include "SQLParserResult.h" +#include "sql/statements.h" + +namespace hsql { + +// Static methods used to parse SQL strings. +class SQLParser { + public: + // Parses a given constant character SQL string into the result object. + // Returns true if the lexer and parser could run without internal errors. + // This does NOT mean that the SQL string was valid SQL. To check that + // you need to check result->isValid(); + static bool parse(const std::string& sql, SQLParserResult* result); + + // Run tokenization on the given string and store the tokens in the output vector. + static bool tokenize(const std::string& sql, std::vector* tokens); + + // Deprecated. + // Old method to parse SQL strings. Replaced by parse(). + static bool parseSQLString(const char* sql, SQLParserResult* result); + + // Deprecated. + // Old method to parse SQL strings. Replaced by parse(). + static bool parseSQLString(const std::string& sql, SQLParserResult* result); + + private: + SQLParser(); +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/SQLParserResult.cpp b/extern/hyrise_sql_parser/src/SQLParserResult.cpp new file mode 100644 index 0000000000..b8a43430ef --- /dev/null +++ b/extern/hyrise_sql_parser/src/SQLParserResult.cpp @@ -0,0 +1,82 @@ + +#include "SQLParserResult.h" +#include + +namespace hsql { + +SQLParserResult::SQLParserResult() : isValid_(false), errorMsg_(nullptr) {} + +SQLParserResult::SQLParserResult(SQLStatement* stmt) : isValid_(false), errorMsg_(nullptr) { addStatement(stmt); } + +// Move constructor. +SQLParserResult::SQLParserResult(SQLParserResult&& moved) { *this = std::forward(moved); } + +SQLParserResult& SQLParserResult::operator=(SQLParserResult&& moved) { + isValid_ = moved.isValid_; + errorMsg_ = moved.errorMsg_; + statements_ = std::move(moved.statements_); + + moved.errorMsg_ = nullptr; + moved.reset(); + return *this; +} + +SQLParserResult::~SQLParserResult() { reset(); } + +void SQLParserResult::addStatement(SQLStatement* stmt) { statements_.push_back(stmt); } + +const SQLStatement* SQLParserResult::getStatement(size_t index) const { return statements_[index]; } + +SQLStatement* SQLParserResult::getMutableStatement(size_t index) { return statements_[index]; } + +size_t SQLParserResult::size() const { return statements_.size(); } + +bool SQLParserResult::isValid() const { return isValid_; } + +const char* SQLParserResult::errorMsg() const { return errorMsg_; } + +int SQLParserResult::errorLine() const { return errorLine_; } + +int SQLParserResult::errorColumn() const { return errorColumn_; } + +void SQLParserResult::setIsValid(bool isValid) { isValid_ = isValid; } + +void SQLParserResult::setErrorDetails(char* errorMsg, int errorLine, int errorColumn) { + errorMsg_ = errorMsg; + errorLine_ = errorLine; + errorColumn_ = errorColumn; +} + +const std::vector& SQLParserResult::getStatements() const { return statements_; } + +std::vector SQLParserResult::releaseStatements() { + std::vector copy = statements_; + + statements_.clear(); + + return copy; +} + +void SQLParserResult::reset() { + for (SQLStatement* statement : statements_) { + delete statement; + } + statements_.clear(); + + isValid_ = false; + + free(errorMsg_); + errorMsg_ = nullptr; + errorLine_ = -1; + errorColumn_ = -1; +} + +// Does NOT take ownership. +void SQLParserResult::addParameter(Expr* parameter) { + parameters_.push_back(parameter); + std::sort(parameters_.begin(), parameters_.end(), [](const Expr* a, const Expr* b) { return a->ival < b->ival; }); +} + +const std::vector& SQLParserResult::parameters() { return parameters_; } + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/SQLParserResult.h b/extern/hyrise_sql_parser/src/SQLParserResult.h new file mode 100644 index 0000000000..c33bc3d00b --- /dev/null +++ b/extern/hyrise_sql_parser/src/SQLParserResult.h @@ -0,0 +1,94 @@ +#ifndef SQLPARSER_SQLPARSER_RESULT_H +#define SQLPARSER_SQLPARSER_RESULT_H + +#include "sql/SQLStatement.h" + +namespace hsql { +// Represents the result of the SQLParser. +// If parsing was successful it contains a list of SQLStatement. +class SQLParserResult { + public: + // Initialize with empty statement list. + SQLParserResult(); + + // Initialize with a single statement. + // Takes ownership of the statement. + SQLParserResult(SQLStatement* stmt); + + // Move constructor. + SQLParserResult(SQLParserResult&& moved); + SQLParserResult& operator=(SQLParserResult&& moved); + + // Deletes all statements in the result. + virtual ~SQLParserResult(); + + // Set whether parsing was successful. + void setIsValid(bool isValid); + + // Returns true if parsing was successful. + bool isValid() const; + + // Returns the number of statements in the result. + size_t size() const; + + // Set the details of the error, if available. + // Takes ownership of errorMsg. + void setErrorDetails(char* errorMsg, int errorLine, int errorColumn); + + // Returns the error message, if an error occurred. + const char* errorMsg() const; + + // Returns the line number of the occurrance of the error in the query. + int errorLine() const; + + // Returns the column number of the occurrance of the error in the query. + int errorColumn() const; + + // Adds a statement to the result list of statements. + // SQLParserResult takes ownership of the statement. + void addStatement(SQLStatement* stmt); + + // Gets the SQL statement with the given index. + const SQLStatement* getStatement(size_t index) const; + + // Gets the non const SQL statement with the given index. + SQLStatement* getMutableStatement(size_t index); + + // Get the list of all statements. + const std::vector& getStatements() const; + + // Returns a copy of the list of all statements in this result. + // Removes them from this result. + std::vector releaseStatements(); + + // Deletes all statements and other data within the result. + void reset(); + + // Does NOT take ownership. + void addParameter(Expr* parameter); + + const std::vector& parameters(); + + private: + // List of statements within the result. + std::vector statements_; + + // Flag indicating the parsing was successful. + bool isValid_; + + // Error message, if an error occurred. + char* errorMsg_; + + // Line number of the occurrance of the error in the query. + int errorLine_; + + // Column number of the occurrance of the error in the query. + int errorColumn_; + + // Does NOT have ownership. + std::vector parameters_; +}; + +} // namespace hsql + +#endif // SQLPARSER_SQLPARSER_RESULT_H diff --git a/extern/hyrise_sql_parser/src/parser/.gitignore b/extern/hyrise_sql_parser/src/parser/.gitignore new file mode 100644 index 0000000000..1c0c561385 --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/.gitignore @@ -0,0 +1,2 @@ +*.output +conflict_test.cpp \ No newline at end of file diff --git a/extern/hyrise_sql_parser/src/parser/Makefile b/extern/hyrise_sql_parser/src/parser/Makefile new file mode 100644 index 0000000000..1a9d70d6cc --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/Makefile @@ -0,0 +1,39 @@ +# bison's version is too old on OSX, allow user to pass in custom path +BISON?=bison +FLEX?=flex + +OS_TYPE=$(shell uname) +ifeq ($(OS_TYPE), Darwin) +BREW_PREFIX=$(shell brew --prefix) +BREW_INSTALLED=$(shell echo $(BREW_PREFIX) | wc -w | xargs) +ifeq ($(BREW_INSTALLED), 0) +$(error On macOS, Homebrew (see https://brew.sh) is required to install recent Bison and Flex versions) +endif +endif + +BISON_VERSION=$(shell $(BISON) --version | head -n 1 | grep -o '[0-9]\.[0-9]\+') +BISON_VERSION_SUPPORTED=$(shell awk -v a=$(BISON_VERSION) -v b="3.0" 'BEGIN { print (a >= b) ? 1 : 0 }') +ifneq ($(BISON_VERSION_SUPPORTED), 1) +$(error Bison version $(BISON_VERSION) not supported. If you are using macOS, `bison` uses the system default instead of the brew version. Run BISON=$(BREW_PREFIX)/opt/bison/bin/bison make) +endif + +FLEX_VERSION=$(shell $(FLEX) --version | head -n 1 | grep -o '[0-9]\.[0-9]\+') +FLEX_VERSION_SUPPORTED=$(shell awk -v a=$(FLEX_VERSION) -v b="2.6" 'BEGIN { print (a >= b) ? 1 : 0 }') +ifneq ($(FLEX_VERSION_SUPPORTED), 1) +$(error Flex version $(FLEX_VERSION) not supported. If you are using macOS, `flex` uses the system default instead of the brew version. Run FLEX=$(BREW_PREFIX)/opt/flex/bin/flex make) +endif + +all: bison_parser.cpp flex_lexer.cpp + +bison_parser.cpp: bison_parser.y + $(BISON) bison_parser.y --output=bison_parser.cpp --defines=bison_parser.h --verbose + +flex_lexer.cpp: flex_lexer.l + ! $(FLEX) flex_lexer.l 2>&1 | grep "warning" + +clean: + rm -f bison_parser.cpp flex_lexer.cpp bison_parser.h flex_lexer.h *.output + +# Tests if the parser builds correctly and doesn't contain conflicts. +test: + ! $(BISON) bison_parser.y -v --output=conflict_test.cpp 2>&1 | grep "conflict" >&2 diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.cpp b/extern/hyrise_sql_parser/src/parser/bison_parser.cpp new file mode 100644 index 0000000000..dce3aa8d08 --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/bison_parser.cpp @@ -0,0 +1,6281 @@ +/* A Bison parser, made by GNU Bison 3.7.4. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30704 + +/* Bison version string. */ +#define YYBISON_VERSION "3.7.4" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 2 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Substitute the type names. */ +#define YYSTYPE HSQL_STYPE +#define YYLTYPE HSQL_LTYPE +/* Substitute the variable and function names. */ +#define yyparse hsql_parse +#define yylex hsql_lex +#define yyerror hsql_error +#define yydebug hsql_debug +#define yynerrs hsql_nerrs + +/* First part of user prologue. */ +#line 2 "bison_parser.y" + + +/** + * bison_parser.y + * defines bison_parser.h + * outputs bison_parser.c + * + * Grammar File Spec: http://dinosaur.compilertools.net/bison/bison_6.html + * + */ +/********************************* + ** Section 1: C Declarations + *********************************/ + +// clang-format on +#include "bison_parser.h" +#include "flex_lexer.h" + +#include +#include + + using namespace hsql; + + int yyerror(YYLTYPE * llocp, SQLParserResult * result, yyscan_t scanner, const char* msg) { + result->setIsValid(false); + result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); + return 0; + } + // clang-format off + +#line 109 "bison_parser.cpp" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +#include "bison_parser.h" +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_IDENTIFIER = 3, /* IDENTIFIER */ + YYSYMBOL_STRING = 4, /* STRING */ + YYSYMBOL_BIGINTVAL = 5, /* BIGINTVAL */ + YYSYMBOL_FLOATVAL = 6, /* FLOATVAL */ + YYSYMBOL_INTVAL = 7, /* INTVAL */ + YYSYMBOL_NULLSAFEEQUALS = 8, /* NULLSAFEEQUALS */ + YYSYMBOL_DEALLOCATE = 9, /* DEALLOCATE */ + YYSYMBOL_PARAMETERS = 10, /* PARAMETERS */ + YYSYMBOL_INTERSECT = 11, /* INTERSECT */ + YYSYMBOL_TEMPORARY = 12, /* TEMPORARY */ + YYSYMBOL_TIMESTAMP = 13, /* TIMESTAMP */ + YYSYMBOL_DISTINCT = 14, /* DISTINCT */ + YYSYMBOL_NVARCHAR = 15, /* NVARCHAR */ + YYSYMBOL_RESTRICT = 16, /* RESTRICT */ + YYSYMBOL_TRUNCATE = 17, /* TRUNCATE */ + YYSYMBOL_ANALYZE = 18, /* ANALYZE */ + YYSYMBOL_BETWEEN = 19, /* BETWEEN */ + YYSYMBOL_CASCADE = 20, /* CASCADE */ + YYSYMBOL_COLUMNS = 21, /* COLUMNS */ + YYSYMBOL_CONTROL = 22, /* CONTROL */ + YYSYMBOL_DEFAULT = 23, /* DEFAULT */ + YYSYMBOL_EXECUTE = 24, /* EXECUTE */ + YYSYMBOL_EXPLAIN = 25, /* EXPLAIN */ + YYSYMBOL_ENCODING = 26, /* ENCODING */ + YYSYMBOL_INTEGER = 27, /* INTEGER */ + YYSYMBOL_NATURAL = 28, /* NATURAL */ + YYSYMBOL_PREPARE = 29, /* PREPARE */ + YYSYMBOL_SCHEMAS = 30, /* SCHEMAS */ + YYSYMBOL_CHARACTER_VARYING = 31, /* CHARACTER_VARYING */ + YYSYMBOL_REAL = 32, /* REAL */ + YYSYMBOL_DECIMAL = 33, /* DECIMAL */ + YYSYMBOL_SMALLINT = 34, /* SMALLINT */ + YYSYMBOL_BIGINT = 35, /* BIGINT */ + YYSYMBOL_SPATIAL = 36, /* SPATIAL */ + YYSYMBOL_VARCHAR = 37, /* VARCHAR */ + YYSYMBOL_VIRTUAL = 38, /* VIRTUAL */ + YYSYMBOL_DESCRIBE = 39, /* DESCRIBE */ + YYSYMBOL_BEFORE = 40, /* BEFORE */ + YYSYMBOL_COLUMN = 41, /* COLUMN */ + YYSYMBOL_CREATE = 42, /* CREATE */ + YYSYMBOL_DELETE = 43, /* DELETE */ + YYSYMBOL_DIRECT = 44, /* DIRECT */ + YYSYMBOL_DOUBLE = 45, /* DOUBLE */ + YYSYMBOL_ESCAPE = 46, /* ESCAPE */ + YYSYMBOL_EXCEPT = 47, /* EXCEPT */ + YYSYMBOL_EXISTS = 48, /* EXISTS */ + YYSYMBOL_EXTRACT = 49, /* EXTRACT */ + YYSYMBOL_CAST = 50, /* CAST */ + YYSYMBOL_FORMAT = 51, /* FORMAT */ + YYSYMBOL_GLOBAL = 52, /* GLOBAL */ + YYSYMBOL_HAVING = 53, /* HAVING */ + YYSYMBOL_IMPORT = 54, /* IMPORT */ + YYSYMBOL_INSERT = 55, /* INSERT */ + YYSYMBOL_ISNULL = 56, /* ISNULL */ + YYSYMBOL_OFFSET = 57, /* OFFSET */ + YYSYMBOL_RENAME = 58, /* RENAME */ + YYSYMBOL_SCHEMA = 59, /* SCHEMA */ + YYSYMBOL_SELECT = 60, /* SELECT */ + YYSYMBOL_SORTED = 61, /* SORTED */ + YYSYMBOL_TABLES = 62, /* TABLES */ + YYSYMBOL_UNLOAD = 63, /* UNLOAD */ + YYSYMBOL_UPDATE = 64, /* UPDATE */ + YYSYMBOL_VALUES = 65, /* VALUES */ + YYSYMBOL_AFTER = 66, /* AFTER */ + YYSYMBOL_ALTER = 67, /* ALTER */ + YYSYMBOL_CROSS = 68, /* CROSS */ + YYSYMBOL_DELTA = 69, /* DELTA */ + YYSYMBOL_FLOAT = 70, /* FLOAT */ + YYSYMBOL_GROUP = 71, /* GROUP */ + YYSYMBOL_INDEX = 72, /* INDEX */ + YYSYMBOL_INNER = 73, /* INNER */ + YYSYMBOL_LIMIT = 74, /* LIMIT */ + YYSYMBOL_LOCAL = 75, /* LOCAL */ + YYSYMBOL_MERGE = 76, /* MERGE */ + YYSYMBOL_MINUS = 77, /* MINUS */ + YYSYMBOL_ORDER = 78, /* ORDER */ + YYSYMBOL_OVER = 79, /* OVER */ + YYSYMBOL_OUTER = 80, /* OUTER */ + YYSYMBOL_RIGHT = 81, /* RIGHT */ + YYSYMBOL_TABLE = 82, /* TABLE */ + YYSYMBOL_UNION = 83, /* UNION */ + YYSYMBOL_USING = 84, /* USING */ + YYSYMBOL_WHERE = 85, /* WHERE */ + YYSYMBOL_CALL = 86, /* CALL */ + YYSYMBOL_CASE = 87, /* CASE */ + YYSYMBOL_CHAR = 88, /* CHAR */ + YYSYMBOL_COPY = 89, /* COPY */ + YYSYMBOL_DATE = 90, /* DATE */ + YYSYMBOL_DATETIME = 91, /* DATETIME */ + YYSYMBOL_DESC = 92, /* DESC */ + YYSYMBOL_DIV = 93, /* DIV */ + YYSYMBOL_DROP = 94, /* DROP */ + YYSYMBOL_ELSE = 95, /* ELSE */ + YYSYMBOL_FILE = 96, /* FILE */ + YYSYMBOL_FROM = 97, /* FROM */ + YYSYMBOL_FULL = 98, /* FULL */ + YYSYMBOL_HASH = 99, /* HASH */ + YYSYMBOL_HINT = 100, /* HINT */ + YYSYMBOL_INTO = 101, /* INTO */ + YYSYMBOL_JOIN = 102, /* JOIN */ + YYSYMBOL_LEFT = 103, /* LEFT */ + YYSYMBOL_LIKE = 104, /* LIKE */ + YYSYMBOL_LOAD = 105, /* LOAD */ + YYSYMBOL_LONG = 106, /* LONG */ + YYSYMBOL_NULL = 107, /* NULL */ + YYSYMBOL_PARTITION = 108, /* PARTITION */ + YYSYMBOL_PLAN = 109, /* PLAN */ + YYSYMBOL_SHOW = 110, /* SHOW */ + YYSYMBOL_TEXT = 111, /* TEXT */ + YYSYMBOL_THEN = 112, /* THEN */ + YYSYMBOL_TIME = 113, /* TIME */ + YYSYMBOL_VIEW = 114, /* VIEW */ + YYSYMBOL_WHEN = 115, /* WHEN */ + YYSYMBOL_WITH = 116, /* WITH */ + YYSYMBOL_ADD = 117, /* ADD */ + YYSYMBOL_ALL = 118, /* ALL */ + YYSYMBOL_AND = 119, /* AND */ + YYSYMBOL_ASC = 120, /* ASC */ + YYSYMBOL_END = 121, /* END */ + YYSYMBOL_FOR = 122, /* FOR */ + YYSYMBOL_INT = 123, /* INT */ + YYSYMBOL_NOT = 124, /* NOT */ + YYSYMBOL_OFF = 125, /* OFF */ + YYSYMBOL_SET = 126, /* SET */ + YYSYMBOL_TOP = 127, /* TOP */ + YYSYMBOL_AS = 128, /* AS */ + YYSYMBOL_BY = 129, /* BY */ + YYSYMBOL_IF = 130, /* IF */ + YYSYMBOL_IN = 131, /* IN */ + YYSYMBOL_IS = 132, /* IS */ + YYSYMBOL_OF = 133, /* OF */ + YYSYMBOL_ON = 134, /* ON */ + YYSYMBOL_OR = 135, /* OR */ + YYSYMBOL_TO = 136, /* TO */ + YYSYMBOL_NO = 137, /* NO */ + YYSYMBOL_ARRAY = 138, /* ARRAY */ + YYSYMBOL_CONCAT = 139, /* CONCAT */ + YYSYMBOL_ILIKE = 140, /* ILIKE */ + YYSYMBOL_MOD = 141, /* MOD */ + YYSYMBOL_SECOND = 142, /* SECOND */ + YYSYMBOL_MINUTE = 143, /* MINUTE */ + YYSYMBOL_HOUR = 144, /* HOUR */ + YYSYMBOL_DAY = 145, /* DAY */ + YYSYMBOL_MONTH = 146, /* MONTH */ + YYSYMBOL_YEAR = 147, /* YEAR */ + YYSYMBOL_SECONDS = 148, /* SECONDS */ + YYSYMBOL_MINUTES = 149, /* MINUTES */ + YYSYMBOL_HOURS = 150, /* HOURS */ + YYSYMBOL_DAYS = 151, /* DAYS */ + YYSYMBOL_MONTHS = 152, /* MONTHS */ + YYSYMBOL_YEARS = 153, /* YEARS */ + YYSYMBOL_INTERVAL = 154, /* INTERVAL */ + YYSYMBOL_TRUE = 155, /* TRUE */ + YYSYMBOL_FALSE = 156, /* FALSE */ + YYSYMBOL_BOOLEAN = 157, /* BOOLEAN */ + YYSYMBOL_TRANSACTION = 158, /* TRANSACTION */ + YYSYMBOL_BEGIN = 159, /* BEGIN */ + YYSYMBOL_COMMIT = 160, /* COMMIT */ + YYSYMBOL_ROLLBACK = 161, /* ROLLBACK */ + YYSYMBOL_NOWAIT = 162, /* NOWAIT */ + YYSYMBOL_SKIP = 163, /* SKIP */ + YYSYMBOL_LOCKED = 164, /* LOCKED */ + YYSYMBOL_SHARE = 165, /* SHARE */ + YYSYMBOL_RANGE = 166, /* RANGE */ + YYSYMBOL_ROWS = 167, /* ROWS */ + YYSYMBOL_GROUPS = 168, /* GROUPS */ + YYSYMBOL_UNBOUNDED = 169, /* UNBOUNDED */ + YYSYMBOL_FOLLOWING = 170, /* FOLLOWING */ + YYSYMBOL_PRECEDING = 171, /* PRECEDING */ + YYSYMBOL_CURRENT_ROW = 172, /* CURRENT_ROW */ + YYSYMBOL_UNIQUE = 173, /* UNIQUE */ + YYSYMBOL_PRIMARY = 174, /* PRIMARY */ + YYSYMBOL_FOREIGN = 175, /* FOREIGN */ + YYSYMBOL_KEY = 176, /* KEY */ + YYSYMBOL_REFERENCES = 177, /* REFERENCES */ + YYSYMBOL_BITSHIFTLEFT = 178, /* BITSHIFTLEFT */ + YYSYMBOL_BITSHIFTRIGHT = 179, /* BITSHIFTRIGHT */ + YYSYMBOL_LOGICALAND = 180, /* LOGICALAND */ + YYSYMBOL_LOGICALOR = 181, /* LOGICALOR */ + YYSYMBOL_182_ = 182, /* '=' */ + YYSYMBOL_EQUALS = 183, /* EQUALS */ + YYSYMBOL_NOTEQUALS = 184, /* NOTEQUALS */ + YYSYMBOL_185_ = 185, /* '<' */ + YYSYMBOL_186_ = 186, /* '>' */ + YYSYMBOL_LESS = 187, /* LESS */ + YYSYMBOL_GREATER = 188, /* GREATER */ + YYSYMBOL_LESSEQ = 189, /* LESSEQ */ + YYSYMBOL_GREATEREQ = 190, /* GREATEREQ */ + YYSYMBOL_NOTNULL = 191, /* NOTNULL */ + YYSYMBOL_192_ = 192, /* '|' */ + YYSYMBOL_193_ = 193, /* '^' */ + YYSYMBOL_194_ = 194, /* '&' */ + YYSYMBOL_195_ = 195, /* '+' */ + YYSYMBOL_196_ = 196, /* '-' */ + YYSYMBOL_197_ = 197, /* '*' */ + YYSYMBOL_198_ = 198, /* '/' */ + YYSYMBOL_199_ = 199, /* '%' */ + YYSYMBOL_UMINUS = 200, /* UMINUS */ + YYSYMBOL_201_ = 201, /* '[' */ + YYSYMBOL_202_ = 202, /* ']' */ + YYSYMBOL_203_ = 203, /* '(' */ + YYSYMBOL_204_ = 204, /* ')' */ + YYSYMBOL_205_ = 205, /* '.' */ + YYSYMBOL_206_ = 206, /* ';' */ + YYSYMBOL_207_ = 207, /* ',' */ + YYSYMBOL_208_ = 208, /* '?' */ + YYSYMBOL_YYACCEPT = 209, /* $accept */ + YYSYMBOL_input = 210, /* input */ + YYSYMBOL_statement_list = 211, /* statement_list */ + YYSYMBOL_statement = 212, /* statement */ + YYSYMBOL_preparable_statement = 213, /* preparable_statement */ + YYSYMBOL_opt_hints = 214, /* opt_hints */ + YYSYMBOL_hint_list = 215, /* hint_list */ + YYSYMBOL_hint = 216, /* hint */ + YYSYMBOL_transaction_statement = 217, /* transaction_statement */ + YYSYMBOL_opt_transaction_keyword = 218, /* opt_transaction_keyword */ + YYSYMBOL_prepare_statement = 219, /* prepare_statement */ + YYSYMBOL_prepare_target_query = 220, /* prepare_target_query */ + YYSYMBOL_execute_statement = 221, /* execute_statement */ + YYSYMBOL_import_statement = 222, /* import_statement */ + YYSYMBOL_file_type = 223, /* file_type */ + YYSYMBOL_file_path = 224, /* file_path */ + YYSYMBOL_opt_import_export_options = 225, /* opt_import_export_options */ + YYSYMBOL_import_export_options = 226, /* import_export_options */ + YYSYMBOL_csv_option = 227, /* csv_option */ + YYSYMBOL_export_statement = 228, /* export_statement */ + YYSYMBOL_show_statement = 229, /* show_statement */ + YYSYMBOL_create_statement = 230, /* create_statement */ + YYSYMBOL_opt_not_exists = 231, /* opt_not_exists */ + YYSYMBOL_table_elem_commalist = 232, /* table_elem_commalist */ + YYSYMBOL_table_elem = 233, /* table_elem */ + YYSYMBOL_column_def = 234, /* column_def */ + YYSYMBOL_column_type = 235, /* column_type */ + YYSYMBOL_opt_time_precision = 236, /* opt_time_precision */ + YYSYMBOL_opt_decimal_specification = 237, /* opt_decimal_specification */ + YYSYMBOL_opt_column_constraints = 238, /* opt_column_constraints */ + YYSYMBOL_column_constraints = 239, /* column_constraints */ + YYSYMBOL_column_constraint = 240, /* column_constraint */ + YYSYMBOL_table_constraint = 241, /* table_constraint */ + YYSYMBOL_references_spec = 242, /* references_spec */ + YYSYMBOL_drop_statement = 243, /* drop_statement */ + YYSYMBOL_opt_exists = 244, /* opt_exists */ + YYSYMBOL_alter_statement = 245, /* alter_statement */ + YYSYMBOL_alter_action = 246, /* alter_action */ + YYSYMBOL_drop_action = 247, /* drop_action */ + YYSYMBOL_delete_statement = 248, /* delete_statement */ + YYSYMBOL_truncate_statement = 249, /* truncate_statement */ + YYSYMBOL_insert_statement = 250, /* insert_statement */ + YYSYMBOL_opt_column_list = 251, /* opt_column_list */ + YYSYMBOL_update_statement = 252, /* update_statement */ + YYSYMBOL_update_clause_commalist = 253, /* update_clause_commalist */ + YYSYMBOL_update_clause = 254, /* update_clause */ + YYSYMBOL_select_statement = 255, /* select_statement */ + YYSYMBOL_select_within_set_operation = 256, /* select_within_set_operation */ + YYSYMBOL_select_within_set_operation_no_parentheses = 257, /* select_within_set_operation_no_parentheses */ + YYSYMBOL_select_with_paren = 258, /* select_with_paren */ + YYSYMBOL_select_no_paren = 259, /* select_no_paren */ + YYSYMBOL_set_operator = 260, /* set_operator */ + YYSYMBOL_set_type = 261, /* set_type */ + YYSYMBOL_opt_all = 262, /* opt_all */ + YYSYMBOL_select_clause = 263, /* select_clause */ + YYSYMBOL_opt_distinct = 264, /* opt_distinct */ + YYSYMBOL_select_list = 265, /* select_list */ + YYSYMBOL_opt_from_clause = 266, /* opt_from_clause */ + YYSYMBOL_from_clause = 267, /* from_clause */ + YYSYMBOL_opt_where = 268, /* opt_where */ + YYSYMBOL_opt_group = 269, /* opt_group */ + YYSYMBOL_opt_having = 270, /* opt_having */ + YYSYMBOL_opt_order = 271, /* opt_order */ + YYSYMBOL_order_list = 272, /* order_list */ + YYSYMBOL_order_desc = 273, /* order_desc */ + YYSYMBOL_opt_order_type = 274, /* opt_order_type */ + YYSYMBOL_opt_null_ordering = 275, /* opt_null_ordering */ + YYSYMBOL_opt_top = 276, /* opt_top */ + YYSYMBOL_opt_limit = 277, /* opt_limit */ + YYSYMBOL_expr_list = 278, /* expr_list */ + YYSYMBOL_opt_extended_literal_list = 279, /* opt_extended_literal_list */ + YYSYMBOL_extended_literal_list = 280, /* extended_literal_list */ + YYSYMBOL_casted_extended_literal = 281, /* casted_extended_literal */ + YYSYMBOL_extended_literal = 282, /* extended_literal */ + YYSYMBOL_expr_alias = 283, /* expr_alias */ + YYSYMBOL_expr = 284, /* expr */ + YYSYMBOL_operand = 285, /* operand */ + YYSYMBOL_scalar_expr = 286, /* scalar_expr */ + YYSYMBOL_unary_expr = 287, /* unary_expr */ + YYSYMBOL_binary_expr = 288, /* binary_expr */ + YYSYMBOL_logic_expr = 289, /* logic_expr */ + YYSYMBOL_in_expr = 290, /* in_expr */ + YYSYMBOL_case_expr = 291, /* case_expr */ + YYSYMBOL_case_list = 292, /* case_list */ + YYSYMBOL_exists_expr = 293, /* exists_expr */ + YYSYMBOL_comp_expr = 294, /* comp_expr */ + YYSYMBOL_function_expr = 295, /* function_expr */ + YYSYMBOL_opt_window = 296, /* opt_window */ + YYSYMBOL_opt_partition = 297, /* opt_partition */ + YYSYMBOL_opt_frame_clause = 298, /* opt_frame_clause */ + YYSYMBOL_frame_type = 299, /* frame_type */ + YYSYMBOL_frame_bound = 300, /* frame_bound */ + YYSYMBOL_extract_expr = 301, /* extract_expr */ + YYSYMBOL_cast_expr = 302, /* cast_expr */ + YYSYMBOL_datetime_field = 303, /* datetime_field */ + YYSYMBOL_datetime_field_plural = 304, /* datetime_field_plural */ + YYSYMBOL_duration_field = 305, /* duration_field */ + YYSYMBOL_array_expr = 306, /* array_expr */ + YYSYMBOL_array_index = 307, /* array_index */ + YYSYMBOL_between_expr = 308, /* between_expr */ + YYSYMBOL_column_name = 309, /* column_name */ + YYSYMBOL_literal = 310, /* literal */ + YYSYMBOL_string_literal = 311, /* string_literal */ + YYSYMBOL_bool_literal = 312, /* bool_literal */ + YYSYMBOL_num_literal = 313, /* num_literal */ + YYSYMBOL_int_literal = 314, /* int_literal */ + YYSYMBOL_null_literal = 315, /* null_literal */ + YYSYMBOL_date_literal = 316, /* date_literal */ + YYSYMBOL_interval_literal = 317, /* interval_literal */ + YYSYMBOL_param_expr = 318, /* param_expr */ + YYSYMBOL_table_ref = 319, /* table_ref */ + YYSYMBOL_table_ref_atomic = 320, /* table_ref_atomic */ + YYSYMBOL_nonjoin_table_ref_atomic = 321, /* nonjoin_table_ref_atomic */ + YYSYMBOL_table_ref_commalist = 322, /* table_ref_commalist */ + YYSYMBOL_table_ref_name = 323, /* table_ref_name */ + YYSYMBOL_table_ref_name_no_alias = 324, /* table_ref_name_no_alias */ + YYSYMBOL_table_name = 325, /* table_name */ + YYSYMBOL_opt_index_name = 326, /* opt_index_name */ + YYSYMBOL_table_alias = 327, /* table_alias */ + YYSYMBOL_opt_table_alias = 328, /* opt_table_alias */ + YYSYMBOL_alias = 329, /* alias */ + YYSYMBOL_opt_alias = 330, /* opt_alias */ + YYSYMBOL_opt_locking_clause = 331, /* opt_locking_clause */ + YYSYMBOL_opt_locking_clause_list = 332, /* opt_locking_clause_list */ + YYSYMBOL_locking_clause = 333, /* locking_clause */ + YYSYMBOL_row_lock_mode = 334, /* row_lock_mode */ + YYSYMBOL_opt_row_lock_policy = 335, /* opt_row_lock_policy */ + YYSYMBOL_opt_with_clause = 336, /* opt_with_clause */ + YYSYMBOL_with_clause = 337, /* with_clause */ + YYSYMBOL_with_description_list = 338, /* with_description_list */ + YYSYMBOL_with_description = 339, /* with_description */ + YYSYMBOL_join_clause = 340, /* join_clause */ + YYSYMBOL_opt_join_type = 341, /* opt_join_type */ + YYSYMBOL_natural_join_type = 342, /* natural_join_type */ + YYSYMBOL_join_condition = 343, /* join_condition */ + YYSYMBOL_opt_semicolon = 344, /* opt_semicolon */ + YYSYMBOL_ident_commalist = 345 /* ident_commalist */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int16 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if 1 + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* 1 */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined HSQL_LTYPE_IS_TRIVIAL && HSQL_LTYPE_IS_TRIVIAL \ + && defined HSQL_STYPE_IS_TRIVIAL && HSQL_STYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; + YYLTYPE yyls_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE) \ + + YYSIZEOF (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 69 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1188 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 209 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 137 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 378 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 694 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 444 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 199, 194, 2, + 203, 204, 197, 195, 207, 196, 205, 198, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 206, + 185, 182, 186, 208, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 201, 2, 202, 193, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 192, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 183, 184, 187, + 188, 189, 190, 191, 200 +}; + +#if HSQL_DEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = +{ + 0, 349, 349, 368, 374, 381, 385, 389, 390, 391, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 408, 409, 411, 415, 420, 424, 434, 435, 436, 438, + 438, 444, 450, 452, 456, 468, 474, 491, 506, 508, + 509, 510, 512, 526, 530, 540, 544, 568, 576, 589, + 596, 611, 631, 632, 637, 648, 661, 673, 680, 687, + 696, 697, 699, 703, 708, 709, 711, 719, 720, 721, + 722, 723, 724, 725, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 741, 742, 744, 745, 746, + 748, 749, 751, 755, 759, 764, 772, 773, 774, 775, + 777, 778, 779, 781, 789, 795, 801, 807, 813, 814, + 821, 827, 829, 839, 846, 857, 864, 872, 873, 880, + 887, 891, 896, 906, 910, 914, 926, 926, 928, 929, + 938, 939, 941, 955, 967, 972, 976, 980, 985, 986, + 988, 1003, 1004, 1006, 1008, 1009, 1011, 1013, 1014, 1016, + 1020, 1022, 1023, 1025, 1026, 1028, 1032, 1037, 1039, 1040, + 1041, 1043, 1044, 1066, 1067, 1069, 1070, 1071, 1072, 1073, + 1074, 1079, 1083, 1089, 1090, 1092, 1096, 1101, 1101, 1105, + 1113, 1114, 1116, 1125, 1125, 1125, 1125, 1125, 1127, 1128, + 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1129, 1129, 1133, + 1133, 1135, 1136, 1137, 1138, 1139, 1141, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1155, 1156, 1158, 1159, 1160, 1161, 1163, 1164, 1165, + 1166, 1170, 1171, 1172, 1173, 1175, 1176, 1178, 1179, 1181, + 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1192, 1193, 1194, + 1195, 1199, 1200, 1202, 1203, 1208, 1209, 1210, 1214, 1215, + 1216, 1218, 1219, 1220, 1221, 1222, 1224, 1226, 1228, 1229, + 1230, 1231, 1232, 1233, 1235, 1236, 1237, 1238, 1239, 1240, + 1242, 1242, 1244, 1246, 1248, 1249, 1251, 1252, 1253, 1254, + 1255, 1256, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1260, + 1262, 1263, 1265, 1266, 1268, 1269, 1271, 1273, 1284, 1285, + 1296, 1328, 1337, 1337, 1344, 1344, 1346, 1346, 1353, 1357, + 1362, 1370, 1376, 1380, 1385, 1386, 1388, 1388, 1390, 1390, + 1392, 1393, 1395, 1395, 1401, 1402, 1404, 1408, 1413, 1419, + 1426, 1427, 1428, 1429, 1431, 1432, 1433, 1439, 1439, 1441, + 1443, 1447, 1452, 1462, 1470, 1478, 1485, 1493, 1502, 1503, + 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1512, 1513, 1514, + 1515, 1516, 1517, 1518, 1520, 1526, 1526, 1529, 1533 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if 1 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "IDENTIFIER", "STRING", + "BIGINTVAL", "FLOATVAL", "INTVAL", "NULLSAFEEQUALS", "DEALLOCATE", + "PARAMETERS", "INTERSECT", "TEMPORARY", "TIMESTAMP", "DISTINCT", + "NVARCHAR", "RESTRICT", "TRUNCATE", "ANALYZE", "BETWEEN", "CASCADE", + "COLUMNS", "CONTROL", "DEFAULT", "EXECUTE", "EXPLAIN", "ENCODING", + "INTEGER", "NATURAL", "PREPARE", "SCHEMAS", "CHARACTER_VARYING", "REAL", + "DECIMAL", "SMALLINT", "BIGINT", "SPATIAL", "VARCHAR", "VIRTUAL", + "DESCRIBE", "BEFORE", "COLUMN", "CREATE", "DELETE", "DIRECT", "DOUBLE", + "ESCAPE", "EXCEPT", "EXISTS", "EXTRACT", "CAST", "FORMAT", "GLOBAL", + "HAVING", "IMPORT", "INSERT", "ISNULL", "OFFSET", "RENAME", "SCHEMA", + "SELECT", "SORTED", "TABLES", "UNLOAD", "UPDATE", "VALUES", "AFTER", + "ALTER", "CROSS", "DELTA", "FLOAT", "GROUP", "INDEX", "INNER", "LIMIT", + "LOCAL", "MERGE", "MINUS", "ORDER", "OVER", "OUTER", "RIGHT", "TABLE", + "UNION", "USING", "WHERE", "CALL", "CASE", "CHAR", "COPY", "DATE", + "DATETIME", "DESC", "DIV", "DROP", "ELSE", "FILE", "FROM", "FULL", + "HASH", "HINT", "INTO", "JOIN", "LEFT", "LIKE", "LOAD", "LONG", "NULL", + "PARTITION", "PLAN", "SHOW", "TEXT", "THEN", "TIME", "VIEW", "WHEN", + "WITH", "ADD", "ALL", "AND", "ASC", "END", "FOR", "INT", "NOT", "OFF", + "SET", "TOP", "AS", "BY", "IF", "IN", "IS", "OF", "ON", "OR", "TO", "NO", + "ARRAY", "CONCAT", "ILIKE", "MOD", "SECOND", "MINUTE", "HOUR", "DAY", + "MONTH", "YEAR", "SECONDS", "MINUTES", "HOURS", "DAYS", "MONTHS", + "YEARS", "INTERVAL", "TRUE", "FALSE", "BOOLEAN", "TRANSACTION", "BEGIN", + "COMMIT", "ROLLBACK", "NOWAIT", "SKIP", "LOCKED", "SHARE", "RANGE", + "ROWS", "GROUPS", "UNBOUNDED", "FOLLOWING", "PRECEDING", "CURRENT_ROW", + "UNIQUE", "PRIMARY", "FOREIGN", "KEY", "REFERENCES", "BITSHIFTLEFT", + "BITSHIFTRIGHT", "LOGICALAND", "LOGICALOR", "'='", "EQUALS", "NOTEQUALS", + "'<'", "'>'", "LESS", "GREATER", "LESSEQ", "GREATEREQ", "NOTNULL", "'|'", + "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "UMINUS", "'['", "']'", + "'('", "')'", "'.'", "';'", "','", "'?'", "$accept", "input", + "statement_list", "statement", "preparable_statement", "opt_hints", + "hint_list", "hint", "transaction_statement", "opt_transaction_keyword", + "prepare_statement", "prepare_target_query", "execute_statement", + "import_statement", "file_type", "file_path", + "opt_import_export_options", "import_export_options", "csv_option", + "export_statement", "show_statement", "create_statement", + "opt_not_exists", "table_elem_commalist", "table_elem", "column_def", + "column_type", "opt_time_precision", "opt_decimal_specification", + "opt_column_constraints", "column_constraints", "column_constraint", + "table_constraint", "references_spec", "drop_statement", "opt_exists", + "alter_statement", "alter_action", "drop_action", "delete_statement", + "truncate_statement", "insert_statement", "opt_column_list", + "update_statement", "update_clause_commalist", "update_clause", + "select_statement", "select_within_set_operation", + "select_within_set_operation_no_parentheses", "select_with_paren", + "select_no_paren", "set_operator", "set_type", "opt_all", + "select_clause", "opt_distinct", "select_list", "opt_from_clause", + "from_clause", "opt_where", "opt_group", "opt_having", "opt_order", + "order_list", "order_desc", "opt_order_type", "opt_null_ordering", + "opt_top", "opt_limit", "expr_list", "opt_extended_literal_list", + "extended_literal_list", "casted_extended_literal", "extended_literal", + "expr_alias", "expr", "operand", "scalar_expr", "unary_expr", + "binary_expr", "logic_expr", "in_expr", "case_expr", "case_list", + "exists_expr", "comp_expr", "function_expr", "opt_window", + "opt_partition", "opt_frame_clause", "frame_type", "frame_bound", + "extract_expr", "cast_expr", "datetime_field", "datetime_field_plural", + "duration_field", "array_expr", "array_index", "between_expr", + "column_name", "literal", "string_literal", "bool_literal", + "num_literal", "int_literal", "null_literal", "date_literal", + "interval_literal", "param_expr", "table_ref", "table_ref_atomic", + "nonjoin_table_ref_atomic", "table_ref_commalist", "table_ref_name", + "table_ref_name_no_alias", "table_name", "opt_index_name", "table_alias", + "opt_table_alias", "alias", "opt_alias", "opt_locking_clause", + "opt_locking_clause_list", "locking_clause", "row_lock_mode", + "opt_row_lock_policy", "opt_with_clause", "with_clause", + "with_description_list", "with_description", "join_clause", + "opt_join_type", "natural_join_type", "join_condition", "opt_semicolon", + "ident_commalist", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_int16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 61, 437, 438, 60, 62, 439, 440, 441, + 442, 443, 124, 94, 38, 43, 45, 42, 47, 37, + 444, 91, 93, 40, 41, 46, 59, 44, 63 +}; +#endif + +#define YYPACT_NINF (-525) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-376) + +#define yytable_value_is_error(Yyn) \ + ((Yyn) == YYTABLE_NINF) + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int16 yypact[] = +{ + 1027, 30, 59, 74, 80, 59, -9, 73, 100, 81, + 59, -13, 8, 181, 32, 266, 92, 92, 92, 283, + 103, -525, 226, -525, 226, -525, -525, -525, -525, -525, + -525, -525, -525, -525, -525, -525, -525, -32, -525, 335, + 141, -525, 155, 265, -525, 262, 262, 262, 59, 401, + 59, 308, -525, 279, -32, 311, 1, 279, 279, 279, + 59, -525, 317, 232, -525, -525, -525, -525, -525, -525, + 1010, -525, 349, -525, -525, 340, 25, -525, 229, -525, + 455, 148, 458, 339, 465, 59, 59, 389, -525, 383, + 277, 484, 440, 59, 293, 294, 495, 495, 495, 503, + 59, 59, -525, 314, 266, -525, 319, 97, 521, -525, + -525, -525, -32, 421, 418, -32, 4, -525, -525, -525, + -525, 820, 348, 554, -525, 556, -525, -525, 40, -525, + 361, 360, -525, -525, -525, -525, -525, -525, -525, -525, + -525, -525, -525, -525, -525, 522, -525, 438, -46, 277, + 394, -525, 495, 568, 118, 392, -42, -525, -525, 482, + -525, -525, -525, -59, -59, -59, -525, -525, -525, -525, + -525, 574, -525, -525, -525, 394, 508, -525, -525, 25, + -525, -525, 394, 508, 394, 199, 466, -525, -525, -525, + -525, -525, -525, -525, -525, -525, -525, -525, -525, -525, + -525, -525, 180, -525, 437, -525, -525, -525, 148, -525, + 59, 584, 473, 26, 476, 85, 390, 398, 404, -525, + 209, 488, 407, 549, -525, 365, 284, 577, -525, -525, + -525, -525, -525, -525, -525, -525, -525, -525, -525, -525, + -525, -525, -525, -525, 510, -525, -120, 410, -525, 394, + 484, -525, 575, -525, -525, 412, 38, -525, 389, -525, + 414, 47, -525, 526, 422, -525, 53, 4, -32, 423, + -525, 56, 4, 284, 571, 186, 31, -525, 466, -525, + 497, -525, -525, 428, 538, -525, 587, 432, 462, 469, + 58, -525, -525, -525, 473, 13, 21, 580, 437, 394, + 394, 331, 236, 434, 549, 746, 394, 464, 442, 206, + 394, 394, 394, 394, 549, 549, -525, 549, 549, 35, + 444, -36, 549, 549, 549, 549, 549, 549, 549, 549, + 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, + 549, 549, 97, 59, -525, 638, 148, 284, -525, 279, + 38, 649, 651, 401, 655, 107, -525, -525, 148, -525, + 574, 16, 389, -525, 394, -525, 657, -525, -525, -525, + -525, 394, -525, -525, 661, 466, 394, 394, -525, 490, + -525, 504, 119, -525, 587, 568, 495, -525, -525, 468, + -525, 471, -525, -525, 479, -525, -525, 483, -525, -525, + -525, -525, 485, -525, -525, 254, 568, 486, 487, -525, + 26, -525, 589, 394, 95, -525, 472, 595, 305, -38, + 381, 394, 394, -525, 580, 590, 66, -525, -525, -525, + -29, -525, -29, 819, 602, -28, 819, 549, 549, 496, + 365, -525, 600, 511, 819, -28, 453, 453, 819, 819, + 819, 966, 966, 966, 966, 330, 721, 889, 464, 464, + -28, -28, -28, 509, -525, -525, 125, 710, 173, -525, + -525, -525, -525, -525, 241, 187, -525, 473, -525, 247, + -525, 507, -525, 36, -525, 644, -525, -525, -525, 716, + -525, -525, 284, 284, 658, -525, 568, -525, 559, -525, + 520, 204, -525, 718, 720, -525, 722, 723, 724, -525, + -525, 621, -525, 560, 59, -525, 254, -525, -525, 222, + 568, 568, -525, 529, -525, 234, 24, 732, -525, 394, + 587, 394, 394, -525, 159, 240, 533, -525, 549, 712, + 819, 365, 534, 249, -525, -525, -525, -525, -525, 735, + 401, -525, -525, 536, 461, 645, -525, -525, 668, 669, + 670, 656, 16, 748, -525, -525, -525, 624, 711, -525, + -525, -95, -525, -525, -525, 561, 253, 573, 578, 579, + -525, -525, 277, -525, -525, -525, 303, 309, 671, 589, + 589, 394, -525, 255, 585, 284, 297, -525, 394, -525, + 746, 549, 586, 326, -525, -525, -525, -525, 36, -525, + 713, 726, 16, 727, 702, 16, -525, -525, -525, 16, + 402, 605, 394, 394, -525, -525, -525, -525, 802, -525, + -525, -525, -525, -525, 633, 682, 508, -525, -525, 336, + -525, -525, -525, 284, 746, -525, -525, -525, -525, -525, + -525, -525, 16, -525, 599, 568, 422, 284, 608, -525, + 394, 217, 589, -525, 610, 394, 337, -525, 422, -525, + -525, -525, 611, 23, -525, 568, 284, -525, -525, -525, + 19, 51, 54, -525, -525, 362, -525, -525, 698, -525, + -525, -525, 51, -525 +}; + + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int16 yydefact[] = +{ + 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 30, 30, 30, 0, + 376, 3, 21, 19, 21, 18, 8, 9, 7, 11, + 16, 17, 13, 14, 12, 15, 10, 0, 347, 0, + 322, 114, 33, 0, 54, 61, 61, 61, 0, 0, + 0, 0, 321, 109, 0, 0, 0, 109, 109, 109, + 0, 52, 0, 349, 350, 29, 26, 28, 27, 1, + 348, 2, 0, 6, 5, 164, 123, 124, 154, 106, + 0, 174, 0, 0, 325, 0, 0, 148, 37, 0, + 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 53, 0, 0, 4, 0, 0, 142, 136, + 137, 135, 0, 139, 0, 0, 170, 323, 299, 305, + 302, 304, 0, 0, 306, 0, 300, 301, 0, 311, + 0, 173, 175, 177, 179, 292, 293, 294, 303, 295, + 296, 297, 298, 32, 31, 0, 324, 0, 0, 118, + 0, 113, 0, 0, 0, 0, 148, 120, 108, 0, + 131, 130, 38, 41, 41, 41, 107, 104, 105, 352, + 351, 0, 304, 163, 141, 0, 154, 127, 126, 128, + 138, 134, 0, 154, 0, 0, 335, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 308, 0, 307, 310, 180, 181, 34, 0, 60, + 0, 0, 348, 0, 0, 286, 0, 0, 0, 287, + 0, 0, 0, 0, 290, 0, 147, 183, 190, 191, + 192, 185, 187, 193, 186, 206, 194, 195, 196, 197, + 189, 184, 199, 200, 0, 377, 0, 0, 116, 0, + 0, 119, 0, 110, 111, 0, 0, 51, 148, 50, + 24, 0, 22, 145, 143, 171, 333, 170, 0, 153, + 155, 160, 170, 166, 168, 165, 0, 132, 334, 336, + 0, 309, 176, 0, 0, 57, 0, 0, 0, 0, + 0, 62, 64, 65, 348, 142, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 202, 0, 201, 0, 0, + 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 117, 0, 0, 122, 121, 109, + 0, 0, 0, 0, 0, 0, 47, 36, 0, 20, + 0, 0, 148, 144, 0, 331, 0, 332, 182, 125, + 129, 0, 159, 158, 161, 335, 0, 0, 340, 0, + 342, 0, 346, 337, 0, 0, 0, 83, 77, 0, + 79, 89, 80, 67, 0, 74, 75, 0, 71, 72, + 78, 81, 86, 76, 68, 91, 0, 0, 0, 56, + 0, 59, 252, 0, 288, 291, 0, 0, 0, 0, + 0, 0, 0, 233, 0, 0, 0, 198, 188, 223, + 225, 224, 226, 241, 0, 213, 219, 0, 0, 0, + 0, 204, 0, 222, 221, 212, 217, 218, 239, 240, + 242, 243, 244, 245, 246, 216, 214, 215, 208, 207, + 210, 209, 211, 0, 35, 378, 0, 0, 0, 48, + 45, 43, 49, 40, 0, 0, 23, 348, 146, 312, + 314, 0, 316, 329, 315, 150, 172, 330, 156, 0, + 157, 133, 169, 167, 0, 343, 0, 345, 0, 338, + 0, 0, 55, 0, 0, 73, 0, 0, 0, 82, + 98, 0, 97, 0, 0, 66, 90, 92, 94, 0, + 0, 0, 63, 0, 247, 0, 142, 0, 237, 0, + 0, 0, 0, 231, 0, 0, 0, 282, 0, 0, + 220, 0, 0, 0, 205, 283, 115, 112, 39, 0, + 0, 46, 25, 0, 0, 0, 358, 364, 362, 365, + 360, 0, 0, 0, 328, 320, 326, 0, 152, 162, + 341, 346, 344, 178, 58, 0, 0, 0, 0, 0, + 99, 96, 118, 93, 95, 101, 0, 0, 254, 252, + 252, 0, 289, 0, 0, 235, 0, 234, 0, 238, + 284, 0, 0, 0, 229, 227, 44, 42, 329, 367, + 371, 373, 0, 369, 0, 0, 361, 363, 359, 0, + 313, 330, 0, 0, 140, 339, 70, 88, 0, 84, + 69, 85, 103, 100, 0, 0, 154, 248, 249, 0, + 266, 267, 232, 236, 285, 230, 228, 317, 370, 372, + 353, 368, 0, 355, 366, 0, 149, 151, 0, 102, + 0, 257, 252, 354, 0, 0, 0, 87, 253, 258, + 259, 260, 0, 0, 250, 0, 374, 356, 327, 251, + 0, 0, 0, 265, 255, 0, 264, 262, 0, 263, + 261, 357, 0, 256 +}; + + /* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -525, -525, -525, 749, -525, 794, -525, 460, -525, 191, + -525, -525, -525, -525, -328, -76, 67, 474, 347, -525, + -525, -525, 272, -525, 413, -525, -353, -525, -525, -525, + -525, 306, -525, -467, -525, -41, -525, -525, -525, -525, + -525, -525, -145, -525, -525, 576, -203, -89, -525, 223, + -51, -23, -525, -525, -75, -281, -525, -525, -525, -123, + -525, -525, -175, -525, 454, -525, -525, -525, 12, -300, + -525, -266, 620, 627, 470, -150, -208, -525, -525, -525, + -525, -525, -525, 531, -525, -525, -525, -524, -525, -525, + -525, -512, -525, -525, -152, -525, -525, -525, -525, -525, + -525, -61, -525, -525, 705, -100, -525, -525, 707, -525, + -525, -483, -351, -525, -525, -525, 0, -525, -525, 230, + 564, -525, 467, -525, 562, -525, 270, -525, -525, -525, + 733, -525, -525, -525, -525, -525, -362 +}; + + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 19, 20, 21, 22, 73, 261, 262, 23, 66, + 24, 144, 25, 26, 89, 163, 257, 355, 356, 27, + 28, 29, 84, 290, 291, 292, 405, 509, 505, 515, + 516, 517, 293, 518, 30, 93, 31, 253, 254, 32, + 33, 34, 154, 35, 156, 157, 36, 176, 177, 178, + 77, 112, 113, 181, 78, 175, 263, 362, 363, 151, + 568, 624, 116, 269, 270, 374, 490, 108, 186, 264, + 130, 131, 132, 133, 265, 266, 227, 228, 229, 230, + 231, 232, 233, 302, 234, 235, 236, 524, 636, 672, + 673, 684, 237, 238, 199, 200, 201, 239, 240, 241, + 242, 243, 135, 136, 137, 138, 139, 140, 141, 142, + 478, 479, 480, 481, 482, 51, 483, 147, 564, 565, + 566, 368, 277, 278, 279, 382, 499, 37, 38, 63, + 64, 484, 561, 614, 677, 71, 246 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 226, 267, 41, 95, 214, 44, 426, 173, 272, 285, + 52, 40, 56, 305, 413, 307, 99, 100, 101, 40, + 134, 164, 165, 501, 414, 471, 183, 174, 75, 286, + 680, 500, 271, 251, 273, 275, 109, 179, 174, 365, + 179, 351, 681, 150, 519, 119, 120, 121, 87, 584, + 90, 211, 281, 60, 437, 115, 365, 255, 680, 39, + 102, 184, 40, 45, 352, 637, 638, 497, 498, 53, + 301, 441, 110, 46, 531, 309, 244, 42, 185, 620, + 466, 310, 212, 43, 344, 148, 149, 345, 442, 353, + 310, 411, 475, 159, 61, 378, 305, 311, 97, 347, + 167, 168, 119, 248, 172, 47, 433, 434, 111, 435, + 436, 322, 345, 525, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 571, 357, 654, 98, 674, 438, + 543, 134, 312, 313, 256, 354, 417, 134, 372, 418, + 419, 312, 118, 119, 120, 121, 268, 213, 586, 587, + 429, 430, 431, 432, 563, 250, 439, 659, 379, 688, + 48, 54, 310, 342, 308, 310, 373, 594, 75, 370, + 693, 366, 50, 247, 118, 119, 120, 121, 311, 686, + 687, 311, 682, 179, 125, 683, 380, 49, 122, 287, + 288, 289, 215, 118, 119, 120, 121, 381, 67, 68, + 283, 54, 215, 118, 119, 120, 121, 412, 415, 477, + 682, 271, 607, 683, 689, 690, 492, 493, 590, 539, + 540, 258, 259, 312, 313, 55, 312, 313, 123, 485, + 109, 603, 463, 377, 351, 591, 416, 216, 217, 218, + 65, 359, 496, 57, 360, 124, 219, 216, 217, 218, + 76, 650, 409, 58, 653, 410, 219, 549, 537, 62, + 123, 534, 535, 364, 553, 554, 110, 94, 310, 369, + 597, 497, 498, 69, 375, 134, 220, 124, 295, 123, + 296, 639, 550, 666, 311, 59, 220, 134, 526, 123, + 527, 663, 125, 126, 127, 310, 124, 114, 467, 70, + 502, 473, 111, 685, 474, 555, 124, 274, 85, 86, + 556, 311, 656, 221, 300, 310, 169, 557, 558, 546, + 600, 421, 208, 221, 125, 126, 127, 222, 79, 312, + 313, 311, 72, 464, 128, 559, 80, 222, 354, -366, + 560, 422, 598, 125, 126, 127, 129, 423, 81, 310, + 668, 510, 82, 125, 126, 127, 312, 313, 215, 118, + 119, 120, 121, 536, 310, 311, 128, 548, 511, 593, + 474, 595, 596, 669, 670, 671, 312, 313, 129, 542, + 311, 552, 83, 644, 208, 223, 224, 215, 118, 119, + 120, 121, 225, 310, 88, 223, 224, 129, 574, 92, + 428, 345, 225, 216, 217, 218, 310, 129, 642, 311, + 312, 313, 219, 317, 310, 75, 585, 512, 513, 345, + 554, 514, 311, 530, 91, 312, 313, 632, 589, 104, + 311, 364, 216, 217, 218, 103, 300, 96, 643, 106, + 310, 219, 220, 605, -318, 123, 364, 627, 117, 640, + 628, 661, 143, 145, 312, 313, 311, 107, 146, 322, + 555, 324, 124, 657, 150, 556, 532, 312, 313, 152, + 153, 220, 557, 558, 123, 312, 313, 155, 158, 221, + 602, 215, 118, 119, 120, 121, 422, 160, 161, 162, + 559, 124, 533, 222, -366, 560, 166, 633, 325, 326, + 345, 312, 313, 634, 582, 676, 345, 54, 221, 125, + 126, 127, 171, 335, 336, 337, 338, 339, 340, 341, + 646, 342, 222, 364, 609, 174, 303, 217, 218, 180, + 662, 678, 610, 364, 345, 219, 317, 182, 125, 126, + 127, 202, 215, 118, 119, 120, 121, 317, 203, 611, + 204, 223, 224, 612, 613, 207, 691, 208, 225, 345, + 209, 245, 210, 129, 249, 220, 252, 260, 123, 187, + 188, 189, 190, 191, 192, 314, 114, 284, 276, 15, + 223, 224, 322, 297, 324, 124, 315, 225, 217, 218, + 387, 298, 129, 322, 294, 324, 219, 299, 306, -319, + 314, 343, 304, 346, 388, 350, 349, 358, 389, 390, + 391, 392, 393, 361, 394, 384, 222, 554, 376, 364, + 371, 385, 395, 316, 386, 406, 220, 424, 407, 123, + 75, 465, 125, 126, 127, 408, 427, 440, 337, 338, + 339, 340, 341, 469, 342, 470, 124, 396, 316, 472, + 487, 339, 340, 341, 489, 342, 494, 555, 523, 495, + 317, 503, 556, 304, 504, 397, 528, 398, 399, 557, + 558, 318, 506, 664, 223, 224, 507, 222, 508, 520, + 521, 225, 529, 400, 438, 317, 129, 559, 401, 541, + 402, 319, 560, 125, 126, 127, 318, 544, 320, 321, + 403, 545, 342, 547, 562, 567, 322, 323, 324, 569, + 314, 538, 570, 572, 573, 575, 425, 576, 580, 577, + 578, 579, 588, 665, 321, 592, 581, 599, 604, 606, + 608, 322, 323, 324, 404, 223, 224, 615, 616, 617, + 618, 621, 225, 622, 314, 325, 326, 129, 619, 327, + 328, 329, 330, 331, 623, 626, 332, 333, 316, 334, + 335, 336, 337, 338, 339, 340, 341, 629, 342, 635, + 325, 326, 630, 631, 327, 328, 329, 330, 331, 641, + 645, 332, 333, 648, 334, 335, 336, 337, 338, 339, + 340, 341, 316, 342, 652, 317, 649, 651, 655, 658, + 514, 660, 667, 675, 317, 679, 318, 692, 74, 105, + 476, 551, 583, 522, 468, 488, 348, -376, 282, 280, + 367, 601, 420, 205, 486, 206, 425, 170, 647, 317, + 383, 625, 491, 0, 321, 0, 0, 0, 0, 0, + 318, 322, 323, 324, 0, 0, 0, 0, 0, 0, + 322, 0, 324, 0, 0, 0, 0, 0, 0, 0, + 425, 0, 0, 0, 0, 316, 0, 0, 321, 0, + 0, 0, 0, 0, 0, 322, 323, 324, 0, 0, + 325, 326, 0, 0, 327, 328, 329, 330, 331, 325, + 326, 332, 333, 0, 334, 335, 336, 337, 338, 339, + 340, 341, 317, 342, 0, 336, 337, 338, 339, 340, + 341, 0, 342, -376, 325, 326, 0, 0, 327, 328, + 329, 330, 331, 0, 0, 332, 333, 0, 334, 335, + 336, 337, 338, 339, 340, 341, 0, 342, 0, 0, + 0, 321, 0, 0, 0, 0, 0, 0, 322, -376, + 324, 0, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 0, 0, 0, 0, 0, 0, + 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 325, 326, 0, + 0, -376, -376, -376, 330, 331, 0, 0, 332, 333, + -375, 334, 335, 336, 337, 338, 339, 340, 341, 1, + 342, 0, 316, 0, 0, 0, 0, 2, 322, 0, + 324, 0, 0, 0, 3, 0, 1, 0, 0, 4, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, + 0, 3, 6, 7, 0, 0, 4, 0, 0, 317, + 0, 0, 0, 0, 8, 9, 5, 325, 326, 6, + 7, 0, 0, 0, 10, 0, 0, 11, 0, 0, + 0, 8, 9, 0, 337, 338, 339, 340, 341, 0, + 342, 10, 0, 0, 11, 0, 0, 0, 321, 12, + 0, 0, 0, 0, 13, 322, 0, 324, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, + 14, 13, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 15, 325, 326, 0, 0, 0, 0, + 0, -376, -376, 0, 0, -376, -376, 0, 334, 335, + 336, 337, 338, 339, 340, 341, 0, 342, 0, 16, + 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 17, 18 +}; + +static const yytype_int16 yycheck[] = +{ + 150, 176, 2, 54, 149, 5, 306, 107, 183, 212, + 10, 3, 12, 221, 295, 223, 57, 58, 59, 3, + 81, 97, 98, 385, 3, 353, 115, 14, 60, 3, + 7, 384, 182, 156, 184, 185, 11, 112, 14, 3, + 115, 3, 19, 85, 406, 5, 6, 7, 48, 516, + 50, 97, 204, 21, 19, 78, 3, 116, 7, 29, + 60, 57, 3, 72, 26, 589, 590, 162, 163, 82, + 220, 107, 47, 82, 112, 225, 152, 3, 74, 562, + 346, 119, 128, 3, 204, 85, 86, 207, 124, 51, + 119, 294, 358, 93, 62, 64, 304, 135, 97, 249, + 100, 101, 5, 154, 7, 114, 314, 315, 83, 317, + 318, 139, 207, 413, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 496, 258, 619, 136, 662, 104, + 440, 202, 180, 181, 203, 107, 298, 208, 92, 299, + 300, 180, 4, 5, 6, 7, 179, 203, 520, 521, + 310, 311, 312, 313, 128, 207, 131, 634, 137, 681, + 97, 203, 119, 201, 225, 119, 120, 530, 60, 268, + 692, 128, 101, 65, 4, 5, 6, 7, 135, 170, + 171, 135, 169, 268, 154, 172, 165, 97, 50, 173, + 174, 175, 3, 4, 5, 6, 7, 176, 17, 18, + 210, 203, 3, 4, 5, 6, 7, 204, 197, 203, + 169, 371, 550, 172, 170, 171, 376, 377, 204, 437, + 438, 164, 165, 180, 181, 12, 180, 181, 90, 362, + 11, 541, 342, 57, 3, 526, 297, 48, 49, 50, + 158, 204, 133, 72, 207, 107, 57, 48, 49, 50, + 37, 612, 204, 82, 615, 207, 57, 26, 202, 3, + 90, 421, 422, 207, 477, 28, 47, 54, 119, 267, + 121, 162, 163, 0, 272, 346, 87, 107, 203, 90, + 205, 591, 51, 655, 135, 114, 87, 358, 203, 90, + 205, 652, 154, 155, 156, 119, 107, 78, 349, 206, + 386, 204, 83, 675, 207, 68, 107, 118, 46, 47, + 73, 135, 622, 124, 115, 119, 103, 80, 81, 204, + 538, 95, 207, 124, 154, 155, 156, 138, 3, 180, + 181, 135, 116, 343, 196, 98, 205, 138, 107, 102, + 103, 115, 112, 154, 155, 156, 208, 121, 203, 119, + 660, 107, 97, 154, 155, 156, 180, 181, 3, 4, + 5, 6, 7, 424, 119, 135, 196, 204, 124, 529, + 207, 531, 532, 166, 167, 168, 180, 181, 208, 440, + 135, 204, 130, 601, 207, 196, 197, 3, 4, 5, + 6, 7, 203, 119, 3, 196, 197, 208, 204, 130, + 204, 207, 203, 48, 49, 50, 119, 208, 121, 135, + 180, 181, 57, 93, 119, 60, 204, 173, 174, 207, + 28, 177, 135, 128, 126, 180, 181, 582, 204, 207, + 135, 207, 48, 49, 50, 128, 115, 136, 598, 100, + 119, 57, 87, 204, 207, 90, 207, 204, 3, 204, + 207, 636, 4, 124, 180, 181, 135, 127, 3, 139, + 68, 141, 107, 623, 85, 73, 95, 180, 181, 96, + 203, 87, 80, 81, 90, 180, 181, 3, 48, 124, + 541, 3, 4, 5, 6, 7, 115, 204, 204, 4, + 98, 107, 121, 138, 102, 103, 3, 204, 178, 179, + 207, 180, 181, 204, 514, 665, 207, 203, 124, 154, + 155, 156, 203, 193, 194, 195, 196, 197, 198, 199, + 204, 201, 138, 207, 73, 14, 48, 49, 50, 118, + 204, 204, 81, 207, 207, 57, 93, 129, 154, 155, + 156, 203, 3, 4, 5, 6, 7, 93, 4, 98, + 4, 196, 197, 102, 103, 204, 204, 207, 203, 207, + 48, 3, 134, 208, 182, 87, 94, 3, 90, 142, + 143, 144, 145, 146, 147, 8, 78, 3, 122, 116, + 196, 197, 139, 203, 141, 107, 19, 203, 49, 50, + 13, 203, 208, 139, 128, 141, 57, 203, 201, 207, + 8, 101, 124, 203, 27, 203, 41, 203, 31, 32, + 33, 34, 35, 97, 37, 128, 138, 28, 57, 207, + 207, 203, 45, 56, 96, 203, 87, 203, 176, 90, + 60, 3, 154, 155, 156, 176, 204, 203, 195, 196, + 197, 198, 199, 4, 201, 4, 107, 70, 56, 4, + 3, 197, 198, 199, 3, 201, 176, 68, 79, 165, + 93, 203, 73, 124, 203, 88, 204, 90, 91, 80, + 81, 104, 203, 84, 196, 197, 203, 138, 203, 203, + 203, 203, 97, 106, 104, 93, 208, 98, 111, 203, + 113, 124, 103, 154, 155, 156, 104, 107, 131, 132, + 123, 202, 201, 3, 207, 71, 139, 140, 141, 3, + 8, 119, 64, 164, 204, 7, 124, 7, 107, 7, + 7, 7, 203, 134, 132, 3, 176, 204, 204, 4, + 204, 139, 140, 141, 157, 196, 197, 102, 80, 80, + 80, 3, 203, 129, 8, 178, 179, 208, 102, 182, + 183, 184, 185, 186, 53, 204, 189, 190, 56, 192, + 193, 194, 195, 196, 197, 198, 199, 204, 201, 108, + 178, 179, 204, 204, 182, 183, 184, 185, 186, 204, + 204, 189, 190, 80, 192, 193, 194, 195, 196, 197, + 198, 199, 56, 201, 102, 93, 80, 80, 203, 7, + 177, 129, 204, 203, 93, 204, 104, 119, 24, 70, + 360, 474, 516, 410, 350, 371, 250, 8, 208, 202, + 266, 119, 301, 128, 364, 128, 124, 104, 608, 93, + 278, 571, 375, -1, 132, -1, -1, -1, -1, -1, + 104, 139, 140, 141, -1, -1, -1, -1, -1, -1, + 139, -1, 141, -1, -1, -1, -1, -1, -1, -1, + 124, -1, -1, -1, -1, 56, -1, -1, 132, -1, + -1, -1, -1, -1, -1, 139, 140, 141, -1, -1, + 178, 179, -1, -1, 182, 183, 184, 185, 186, 178, + 179, 189, 190, -1, 192, 193, 194, 195, 196, 197, + 198, 199, 93, 201, -1, 194, 195, 196, 197, 198, + 199, -1, 201, 104, 178, 179, -1, -1, 182, 183, + 184, 185, 186, -1, -1, 189, 190, -1, 192, 193, + 194, 195, 196, 197, 198, 199, -1, 201, -1, -1, + -1, 132, -1, -1, -1, -1, -1, -1, 139, 140, + 141, -1, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 178, 179, -1, + -1, 182, 183, 184, 185, 186, -1, -1, 189, 190, + 0, 192, 193, 194, 195, 196, 197, 198, 199, 9, + 201, -1, 56, -1, -1, -1, -1, 17, 139, -1, + 141, -1, -1, -1, 24, -1, 9, -1, -1, 29, + -1, -1, -1, -1, 17, -1, -1, -1, -1, 39, + -1, 24, 42, 43, -1, -1, 29, -1, -1, 93, + -1, -1, -1, -1, 54, 55, 39, 178, 179, 42, + 43, -1, -1, -1, 64, -1, -1, 67, -1, -1, + -1, 54, 55, -1, 195, 196, 197, 198, 199, -1, + 201, 64, -1, -1, 67, -1, -1, -1, 132, 89, + -1, -1, -1, -1, 94, 139, -1, 141, -1, -1, + -1, -1, -1, -1, -1, -1, 89, -1, -1, -1, + 110, 94, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, 178, 179, -1, -1, -1, -1, + -1, 185, 186, -1, -1, 189, 190, -1, 192, 193, + 194, 195, 196, 197, 198, 199, -1, 201, -1, 159, + 160, 161, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 159, 160, 161 +}; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_int16 yystos[] = +{ + 0, 9, 17, 24, 29, 39, 42, 43, 54, 55, + 64, 67, 89, 94, 110, 116, 159, 160, 161, 210, + 211, 212, 213, 217, 219, 221, 222, 228, 229, 230, + 243, 245, 248, 249, 250, 252, 255, 336, 337, 29, + 3, 325, 3, 3, 325, 72, 82, 114, 97, 97, + 101, 324, 325, 82, 203, 258, 325, 72, 82, 114, + 21, 62, 3, 338, 339, 158, 218, 218, 218, 0, + 206, 344, 116, 214, 214, 60, 258, 259, 263, 3, + 205, 203, 97, 130, 231, 231, 231, 325, 3, 223, + 325, 126, 130, 244, 258, 259, 136, 97, 136, 244, + 244, 244, 325, 128, 207, 212, 100, 127, 276, 11, + 47, 83, 260, 261, 78, 260, 271, 3, 4, 5, + 6, 7, 50, 90, 107, 154, 155, 156, 196, 208, + 279, 280, 281, 282, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 4, 220, 124, 3, 326, 325, 325, + 85, 268, 96, 203, 251, 3, 253, 254, 48, 325, + 204, 204, 4, 224, 224, 224, 3, 325, 325, 258, + 339, 203, 7, 314, 14, 264, 256, 257, 258, 263, + 118, 262, 129, 256, 57, 74, 277, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 303, + 304, 305, 203, 4, 4, 313, 317, 204, 207, 48, + 134, 97, 128, 203, 251, 3, 48, 49, 50, 57, + 87, 124, 138, 196, 197, 203, 284, 285, 286, 287, + 288, 289, 290, 291, 293, 294, 295, 301, 302, 306, + 307, 308, 309, 310, 224, 3, 345, 65, 259, 182, + 207, 268, 94, 246, 247, 116, 203, 225, 225, 225, + 3, 215, 216, 265, 278, 283, 284, 271, 260, 272, + 273, 284, 271, 284, 118, 284, 122, 331, 332, 333, + 282, 303, 281, 325, 3, 255, 3, 173, 174, 175, + 232, 233, 234, 241, 128, 203, 205, 203, 203, 203, + 115, 284, 292, 48, 124, 285, 201, 285, 259, 284, + 119, 135, 180, 181, 8, 19, 56, 93, 104, 124, + 131, 132, 139, 140, 141, 178, 179, 182, 183, 184, + 185, 186, 189, 190, 192, 193, 194, 195, 196, 197, + 198, 199, 201, 101, 204, 207, 203, 284, 254, 41, + 203, 3, 26, 51, 107, 226, 227, 268, 203, 204, + 207, 97, 266, 267, 207, 3, 128, 329, 330, 277, + 256, 207, 92, 120, 274, 277, 57, 57, 64, 137, + 165, 176, 334, 333, 128, 203, 96, 13, 27, 31, + 32, 33, 34, 35, 37, 45, 70, 88, 90, 91, + 106, 111, 113, 123, 157, 235, 203, 176, 176, 204, + 207, 255, 204, 264, 3, 197, 259, 303, 284, 284, + 292, 95, 115, 121, 203, 124, 278, 204, 204, 284, + 284, 284, 284, 285, 285, 285, 285, 19, 104, 131, + 203, 107, 124, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 314, 325, 3, 280, 244, 226, 4, + 4, 223, 4, 204, 207, 280, 216, 203, 319, 320, + 321, 322, 323, 325, 340, 268, 283, 3, 273, 3, + 275, 331, 284, 284, 176, 165, 133, 162, 163, 335, + 235, 345, 224, 203, 203, 237, 203, 203, 203, 236, + 107, 124, 173, 174, 177, 238, 239, 240, 242, 345, + 203, 203, 233, 79, 296, 278, 203, 205, 204, 97, + 128, 112, 95, 121, 284, 284, 259, 202, 119, 285, + 285, 203, 259, 278, 107, 202, 204, 3, 204, 26, + 51, 227, 204, 255, 28, 68, 73, 80, 81, 98, + 103, 341, 207, 128, 327, 328, 329, 71, 269, 3, + 64, 345, 164, 204, 204, 7, 7, 7, 7, 7, + 107, 176, 325, 240, 242, 204, 345, 345, 203, 204, + 204, 264, 3, 284, 235, 284, 284, 121, 112, 204, + 285, 119, 259, 278, 204, 204, 4, 223, 204, 73, + 81, 98, 102, 103, 342, 102, 80, 80, 80, 102, + 320, 3, 129, 53, 270, 335, 204, 204, 207, 204, + 204, 204, 251, 204, 204, 108, 297, 296, 296, 278, + 204, 204, 121, 284, 285, 204, 204, 328, 80, 80, + 321, 80, 102, 321, 320, 203, 278, 284, 7, 242, + 129, 271, 204, 321, 84, 134, 345, 204, 278, 166, + 167, 168, 298, 299, 296, 203, 284, 343, 204, 204, + 7, 19, 169, 172, 300, 345, 170, 171, 300, 170, + 171, 204, 119, 300 +}; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_int16 yyr1[] = +{ + 0, 209, 210, 211, 211, 212, 212, 212, 212, 212, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, + 218, 219, 220, 221, 221, 222, 222, 223, 224, 225, + 225, 225, 226, 226, 226, 226, 226, 226, 227, 227, + 228, 228, 229, 229, 229, 230, 230, 230, 230, 230, + 231, 231, 232, 232, 233, 233, 234, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 236, 236, 237, 237, 237, + 238, 238, 239, 239, 239, 239, 240, 240, 240, 240, + 241, 241, 241, 242, 243, 243, 243, 243, 244, 244, + 245, 246, 247, 248, 249, 250, 250, 251, 251, 252, + 253, 253, 254, 255, 255, 255, 256, 256, 257, 257, + 258, 258, 259, 259, 260, 261, 261, 261, 262, 262, + 263, 264, 264, 265, 266, 266, 267, 268, 268, 269, + 269, 270, 270, 271, 271, 272, 272, 273, 274, 274, + 274, 275, 275, 276, 276, 277, 277, 277, 277, 277, + 277, 278, 278, 279, 279, 280, 280, 281, 281, 282, + 282, 282, 283, 284, 284, 284, 284, 284, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 286, + 286, 287, 287, 287, 287, 287, 288, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 289, 289, 289, 289, 290, 290, 290, + 290, 291, 291, 291, 291, 292, 292, 293, 293, 294, + 294, 294, 294, 294, 294, 294, 294, 295, 295, 295, + 295, 296, 296, 297, 297, 298, 298, 298, 299, 299, + 299, 300, 300, 300, 300, 300, 301, 302, 303, 303, + 303, 303, 303, 303, 304, 304, 304, 304, 304, 304, + 305, 305, 306, 307, 308, 308, 309, 309, 309, 309, + 309, 309, 310, 310, 310, 310, 310, 310, 310, 311, + 312, 312, 313, 313, 314, 314, 315, 316, 317, 317, + 317, 318, 319, 319, 320, 320, 321, 321, 322, 322, + 323, 324, 325, 325, 326, 326, 327, 327, 328, 328, + 329, 329, 330, 330, 331, 331, 332, 332, 333, 333, + 334, 334, 334, 334, 335, 335, 335, 336, 336, 337, + 338, 338, 339, 340, 340, 340, 340, 340, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 342, 342, 342, + 342, 342, 342, 342, 343, 344, 344, 345, 345 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 2, 1, 3, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 5, 0, 1, 3, 1, 4, 2, 2, 2, 1, + 0, 4, 1, 2, 5, 7, 6, 1, 1, 4, + 3, 0, 4, 2, 4, 2, 3, 1, 2, 2, + 5, 5, 2, 3, 2, 8, 7, 6, 9, 7, + 3, 0, 1, 3, 1, 1, 3, 1, 1, 4, + 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 4, 3, 0, 5, 3, 0, + 1, 0, 1, 2, 1, 2, 2, 1, 1, 2, + 5, 4, 6, 3, 4, 4, 3, 4, 2, 0, + 5, 1, 4, 4, 2, 8, 5, 3, 0, 5, + 1, 3, 3, 2, 2, 6, 1, 1, 1, 3, + 3, 3, 4, 6, 2, 1, 1, 1, 1, 0, + 8, 1, 0, 1, 1, 0, 2, 2, 0, 3, + 0, 2, 0, 3, 0, 1, 3, 3, 1, 1, + 0, 0, 2, 2, 0, 2, 2, 4, 2, 4, + 0, 1, 3, 1, 0, 1, 3, 1, 6, 1, + 2, 2, 2, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, + 1, 2, 2, 2, 3, 4, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 3, 3, 3, 3, 3, 3, 5, 6, 5, + 6, 4, 6, 3, 5, 4, 5, 4, 5, 3, + 3, 3, 3, 3, 3, 3, 3, 4, 6, 6, + 8, 6, 0, 3, 0, 2, 5, 0, 1, 1, + 1, 2, 2, 2, 2, 1, 6, 6, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 4, 5, 6, 1, 1, 3, 5, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, + 2, 1, 1, 3, 1, 1, 1, 4, 1, 3, + 2, 1, 1, 3, 1, 0, 1, 5, 1, 0, + 2, 1, 1, 0, 1, 0, 1, 2, 3, 5, + 1, 3, 1, 2, 2, 1, 0, 1, 0, 2, + 1, 3, 3, 4, 5, 4, 6, 8, 1, 2, + 1, 2, 1, 2, 1, 1, 0, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 0, 1, 3 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = SQL_HSQL_EMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == SQL_HSQL_EMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (&yylloc, result, scanner, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use SQL_HSQL_error or SQL_HSQL_UNDEF. */ +#define YYERRCODE SQL_HSQL_UNDEF + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) + + +/* Enable debugging if requested. */ +#if HSQL_DEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +# ifndef YY_LOCATION_PRINT +# if defined HSQL_LTYPE_IS_TRIVIAL && HSQL_LTYPE_IS_TRIVIAL + +/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ + +YY_ATTRIBUTE_UNUSED +static int +yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) +{ + int res = 0; + int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; + if (0 <= yylocp->first_line) + { + res += YYFPRINTF (yyo, "%d", yylocp->first_line); + if (0 <= yylocp->first_column) + res += YYFPRINTF (yyo, ".%d", yylocp->first_column); + } + if (0 <= yylocp->last_line) + { + if (yylocp->first_line < yylocp->last_line) + { + res += YYFPRINTF (yyo, "-%d", yylocp->last_line); + if (0 <= end_col) + res += YYFPRINTF (yyo, ".%d", end_col); + } + else if (0 <= end_col && yylocp->first_column < end_col) + res += YYFPRINTF (yyo, "-%d", end_col); + } + return res; + } + +# define YY_LOCATION_PRINT(File, Loc) \ + yy_location_print_ (File, &(Loc)) + +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +# endif /* !defined YY_LOCATION_PRINT */ + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value, Location, result, scanner); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) +{ + FILE *yyoutput = yyo; + YYUSE (yyoutput); + YYUSE (yylocationp); + YYUSE (result); + YYUSE (scanner); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yykind < YYNTOKENS) + YYPRINT (yyo, yytoknum[yykind], *yyvaluep); +# endif + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + YY_LOCATION_PRINT (yyo, *yylocationp); + YYFPRINTF (yyo, ": "); + yy_symbol_value_print (yyo, yykind, yyvaluep, yylocationp, result, scanner); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, + int yyrule, hsql::SQLParserResult* result, yyscan_t scanner) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)], + &(yylsp[(yyi + 1) - (yynrhs)]), result, scanner); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, yylsp, Rule, result, scanner); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !HSQL_DEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !HSQL_DEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +/* Context of a parse error. */ +typedef struct +{ + yy_state_t *yyssp; + yysymbol_kind_t yytoken; + YYLTYPE *yylloc; +} yypcontext_t; + +/* Put in YYARG at most YYARGN of the expected tokens given the + current YYCTX, and return the number of tokens stored in YYARG. If + YYARG is null, return the number of expected tokens (guaranteed to + be less than YYNTOKENS). Return YYENOMEM on memory exhaustion. + Return 0 if there are more than YYARGN expected tokens, yet fill + YYARG up to YYARGN. */ +static int +yypcontext_expected_tokens (const yypcontext_t *yyctx, + yysymbol_kind_t yyarg[], int yyargn) +{ + /* Actual size of YYARG. */ + int yycount = 0; + int yyn = yypact[+*yyctx->yyssp]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (!yyarg) + ++yycount; + else if (yycount == yyargn) + return 0; + else + yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx); + } + } + if (yyarg && yycount == 0 && 0 < yyargn) + yyarg[0] = YYSYMBOL_YYEMPTY; + return yycount; +} + + + + +#ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) +# else +/* Return the length of YYSTR. */ +static YYPTRDIFF_T +yystrlen (const char *yystr) +{ + YYPTRDIFF_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +#endif + +#ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +#endif + +#ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYPTRDIFF_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYPTRDIFF_T yyn = 0; + char const *yyp = yystr; + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + else + goto append; + + append: + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (yyres) + return yystpcpy (yyres, yystr) - yyres; + else + return yystrlen (yystr); +} +#endif + + +static int +yy_syntax_error_arguments (const yypcontext_t *yyctx, + yysymbol_kind_t yyarg[], int yyargn) +{ + /* Actual size of YYARG. */ + int yycount = 0; + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yyctx->yytoken != YYSYMBOL_YYEMPTY) + { + int yyn; + if (yyarg) + yyarg[yycount] = yyctx->yytoken; + ++yycount; + yyn = yypcontext_expected_tokens (yyctx, + yyarg ? yyarg + 1 : yyarg, yyargn - 1); + if (yyn == YYENOMEM) + return YYENOMEM; + else + yycount += yyn; + } + return yycount; +} + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return -1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return YYENOMEM if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, + const yypcontext_t *yyctx) +{ + enum { YYARGS_MAX = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULLPTR; + /* Arguments of yyformat: reported tokens (one for the "unexpected", + one per "expected"). */ + yysymbol_kind_t yyarg[YYARGS_MAX]; + /* Cumulated lengths of YYARG. */ + YYPTRDIFF_T yysize = 0; + + /* Actual size of YYARG. */ + int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX); + if (yycount == YYENOMEM) + return YYENOMEM; + + switch (yycount) + { +#define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + default: /* Avoid compiler warnings. */ + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +#undef YYCASE_ + } + + /* Compute error message size. Don't count the "%s"s, but reserve + room for the terminator. */ + yysize = yystrlen (yyformat) - 2 * yycount + 1; + { + int yyi; + for (yyi = 0; yyi < yycount; ++yyi) + { + YYPTRDIFF_T yysize1 + = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]); + if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) + yysize = yysize1; + else + return YYENOMEM; + } + } + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return -1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]); + yyformat += 2; + } + else + { + ++yyp; + ++yyformat; + } + } + return 0; +} + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) +{ + YYUSE (yyvaluep); + YYUSE (yylocationp); + YYUSE (result); + YYUSE (scanner); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yykind) + { + case YYSYMBOL_IDENTIFIER: /* IDENTIFIER */ +#line 194 "bison_parser.y" + { free(((*yyvaluep).sval)); } +#line 2193 "bison_parser.cpp" + break; + + case YYSYMBOL_STRING: /* STRING */ +#line 194 "bison_parser.y" + { free(((*yyvaluep).sval)); } +#line 2199 "bison_parser.cpp" + break; + + case YYSYMBOL_BIGINTVAL: /* BIGINTVAL */ +#line 194 "bison_parser.y" + { free(((*yyvaluep).sval)); } +#line 2205 "bison_parser.cpp" + break; + + case YYSYMBOL_FLOATVAL: /* FLOATVAL */ +#line 181 "bison_parser.y" + { } +#line 2211 "bison_parser.cpp" + break; + + case YYSYMBOL_INTVAL: /* INTVAL */ +#line 181 "bison_parser.y" + { } +#line 2217 "bison_parser.cpp" + break; + + case YYSYMBOL_statement_list: /* statement_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).stmt_vec)) { + for (auto ptr : *(((*yyvaluep).stmt_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).stmt_vec)); +} +#line 2230 "bison_parser.cpp" + break; + + case YYSYMBOL_statement: /* statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).statement)); } +#line 2236 "bison_parser.cpp" + break; + + case YYSYMBOL_preparable_statement: /* preparable_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).statement)); } +#line 2242 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_hints: /* opt_hints */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2255 "bison_parser.cpp" + break; + + case YYSYMBOL_hint_list: /* hint_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2268 "bison_parser.cpp" + break; + + case YYSYMBOL_hint: /* hint */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2274 "bison_parser.cpp" + break; + + case YYSYMBOL_transaction_statement: /* transaction_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).transaction_stmt)); } +#line 2280 "bison_parser.cpp" + break; + + case YYSYMBOL_prepare_statement: /* prepare_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).prep_stmt)); } +#line 2286 "bison_parser.cpp" + break; + + case YYSYMBOL_prepare_target_query: /* prepare_target_query */ +#line 194 "bison_parser.y" + { free(((*yyvaluep).sval)); } +#line 2292 "bison_parser.cpp" + break; + + case YYSYMBOL_execute_statement: /* execute_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).exec_stmt)); } +#line 2298 "bison_parser.cpp" + break; + + case YYSYMBOL_import_statement: /* import_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).import_stmt)); } +#line 2304 "bison_parser.cpp" + break; + + case YYSYMBOL_file_type: /* file_type */ +#line 181 "bison_parser.y" + { } +#line 2310 "bison_parser.cpp" + break; + + case YYSYMBOL_file_path: /* file_path */ +#line 194 "bison_parser.y" + { free(((*yyvaluep).sval)); } +#line 2316 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_import_export_options: /* opt_import_export_options */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).import_export_option_t)); } +#line 2322 "bison_parser.cpp" + break; + + case YYSYMBOL_import_export_options: /* import_export_options */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).import_export_option_t)); } +#line 2328 "bison_parser.cpp" + break; + + case YYSYMBOL_csv_option: /* csv_option */ +#line 203 "bison_parser.y" + { + free(((*yyvaluep).csv_option_t)->second); + delete (((*yyvaluep).csv_option_t)); +} +#line 2337 "bison_parser.cpp" + break; + + case YYSYMBOL_export_statement: /* export_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).export_stmt)); } +#line 2343 "bison_parser.cpp" + break; + + case YYSYMBOL_show_statement: /* show_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).show_stmt)); } +#line 2349 "bison_parser.cpp" + break; + + case YYSYMBOL_create_statement: /* create_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).create_stmt)); } +#line 2355 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_not_exists: /* opt_not_exists */ +#line 181 "bison_parser.y" + { } +#line 2361 "bison_parser.cpp" + break; + + case YYSYMBOL_table_elem_commalist: /* table_elem_commalist */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).table_element_vec)) { + for (auto ptr : *(((*yyvaluep).table_element_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).table_element_vec)); +} +#line 2374 "bison_parser.cpp" + break; + + case YYSYMBOL_table_elem: /* table_elem */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table_element_t)); } +#line 2380 "bison_parser.cpp" + break; + + case YYSYMBOL_column_def: /* column_def */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).column_t)); } +#line 2386 "bison_parser.cpp" + break; + + case YYSYMBOL_column_type: /* column_type */ +#line 181 "bison_parser.y" + { } +#line 2392 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_time_precision: /* opt_time_precision */ +#line 181 "bison_parser.y" + { } +#line 2398 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_decimal_specification: /* opt_decimal_specification */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).ival_pair)); } +#line 2404 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_column_constraints: /* opt_column_constraints */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).column_constraints_t)); } +#line 2410 "bison_parser.cpp" + break; + + case YYSYMBOL_column_constraints: /* column_constraints */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).column_constraints_t)); } +#line 2416 "bison_parser.cpp" + break; + + case YYSYMBOL_column_constraint: /* column_constraint */ +#line 181 "bison_parser.y" + { } +#line 2422 "bison_parser.cpp" + break; + + case YYSYMBOL_table_constraint: /* table_constraint */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table_constraint_t)); } +#line 2428 "bison_parser.cpp" + break; + + case YYSYMBOL_references_spec: /* references_spec */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).references_spec_t)); } +#line 2434 "bison_parser.cpp" + break; + + case YYSYMBOL_drop_statement: /* drop_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).drop_stmt)); } +#line 2440 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_exists: /* opt_exists */ +#line 181 "bison_parser.y" + { } +#line 2446 "bison_parser.cpp" + break; + + case YYSYMBOL_alter_statement: /* alter_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).alter_stmt)); } +#line 2452 "bison_parser.cpp" + break; + + case YYSYMBOL_alter_action: /* alter_action */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).alter_action_t)); } +#line 2458 "bison_parser.cpp" + break; + + case YYSYMBOL_drop_action: /* drop_action */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).drop_action_t)); } +#line 2464 "bison_parser.cpp" + break; + + case YYSYMBOL_delete_statement: /* delete_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).delete_stmt)); } +#line 2470 "bison_parser.cpp" + break; + + case YYSYMBOL_truncate_statement: /* truncate_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).delete_stmt)); } +#line 2476 "bison_parser.cpp" + break; + + case YYSYMBOL_insert_statement: /* insert_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).insert_stmt)); } +#line 2482 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_column_list: /* opt_column_list */ +#line 186 "bison_parser.y" + { + if (((*yyvaluep).str_vec)) { + for (auto ptr : *(((*yyvaluep).str_vec))) { + free(ptr); + } + } + delete (((*yyvaluep).str_vec)); +} +#line 2495 "bison_parser.cpp" + break; + + case YYSYMBOL_update_statement: /* update_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).update_stmt)); } +#line 2501 "bison_parser.cpp" + break; + + case YYSYMBOL_update_clause_commalist: /* update_clause_commalist */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).update_vec)) { + for (auto ptr : *(((*yyvaluep).update_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).update_vec)); +} +#line 2514 "bison_parser.cpp" + break; + + case YYSYMBOL_update_clause: /* update_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).update_t)); } +#line 2520 "bison_parser.cpp" + break; + + case YYSYMBOL_select_statement: /* select_statement */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2526 "bison_parser.cpp" + break; + + case YYSYMBOL_select_within_set_operation: /* select_within_set_operation */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2532 "bison_parser.cpp" + break; + + case YYSYMBOL_select_within_set_operation_no_parentheses: /* select_within_set_operation_no_parentheses */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2538 "bison_parser.cpp" + break; + + case YYSYMBOL_select_with_paren: /* select_with_paren */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2544 "bison_parser.cpp" + break; + + case YYSYMBOL_select_no_paren: /* select_no_paren */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2550 "bison_parser.cpp" + break; + + case YYSYMBOL_set_operator: /* set_operator */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).set_operator_t)); } +#line 2556 "bison_parser.cpp" + break; + + case YYSYMBOL_set_type: /* set_type */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).set_operator_t)); } +#line 2562 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_all: /* opt_all */ +#line 181 "bison_parser.y" + { } +#line 2568 "bison_parser.cpp" + break; + + case YYSYMBOL_select_clause: /* select_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2574 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_distinct: /* opt_distinct */ +#line 181 "bison_parser.y" + { } +#line 2580 "bison_parser.cpp" + break; + + case YYSYMBOL_select_list: /* select_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2593 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_from_clause: /* opt_from_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2599 "bison_parser.cpp" + break; + + case YYSYMBOL_from_clause: /* from_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2605 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_where: /* opt_where */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2611 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_group: /* opt_group */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).group_t)); } +#line 2617 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_having: /* opt_having */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2623 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_order: /* opt_order */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).order_vec)) { + for (auto ptr : *(((*yyvaluep).order_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).order_vec)); +} +#line 2636 "bison_parser.cpp" + break; + + case YYSYMBOL_order_list: /* order_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).order_vec)) { + for (auto ptr : *(((*yyvaluep).order_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).order_vec)); +} +#line 2649 "bison_parser.cpp" + break; + + case YYSYMBOL_order_desc: /* order_desc */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).order)); } +#line 2655 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_order_type: /* opt_order_type */ +#line 181 "bison_parser.y" + { } +#line 2661 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_null_ordering: /* opt_null_ordering */ +#line 181 "bison_parser.y" + { } +#line 2667 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_top: /* opt_top */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).limit)); } +#line 2673 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_limit: /* opt_limit */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).limit)); } +#line 2679 "bison_parser.cpp" + break; + + case YYSYMBOL_expr_list: /* expr_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2692 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_extended_literal_list: /* opt_extended_literal_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2705 "bison_parser.cpp" + break; + + case YYSYMBOL_extended_literal_list: /* extended_literal_list */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2718 "bison_parser.cpp" + break; + + case YYSYMBOL_casted_extended_literal: /* casted_extended_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2724 "bison_parser.cpp" + break; + + case YYSYMBOL_extended_literal: /* extended_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2730 "bison_parser.cpp" + break; + + case YYSYMBOL_expr_alias: /* expr_alias */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2736 "bison_parser.cpp" + break; + + case YYSYMBOL_expr: /* expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2742 "bison_parser.cpp" + break; + + case YYSYMBOL_operand: /* operand */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2748 "bison_parser.cpp" + break; + + case YYSYMBOL_scalar_expr: /* scalar_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2754 "bison_parser.cpp" + break; + + case YYSYMBOL_unary_expr: /* unary_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2760 "bison_parser.cpp" + break; + + case YYSYMBOL_binary_expr: /* binary_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2766 "bison_parser.cpp" + break; + + case YYSYMBOL_logic_expr: /* logic_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2772 "bison_parser.cpp" + break; + + case YYSYMBOL_in_expr: /* in_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2778 "bison_parser.cpp" + break; + + case YYSYMBOL_case_expr: /* case_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2784 "bison_parser.cpp" + break; + + case YYSYMBOL_case_list: /* case_list */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2790 "bison_parser.cpp" + break; + + case YYSYMBOL_exists_expr: /* exists_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2796 "bison_parser.cpp" + break; + + case YYSYMBOL_comp_expr: /* comp_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2802 "bison_parser.cpp" + break; + + case YYSYMBOL_function_expr: /* function_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2808 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_window: /* opt_window */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).window_description)); } +#line 2814 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_partition: /* opt_partition */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).expr_vec)) { + for (auto ptr : *(((*yyvaluep).expr_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).expr_vec)); +} +#line 2827 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_frame_clause: /* opt_frame_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).frame_description)); } +#line 2833 "bison_parser.cpp" + break; + + case YYSYMBOL_frame_type: /* frame_type */ +#line 181 "bison_parser.y" + { } +#line 2839 "bison_parser.cpp" + break; + + case YYSYMBOL_frame_bound: /* frame_bound */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).frame_bound)); } +#line 2845 "bison_parser.cpp" + break; + + case YYSYMBOL_extract_expr: /* extract_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2851 "bison_parser.cpp" + break; + + case YYSYMBOL_cast_expr: /* cast_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2857 "bison_parser.cpp" + break; + + case YYSYMBOL_datetime_field: /* datetime_field */ +#line 181 "bison_parser.y" + { } +#line 2863 "bison_parser.cpp" + break; + + case YYSYMBOL_datetime_field_plural: /* datetime_field_plural */ +#line 181 "bison_parser.y" + { } +#line 2869 "bison_parser.cpp" + break; + + case YYSYMBOL_duration_field: /* duration_field */ +#line 181 "bison_parser.y" + { } +#line 2875 "bison_parser.cpp" + break; + + case YYSYMBOL_array_expr: /* array_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2881 "bison_parser.cpp" + break; + + case YYSYMBOL_array_index: /* array_index */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2887 "bison_parser.cpp" + break; + + case YYSYMBOL_between_expr: /* between_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2893 "bison_parser.cpp" + break; + + case YYSYMBOL_column_name: /* column_name */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2899 "bison_parser.cpp" + break; + + case YYSYMBOL_literal: /* literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2905 "bison_parser.cpp" + break; + + case YYSYMBOL_string_literal: /* string_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2911 "bison_parser.cpp" + break; + + case YYSYMBOL_bool_literal: /* bool_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2917 "bison_parser.cpp" + break; + + case YYSYMBOL_num_literal: /* num_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2923 "bison_parser.cpp" + break; + + case YYSYMBOL_int_literal: /* int_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2929 "bison_parser.cpp" + break; + + case YYSYMBOL_null_literal: /* null_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2935 "bison_parser.cpp" + break; + + case YYSYMBOL_date_literal: /* date_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2941 "bison_parser.cpp" + break; + + case YYSYMBOL_interval_literal: /* interval_literal */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2947 "bison_parser.cpp" + break; + + case YYSYMBOL_param_expr: /* param_expr */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2953 "bison_parser.cpp" + break; + + case YYSYMBOL_table_ref: /* table_ref */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2959 "bison_parser.cpp" + break; + + case YYSYMBOL_table_ref_atomic: /* table_ref_atomic */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2965 "bison_parser.cpp" + break; + + case YYSYMBOL_nonjoin_table_ref_atomic: /* nonjoin_table_ref_atomic */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2971 "bison_parser.cpp" + break; + + case YYSYMBOL_table_ref_commalist: /* table_ref_commalist */ +#line 195 "bison_parser.y" + { + if (((*yyvaluep).table_vec)) { + for (auto ptr : *(((*yyvaluep).table_vec))) { + delete ptr; + } + } + delete (((*yyvaluep).table_vec)); +} +#line 2984 "bison_parser.cpp" + break; + + case YYSYMBOL_table_ref_name: /* table_ref_name */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2990 "bison_parser.cpp" + break; + + case YYSYMBOL_table_ref_name_no_alias: /* table_ref_name_no_alias */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2996 "bison_parser.cpp" + break; + + case YYSYMBOL_table_name: /* table_name */ +#line 182 "bison_parser.y" + { + free(((*yyvaluep).table_name).name); + free(((*yyvaluep).table_name).schema); +} +#line 3005 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_index_name: /* opt_index_name */ +#line 194 "bison_parser.y" + { free(((*yyvaluep).sval)); } +#line 3011 "bison_parser.cpp" + break; + + case YYSYMBOL_table_alias: /* table_alias */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } +#line 3017 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_table_alias: /* opt_table_alias */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } +#line 3023 "bison_parser.cpp" + break; + + case YYSYMBOL_alias: /* alias */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } +#line 3029 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_alias: /* opt_alias */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } +#line 3035 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_locking_clause: /* opt_locking_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).locking_clause_vec)); } +#line 3041 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_locking_clause_list: /* opt_locking_clause_list */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).locking_clause_vec)); } +#line 3047 "bison_parser.cpp" + break; + + case YYSYMBOL_locking_clause: /* locking_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).locking_t)); } +#line 3053 "bison_parser.cpp" + break; + + case YYSYMBOL_row_lock_mode: /* row_lock_mode */ +#line 181 "bison_parser.y" + { } +#line 3059 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_row_lock_policy: /* opt_row_lock_policy */ +#line 181 "bison_parser.y" + { } +#line 3065 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_with_clause: /* opt_with_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).with_description_vec)); } +#line 3071 "bison_parser.cpp" + break; + + case YYSYMBOL_with_clause: /* with_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).with_description_vec)); } +#line 3077 "bison_parser.cpp" + break; + + case YYSYMBOL_with_description_list: /* with_description_list */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).with_description_vec)); } +#line 3083 "bison_parser.cpp" + break; + + case YYSYMBOL_with_description: /* with_description */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).with_description_t)); } +#line 3089 "bison_parser.cpp" + break; + + case YYSYMBOL_join_clause: /* join_clause */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 3095 "bison_parser.cpp" + break; + + case YYSYMBOL_opt_join_type: /* opt_join_type */ +#line 181 "bison_parser.y" + { } +#line 3101 "bison_parser.cpp" + break; + + case YYSYMBOL_natural_join_type: /* natural_join_type */ +#line 181 "bison_parser.y" + { } +#line 3107 "bison_parser.cpp" + break; + + case YYSYMBOL_join_condition: /* join_condition */ +#line 207 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 3113 "bison_parser.cpp" + break; + + case YYSYMBOL_ident_commalist: /* ident_commalist */ +#line 186 "bison_parser.y" + { + if (((*yyvaluep).str_vec)) { + for (auto ptr : *(((*yyvaluep).str_vec))) { + free(ptr); + } + } + delete (((*yyvaluep).str_vec)); +} +#line 3126 "bison_parser.cpp" + break; + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (hsql::SQLParserResult* result, yyscan_t scanner) +{ +/* Lookahead token kind. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + +/* Location data for the lookahead symbol. */ +static YYLTYPE yyloc_default +# if defined HSQL_LTYPE_IS_TRIVIAL && HSQL_LTYPE_IS_TRIVIAL + = { 1, 1, 1, 1 } +# endif +; +YYLTYPE yylloc = yyloc_default; + + /* Number of syntax errors so far. */ + int yynerrs = 0; + + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + /* The location stack: array, bottom, top. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp = yyls; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + YYLTYPE yyloc; + + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[3]; + + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = SQL_HSQL_EMPTY; /* Cause a token to be read. */ + +/* User initialization code. */ +#line 81 "bison_parser.y" +{ + // Initialize + yylloc.first_column = 0; + yylloc.last_column = 0; + yylloc.first_line = 0; + yylloc.last_line = 0; + yylloc.total_column = 0; + yylloc.string_length = 0; +} + +#line 3233 "bison_parser.cpp" + + yylsp[0] = yylloc; + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + goto yyexhaustedlab; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + YYLTYPE *yyls1 = yyls; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yyls1, yysize * YYSIZEOF (*yylsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + yyls = yyls1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); + YYSTACK_RELOCATE (yyls_alloc, yyls); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + yylsp = yyls + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == SQL_HSQL_EMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (&yylval, &yylloc, scanner); + } + + if (yychar <= SQL_YYEOF) + { + yychar = SQL_YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == SQL_HSQL_error) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = SQL_HSQL_UNDEF; + yytoken = YYSYMBOL_YYerror; + yyerror_range[1] = yylloc; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + *++yylsp = yylloc; + + /* Discard the shifted token. */ + yychar = SQL_HSQL_EMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); + yyerror_range[1] = yyloc; + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* input: statement_list opt_semicolon */ +#line 349 "bison_parser.y" + { + for (SQLStatement* stmt : *(yyvsp[-1].stmt_vec)) { + // Transfers ownership of the statement. + result->addStatement(stmt); + } + + unsigned param_id = 0; + for (void* param : yyloc.param_list) { + if (param) { + Expr* expr = (Expr*)param; + expr->ival = param_id; + result->addParameter(expr); + ++param_id; + } + } + delete (yyvsp[-1].stmt_vec); + } +#line 3461 "bison_parser.cpp" + break; + + case 3: /* statement_list: statement */ +#line 368 "bison_parser.y" + { + (yyvsp[0].statement)->stringLength = yylloc.string_length; + yylloc.string_length = 0; + (yyval.stmt_vec) = new std::vector(); + (yyval.stmt_vec)->push_back((yyvsp[0].statement)); +} +#line 3472 "bison_parser.cpp" + break; + + case 4: /* statement_list: statement_list ';' statement */ +#line 374 "bison_parser.y" + { + (yyvsp[0].statement)->stringLength = yylloc.string_length; + yylloc.string_length = 0; + (yyvsp[-2].stmt_vec)->push_back((yyvsp[0].statement)); + (yyval.stmt_vec) = (yyvsp[-2].stmt_vec); +} +#line 3483 "bison_parser.cpp" + break; + + case 5: /* statement: prepare_statement opt_hints */ +#line 381 "bison_parser.y" + { + (yyval.statement) = (yyvsp[-1].prep_stmt); + (yyval.statement)->hints = (yyvsp[0].expr_vec); +} +#line 3492 "bison_parser.cpp" + break; + + case 6: /* statement: preparable_statement opt_hints */ +#line 385 "bison_parser.y" + { + (yyval.statement) = (yyvsp[-1].statement); + (yyval.statement)->hints = (yyvsp[0].expr_vec); +} +#line 3501 "bison_parser.cpp" + break; + + case 7: /* statement: show_statement */ +#line 389 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].show_stmt); } +#line 3507 "bison_parser.cpp" + break; + + case 8: /* statement: import_statement */ +#line 390 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].import_stmt); } +#line 3513 "bison_parser.cpp" + break; + + case 9: /* statement: export_statement */ +#line 391 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].export_stmt); } +#line 3519 "bison_parser.cpp" + break; + + case 10: /* preparable_statement: select_statement */ +#line 393 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].select_stmt); } +#line 3525 "bison_parser.cpp" + break; + + case 11: /* preparable_statement: create_statement */ +#line 394 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].create_stmt); } +#line 3531 "bison_parser.cpp" + break; + + case 12: /* preparable_statement: insert_statement */ +#line 395 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].insert_stmt); } +#line 3537 "bison_parser.cpp" + break; + + case 13: /* preparable_statement: delete_statement */ +#line 396 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].delete_stmt); } +#line 3543 "bison_parser.cpp" + break; + + case 14: /* preparable_statement: truncate_statement */ +#line 397 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].delete_stmt); } +#line 3549 "bison_parser.cpp" + break; + + case 15: /* preparable_statement: update_statement */ +#line 398 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].update_stmt); } +#line 3555 "bison_parser.cpp" + break; + + case 16: /* preparable_statement: drop_statement */ +#line 399 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].drop_stmt); } +#line 3561 "bison_parser.cpp" + break; + + case 17: /* preparable_statement: alter_statement */ +#line 400 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].alter_stmt); } +#line 3567 "bison_parser.cpp" + break; + + case 18: /* preparable_statement: execute_statement */ +#line 401 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].exec_stmt); } +#line 3573 "bison_parser.cpp" + break; + + case 19: /* preparable_statement: transaction_statement */ +#line 402 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].transaction_stmt); } +#line 3579 "bison_parser.cpp" + break; + + case 20: /* opt_hints: WITH HINT '(' hint_list ')' */ +#line 408 "bison_parser.y" + { (yyval.expr_vec) = (yyvsp[-1].expr_vec); } +#line 3585 "bison_parser.cpp" + break; + + case 21: /* opt_hints: %empty */ +#line 409 "bison_parser.y" + { (yyval.expr_vec) = nullptr; } +#line 3591 "bison_parser.cpp" + break; + + case 22: /* hint_list: hint */ +#line 411 "bison_parser.y" + { + (yyval.expr_vec) = new std::vector(); + (yyval.expr_vec)->push_back((yyvsp[0].expr)); +} +#line 3600 "bison_parser.cpp" + break; + + case 23: /* hint_list: hint_list ',' hint */ +#line 415 "bison_parser.y" + { + (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); + (yyval.expr_vec) = (yyvsp[-2].expr_vec); +} +#line 3609 "bison_parser.cpp" + break; + + case 24: /* hint: IDENTIFIER */ +#line 420 "bison_parser.y" + { + (yyval.expr) = Expr::make(kExprHint); + (yyval.expr)->name = (yyvsp[0].sval); +} +#line 3618 "bison_parser.cpp" + break; + + case 25: /* hint: IDENTIFIER '(' extended_literal_list ')' */ +#line 424 "bison_parser.y" + { + (yyval.expr) = Expr::make(kExprHint); + (yyval.expr)->name = (yyvsp[-3].sval); + (yyval.expr)->exprList = (yyvsp[-1].expr_vec); +} +#line 3628 "bison_parser.cpp" + break; + + case 26: /* transaction_statement: BEGIN opt_transaction_keyword */ +#line 434 "bison_parser.y" + { (yyval.transaction_stmt) = new TransactionStatement(kBeginTransaction); } +#line 3634 "bison_parser.cpp" + break; + + case 27: /* transaction_statement: ROLLBACK opt_transaction_keyword */ +#line 435 "bison_parser.y" + { (yyval.transaction_stmt) = new TransactionStatement(kRollbackTransaction); } +#line 3640 "bison_parser.cpp" + break; + + case 28: /* transaction_statement: COMMIT opt_transaction_keyword */ +#line 436 "bison_parser.y" + { (yyval.transaction_stmt) = new TransactionStatement(kCommitTransaction); } +#line 3646 "bison_parser.cpp" + break; + + case 31: /* prepare_statement: PREPARE IDENTIFIER FROM prepare_target_query */ +#line 444 "bison_parser.y" + { + (yyval.prep_stmt) = new PrepareStatement(); + (yyval.prep_stmt)->name = (yyvsp[-2].sval); + (yyval.prep_stmt)->query = (yyvsp[0].sval); +} +#line 3656 "bison_parser.cpp" + break; + + case 33: /* execute_statement: EXECUTE IDENTIFIER */ +#line 452 "bison_parser.y" + { + (yyval.exec_stmt) = new ExecuteStatement(); + (yyval.exec_stmt)->name = (yyvsp[0].sval); +} +#line 3665 "bison_parser.cpp" + break; + + case 34: /* execute_statement: EXECUTE IDENTIFIER '(' opt_extended_literal_list ')' */ +#line 456 "bison_parser.y" + { + (yyval.exec_stmt) = new ExecuteStatement(); + (yyval.exec_stmt)->name = (yyvsp[-3].sval); + (yyval.exec_stmt)->parameters = (yyvsp[-1].expr_vec); +} +#line 3675 "bison_parser.cpp" + break; + + case 35: /* import_statement: IMPORT FROM file_type FILE file_path INTO table_name */ +#line 468 "bison_parser.y" + { + (yyval.import_stmt) = new ImportStatement((yyvsp[-4].import_type_t)); + (yyval.import_stmt)->filePath = (yyvsp[-2].sval); + (yyval.import_stmt)->schema = (yyvsp[0].table_name).schema; + (yyval.import_stmt)->tableName = (yyvsp[0].table_name).name; +} +#line 3686 "bison_parser.cpp" + break; + + case 36: /* import_statement: COPY table_name FROM file_path opt_import_export_options opt_where */ +#line 474 "bison_parser.y" + { + (yyval.import_stmt) = new ImportStatement((yyvsp[-1].import_export_option_t)->format); + (yyval.import_stmt)->filePath = (yyvsp[-2].sval); + (yyval.import_stmt)->schema = (yyvsp[-4].table_name).schema; + (yyval.import_stmt)->tableName = (yyvsp[-4].table_name).name; + (yyval.import_stmt)->whereClause = (yyvsp[0].expr); + if ((yyvsp[-1].import_export_option_t)->encoding) { + (yyval.import_stmt)->encoding = (yyvsp[-1].import_export_option_t)->encoding; + (yyvsp[-1].import_export_option_t)->encoding = nullptr; + } + if ((yyvsp[-1].import_export_option_t)->csv_options) { + (yyval.import_stmt)->csv_options = (yyvsp[-1].import_export_option_t)->csv_options; + (yyvsp[-1].import_export_option_t)->csv_options = nullptr; + } + delete (yyvsp[-1].import_export_option_t); +} +#line 3707 "bison_parser.cpp" + break; + + case 37: /* file_type: IDENTIFIER */ +#line 491 "bison_parser.y" + { + if (strcasecmp((yyvsp[0].sval), "csv") == 0) { + (yyval.import_type_t) = kImportCSV; + } else if (strcasecmp((yyvsp[0].sval), "tbl") == 0) { + (yyval.import_type_t) = kImportTbl; + } else if (strcasecmp((yyvsp[0].sval), "binary") == 0 || strcasecmp((yyvsp[0].sval), "bin") == 0) { + (yyval.import_type_t) = kImportBinary; + } else { + free((yyvsp[0].sval)); + yyerror(&yyloc, result, scanner, "File type is unknown."); + YYERROR; + } + free((yyvsp[0].sval)); +} +#line 3726 "bison_parser.cpp" + break; + + case 38: /* file_path: STRING */ +#line 506 "bison_parser.y" + { (yyval.sval) = (yyvsp[0].sval); } +#line 3732 "bison_parser.cpp" + break; + + case 39: /* opt_import_export_options: WITH '(' import_export_options ')' */ +#line 508 "bison_parser.y" + { (yyval.import_export_option_t) = (yyvsp[-1].import_export_option_t); } +#line 3738 "bison_parser.cpp" + break; + + case 40: /* opt_import_export_options: '(' import_export_options ')' */ +#line 509 "bison_parser.y" + { (yyval.import_export_option_t) = (yyvsp[-1].import_export_option_t); } +#line 3744 "bison_parser.cpp" + break; + + case 41: /* opt_import_export_options: %empty */ +#line 510 "bison_parser.y" + { (yyval.import_export_option_t) = new ImportExportOptions{}; } +#line 3750 "bison_parser.cpp" + break; + + case 42: /* import_export_options: import_export_options ',' FORMAT file_type */ +#line 512 "bison_parser.y" + { + if ((yyvsp[-3].import_export_option_t)->format != kImportAuto) { + delete (yyvsp[-3].import_export_option_t); + yyerror(&yyloc, result, scanner, "File type must only be provided once."); + YYERROR; + } + if ((yyvsp[-3].import_export_option_t)->csv_options && (yyvsp[0].import_type_t) != kImportCSV && (yyvsp[0].import_type_t) != kImportAuto) { + delete (yyvsp[-3].import_export_option_t); + yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); + YYERROR; + } + (yyvsp[-3].import_export_option_t)->format = (yyvsp[0].import_type_t); + (yyval.import_export_option_t) = (yyvsp[-3].import_export_option_t); +} +#line 3769 "bison_parser.cpp" + break; + + case 43: /* import_export_options: FORMAT file_type */ +#line 526 "bison_parser.y" + { + (yyval.import_export_option_t) = new ImportExportOptions{}; + (yyval.import_export_option_t)->format = (yyvsp[0].import_type_t); +} +#line 3778 "bison_parser.cpp" + break; + + case 44: /* import_export_options: import_export_options ',' ENCODING STRING */ +#line 530 "bison_parser.y" + { + if ((yyvsp[-3].import_export_option_t)->encoding) { + delete (yyvsp[-3].import_export_option_t); + free((yyvsp[0].sval)); + yyerror(&yyloc, result, scanner, "Encoding type must only be provided once."); + YYERROR; + } + (yyvsp[-3].import_export_option_t)->encoding = (yyvsp[0].sval); + (yyval.import_export_option_t) = (yyvsp[-3].import_export_option_t); +} +#line 3793 "bison_parser.cpp" + break; + + case 45: /* import_export_options: ENCODING STRING */ +#line 540 "bison_parser.y" + { + (yyval.import_export_option_t) = new ImportExportOptions{}; + (yyval.import_export_option_t)->encoding = (yyvsp[0].sval); +} +#line 3802 "bison_parser.cpp" + break; + + case 46: /* import_export_options: import_export_options ',' csv_option */ +#line 544 "bison_parser.y" + { + if ((yyvsp[-2].import_export_option_t)->format != kImportAuto && (yyvsp[-2].import_export_option_t)->format != kImportCSV) { + delete (yyvsp[-2].import_export_option_t); + free((yyvsp[0].csv_option_t)->second); + delete (yyvsp[0].csv_option_t); + yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); + YYERROR; + } + + if ((yyvsp[-2].import_export_option_t)->csv_options == nullptr) { + (yyvsp[-2].import_export_option_t)->csv_options = new CsvOptions{}; + } + + if (!(yyvsp[-2].import_export_option_t)->csv_options->accept_csv_option((yyvsp[0].csv_option_t))) { + free((yyvsp[0].csv_option_t)->second); + delete (yyvsp[0].csv_option_t); + delete (yyvsp[-2].import_export_option_t); + yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) cannot be provided more than once."); + YYERROR; + } + + delete (yyvsp[0].csv_option_t); + (yyval.import_export_option_t) = (yyvsp[-2].import_export_option_t); +} +#line 3831 "bison_parser.cpp" + break; + + case 47: /* import_export_options: csv_option */ +#line 568 "bison_parser.y" + { + (yyval.import_export_option_t) = new ImportExportOptions{}; + (yyval.import_export_option_t)->csv_options = new CsvOptions{}; + (yyval.import_export_option_t)->csv_options->accept_csv_option((yyvsp[0].csv_option_t)); + + delete (yyvsp[0].csv_option_t); +} +#line 3843 "bison_parser.cpp" + break; + + case 48: /* csv_option: IDENTIFIER STRING */ +#line 576 "bison_parser.y" + { + if (strcasecmp((yyvsp[-1].sval), "DELIMITER") == 0) { + (yyval.csv_option_t) = new std::pair(CsvOptionType::Delimiter, (yyvsp[0].sval)); + } else if (strcasecmp((yyvsp[-1].sval), "QUOTE") == 0) { + (yyval.csv_option_t) = new std::pair(CsvOptionType::Quote, (yyvsp[0].sval)); + } else { + free((yyvsp[-1].sval)); + free((yyvsp[0].sval)); + yyerror(&yyloc, result, scanner, "Unknown CSV option."); + YYERROR; + } + free((yyvsp[-1].sval)); +} +#line 3861 "bison_parser.cpp" + break; + + case 49: /* csv_option: NULL STRING */ +#line 589 "bison_parser.y" + { (yyval.csv_option_t) = new std::pair(CsvOptionType::Null, (yyvsp[0].sval)); } +#line 3867 "bison_parser.cpp" + break; + + case 50: /* export_statement: COPY table_name TO file_path opt_import_export_options */ +#line 596 "bison_parser.y" + { + (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_export_option_t)->format); + (yyval.export_stmt)->filePath = (yyvsp[-1].sval); + (yyval.export_stmt)->schema = (yyvsp[-3].table_name).schema; + (yyval.export_stmt)->tableName = (yyvsp[-3].table_name).name; + if ((yyvsp[0].import_export_option_t)->encoding) { + (yyval.export_stmt)->encoding = (yyvsp[0].import_export_option_t)->encoding; + (yyvsp[0].import_export_option_t)->encoding = nullptr; + } + if ((yyvsp[0].import_export_option_t)->csv_options) { + (yyval.export_stmt)->csv_options = (yyvsp[0].import_export_option_t)->csv_options; + (yyvsp[0].import_export_option_t)->csv_options = nullptr; + } + delete (yyvsp[0].import_export_option_t); +} +#line 3887 "bison_parser.cpp" + break; + + case 51: /* export_statement: COPY select_with_paren TO file_path opt_import_export_options */ +#line 611 "bison_parser.y" + { + (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_export_option_t)->format); + (yyval.export_stmt)->filePath = (yyvsp[-1].sval); + (yyval.export_stmt)->select = (yyvsp[-3].select_stmt); + if ((yyvsp[0].import_export_option_t)->encoding) { + (yyval.export_stmt)->encoding = (yyvsp[0].import_export_option_t)->encoding; + (yyvsp[0].import_export_option_t)->encoding = nullptr; + } + if ((yyvsp[0].import_export_option_t)->csv_options) { + (yyval.export_stmt)->csv_options = (yyvsp[0].import_export_option_t)->csv_options; + (yyvsp[0].import_export_option_t)->csv_options = nullptr; + } + delete (yyvsp[0].import_export_option_t); +} +#line 3906 "bison_parser.cpp" + break; + + case 52: /* show_statement: SHOW TABLES */ +#line 631 "bison_parser.y" + { (yyval.show_stmt) = new ShowStatement(kShowTables); } +#line 3912 "bison_parser.cpp" + break; + + case 53: /* show_statement: SHOW COLUMNS table_name */ +#line 632 "bison_parser.y" + { + (yyval.show_stmt) = new ShowStatement(kShowColumns); + (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; + (yyval.show_stmt)->name = (yyvsp[0].table_name).name; +} +#line 3922 "bison_parser.cpp" + break; + + case 54: /* show_statement: DESCRIBE table_name */ +#line 637 "bison_parser.y" + { + (yyval.show_stmt) = new ShowStatement(kShowColumns); + (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; + (yyval.show_stmt)->name = (yyvsp[0].table_name).name; +} +#line 3932 "bison_parser.cpp" + break; + + case 55: /* create_statement: CREATE TABLE opt_not_exists table_name FROM IDENTIFIER FILE file_path */ +#line 648 "bison_parser.y" + { + (yyval.create_stmt) = new CreateStatement(kCreateTableFromTbl); + (yyval.create_stmt)->ifNotExists = (yyvsp[-5].bval); + (yyval.create_stmt)->schema = (yyvsp[-4].table_name).schema; + (yyval.create_stmt)->tableName = (yyvsp[-4].table_name).name; + if (strcasecmp((yyvsp[-2].sval), "tbl") != 0) { + free((yyvsp[-2].sval)); + yyerror(&yyloc, result, scanner, "File type is unknown."); + YYERROR; + } + free((yyvsp[-2].sval)); + (yyval.create_stmt)->filePath = (yyvsp[0].sval); +} +#line 3950 "bison_parser.cpp" + break; + + case 56: /* create_statement: CREATE TABLE opt_not_exists table_name '(' table_elem_commalist ')' */ +#line 661 "bison_parser.y" + { + (yyval.create_stmt) = new CreateStatement(kCreateTable); + (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); + (yyval.create_stmt)->schema = (yyvsp[-3].table_name).schema; + (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; + (yyval.create_stmt)->setColumnDefsAndConstraints((yyvsp[-1].table_element_vec)); + delete (yyvsp[-1].table_element_vec); + if (result->errorMsg()) { + delete (yyval.create_stmt); + YYERROR; + } +} +#line 3967 "bison_parser.cpp" + break; + + case 57: /* create_statement: CREATE TABLE opt_not_exists table_name AS select_statement */ +#line 673 "bison_parser.y" + { + (yyval.create_stmt) = new CreateStatement(kCreateTable); + (yyval.create_stmt)->ifNotExists = (yyvsp[-3].bval); + (yyval.create_stmt)->schema = (yyvsp[-2].table_name).schema; + (yyval.create_stmt)->tableName = (yyvsp[-2].table_name).name; + (yyval.create_stmt)->select = (yyvsp[0].select_stmt); +} +#line 3979 "bison_parser.cpp" + break; + + case 58: /* create_statement: CREATE INDEX opt_not_exists opt_index_name ON table_name '(' ident_commalist ')' */ +#line 680 "bison_parser.y" + { + (yyval.create_stmt) = new CreateStatement(kCreateIndex); + (yyval.create_stmt)->indexName = (yyvsp[-5].sval); + (yyval.create_stmt)->ifNotExists = (yyvsp[-6].bval); + (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; + (yyval.create_stmt)->indexColumns = (yyvsp[-1].str_vec); +} +#line 3991 "bison_parser.cpp" + break; + + case 59: /* create_statement: CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement */ +#line 687 "bison_parser.y" + { + (yyval.create_stmt) = new CreateStatement(kCreateView); + (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); + (yyval.create_stmt)->schema = (yyvsp[-3].table_name).schema; + (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; + (yyval.create_stmt)->viewColumns = (yyvsp[-2].str_vec); + (yyval.create_stmt)->select = (yyvsp[0].select_stmt); +} +#line 4004 "bison_parser.cpp" + break; + + case 60: /* opt_not_exists: IF NOT EXISTS */ +#line 696 "bison_parser.y" + { (yyval.bval) = true; } +#line 4010 "bison_parser.cpp" + break; + + case 61: /* opt_not_exists: %empty */ +#line 697 "bison_parser.y" + { (yyval.bval) = false; } +#line 4016 "bison_parser.cpp" + break; + + case 62: /* table_elem_commalist: table_elem */ +#line 699 "bison_parser.y" + { + (yyval.table_element_vec) = new std::vector(); + (yyval.table_element_vec)->push_back((yyvsp[0].table_element_t)); +} +#line 4025 "bison_parser.cpp" + break; + + case 63: /* table_elem_commalist: table_elem_commalist ',' table_elem */ +#line 703 "bison_parser.y" + { + (yyvsp[-2].table_element_vec)->push_back((yyvsp[0].table_element_t)); + (yyval.table_element_vec) = (yyvsp[-2].table_element_vec); +} +#line 4034 "bison_parser.cpp" + break; + + case 64: /* table_elem: column_def */ +#line 708 "bison_parser.y" + { (yyval.table_element_t) = (yyvsp[0].column_t); } +#line 4040 "bison_parser.cpp" + break; + + case 65: /* table_elem: table_constraint */ +#line 709 "bison_parser.y" + { (yyval.table_element_t) = (yyvsp[0].table_constraint_t); } +#line 4046 "bison_parser.cpp" + break; + + case 66: /* column_def: IDENTIFIER column_type opt_column_constraints */ +#line 711 "bison_parser.y" + { + (yyval.column_t) = new ColumnDefinition((yyvsp[-2].sval), (yyvsp[-1].column_type_t), (yyvsp[0].column_constraints_t)->constraints, (yyvsp[0].column_constraints_t)->references); + if (!(yyval.column_t)->trySetNullableExplicit()) { + yyerror(&yyloc, result, scanner, ("Conflicting nullability constraints for " + std::string{(yyvsp[-2].sval)}).c_str()); + } + delete (yyvsp[0].column_constraints_t); +} +#line 4058 "bison_parser.cpp" + break; + + case 67: /* column_type: BIGINT */ +#line 719 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::BIGINT}; } +#line 4064 "bison_parser.cpp" + break; + + case 68: /* column_type: BOOLEAN */ +#line 720 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::BOOLEAN}; } +#line 4070 "bison_parser.cpp" + break; + + case 69: /* column_type: CHAR '(' INTVAL ')' */ +#line 721 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::CHAR, (yyvsp[-1].ival)}; } +#line 4076 "bison_parser.cpp" + break; + + case 70: /* column_type: CHARACTER_VARYING '(' INTVAL ')' */ +#line 722 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } +#line 4082 "bison_parser.cpp" + break; + + case 71: /* column_type: DATE */ +#line 723 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::DATE}; } +#line 4088 "bison_parser.cpp" + break; + + case 72: /* column_type: DATETIME */ +#line 724 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::DATETIME}; } +#line 4094 "bison_parser.cpp" + break; + + case 73: /* column_type: DECIMAL opt_decimal_specification */ +#line 725 "bison_parser.y" + { + (yyval.column_type_t) = ColumnType{DataType::DECIMAL, 0, (yyvsp[0].ival_pair)->first, (yyvsp[0].ival_pair)->second}; + delete (yyvsp[0].ival_pair); +} +#line 4103 "bison_parser.cpp" + break; + + case 74: /* column_type: DOUBLE */ +#line 729 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::DOUBLE}; } +#line 4109 "bison_parser.cpp" + break; + + case 75: /* column_type: FLOAT */ +#line 730 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::FLOAT}; } +#line 4115 "bison_parser.cpp" + break; + + case 76: /* column_type: INT */ +#line 731 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::INT}; } +#line 4121 "bison_parser.cpp" + break; + + case 77: /* column_type: INTEGER */ +#line 732 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::INT}; } +#line 4127 "bison_parser.cpp" + break; + + case 78: /* column_type: LONG */ +#line 733 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::LONG}; } +#line 4133 "bison_parser.cpp" + break; + + case 79: /* column_type: REAL */ +#line 734 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::REAL}; } +#line 4139 "bison_parser.cpp" + break; + + case 80: /* column_type: SMALLINT */ +#line 735 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::SMALLINT}; } +#line 4145 "bison_parser.cpp" + break; + + case 81: /* column_type: TEXT */ +#line 736 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::TEXT}; } +#line 4151 "bison_parser.cpp" + break; + + case 82: /* column_type: TIME opt_time_precision */ +#line 737 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::TIME, 0, (yyvsp[0].ival)}; } +#line 4157 "bison_parser.cpp" + break; + + case 83: /* column_type: TIMESTAMP */ +#line 738 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::DATETIME}; } +#line 4163 "bison_parser.cpp" + break; + + case 84: /* column_type: VARCHAR '(' INTVAL ')' */ +#line 739 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } +#line 4169 "bison_parser.cpp" + break; + + case 85: /* opt_time_precision: '(' INTVAL ')' */ +#line 741 "bison_parser.y" + { (yyval.ival) = (yyvsp[-1].ival); } +#line 4175 "bison_parser.cpp" + break; + + case 86: /* opt_time_precision: %empty */ +#line 742 "bison_parser.y" + { (yyval.ival) = 0; } +#line 4181 "bison_parser.cpp" + break; + + case 87: /* opt_decimal_specification: '(' INTVAL ',' INTVAL ')' */ +#line 744 "bison_parser.y" + { (yyval.ival_pair) = new std::pair{(yyvsp[-3].ival), (yyvsp[-1].ival)}; } +#line 4187 "bison_parser.cpp" + break; + + case 88: /* opt_decimal_specification: '(' INTVAL ')' */ +#line 745 "bison_parser.y" + { (yyval.ival_pair) = new std::pair{(yyvsp[-1].ival), 0}; } +#line 4193 "bison_parser.cpp" + break; + + case 89: /* opt_decimal_specification: %empty */ +#line 746 "bison_parser.y" + { (yyval.ival_pair) = new std::pair{0, 0}; } +#line 4199 "bison_parser.cpp" + break; + + case 90: /* opt_column_constraints: column_constraints */ +#line 748 "bison_parser.y" + { (yyval.column_constraints_t) = (yyvsp[0].column_constraints_t); } +#line 4205 "bison_parser.cpp" + break; + + case 91: /* opt_column_constraints: %empty */ +#line 749 "bison_parser.y" + { (yyval.column_constraints_t) = new ColumnConstraints(); } +#line 4211 "bison_parser.cpp" + break; + + case 92: /* column_constraints: column_constraint */ +#line 751 "bison_parser.y" + { + (yyval.column_constraints_t) = new ColumnConstraints(); + (yyval.column_constraints_t)->constraints->insert((yyvsp[0].column_constraint_t)); +} +#line 4220 "bison_parser.cpp" + break; + + case 93: /* column_constraints: column_constraints column_constraint */ +#line 755 "bison_parser.y" + { + (yyvsp[-1].column_constraints_t)->constraints->insert((yyvsp[0].column_constraint_t)); + (yyval.column_constraints_t) = (yyvsp[-1].column_constraints_t); +} +#line 4229 "bison_parser.cpp" + break; + + case 94: /* column_constraints: references_spec */ +#line 759 "bison_parser.y" + { + (yyval.column_constraints_t) = new ColumnConstraints(); + (yyval.column_constraints_t)->constraints->insert(ConstraintType::ForeignKey); + (yyval.column_constraints_t)->references->emplace_back((yyvsp[0].references_spec_t)); +} +#line 4239 "bison_parser.cpp" + break; + + case 95: /* column_constraints: column_constraints references_spec */ +#line 764 "bison_parser.y" + { + // Multiple foreign keys for the same column could be possible, so we do not raise an error in that case. + // Think of foreign keys referenced on multiple levels (returned item references sold item references items). + (yyvsp[-1].column_constraints_t)->constraints->insert(ConstraintType::ForeignKey); + (yyvsp[-1].column_constraints_t)->references->emplace_back((yyvsp[0].references_spec_t)); + (yyval.column_constraints_t) = (yyvsp[-1].column_constraints_t); +} +#line 4251 "bison_parser.cpp" + break; + + case 96: /* column_constraint: PRIMARY KEY */ +#line 772 "bison_parser.y" + { (yyval.column_constraint_t) = ConstraintType::PrimaryKey; } +#line 4257 "bison_parser.cpp" + break; + + case 97: /* column_constraint: UNIQUE */ +#line 773 "bison_parser.y" + { (yyval.column_constraint_t) = ConstraintType::Unique; } +#line 4263 "bison_parser.cpp" + break; + + case 98: /* column_constraint: NULL */ +#line 774 "bison_parser.y" + { (yyval.column_constraint_t) = ConstraintType::Null; } +#line 4269 "bison_parser.cpp" + break; + + case 99: /* column_constraint: NOT NULL */ +#line 775 "bison_parser.y" + { (yyval.column_constraint_t) = ConstraintType::NotNull; } +#line 4275 "bison_parser.cpp" + break; + + case 100: /* table_constraint: PRIMARY KEY '(' ident_commalist ')' */ +#line 777 "bison_parser.y" + { (yyval.table_constraint_t) = new TableConstraint(ConstraintType::PrimaryKey, (yyvsp[-1].str_vec)); } +#line 4281 "bison_parser.cpp" + break; + + case 101: /* table_constraint: UNIQUE '(' ident_commalist ')' */ +#line 778 "bison_parser.y" + { (yyval.table_constraint_t) = new TableConstraint(ConstraintType::Unique, (yyvsp[-1].str_vec)); } +#line 4287 "bison_parser.cpp" + break; + + case 102: /* table_constraint: FOREIGN KEY '(' ident_commalist ')' references_spec */ +#line 779 "bison_parser.y" + { (yyval.table_constraint_t) = new ForeignKeyConstraint((yyvsp[-2].str_vec), (yyvsp[0].references_spec_t)); } +#line 4293 "bison_parser.cpp" + break; + + case 103: /* references_spec: REFERENCES table_name opt_column_list */ +#line 781 "bison_parser.y" + { (yyval.references_spec_t) = new ReferencesSpecification((yyvsp[-1].table_name).schema, (yyvsp[-1].table_name).name, (yyvsp[0].str_vec)); } +#line 4299 "bison_parser.cpp" + break; + + case 104: /* drop_statement: DROP TABLE opt_exists table_name */ +#line 789 "bison_parser.y" + { + (yyval.drop_stmt) = new DropStatement(kDropTable); + (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); + (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; + (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; +} +#line 4310 "bison_parser.cpp" + break; + + case 105: /* drop_statement: DROP VIEW opt_exists table_name */ +#line 795 "bison_parser.y" + { + (yyval.drop_stmt) = new DropStatement(kDropView); + (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); + (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; + (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; +} +#line 4321 "bison_parser.cpp" + break; + + case 106: /* drop_statement: DEALLOCATE PREPARE IDENTIFIER */ +#line 801 "bison_parser.y" + { + (yyval.drop_stmt) = new DropStatement(kDropPreparedStatement); + (yyval.drop_stmt)->ifExists = false; + (yyval.drop_stmt)->name = (yyvsp[0].sval); +} +#line 4331 "bison_parser.cpp" + break; + + case 107: /* drop_statement: DROP INDEX opt_exists IDENTIFIER */ +#line 807 "bison_parser.y" + { + (yyval.drop_stmt) = new DropStatement(kDropIndex); + (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); + (yyval.drop_stmt)->indexName = (yyvsp[0].sval); +} +#line 4341 "bison_parser.cpp" + break; + + case 108: /* opt_exists: IF EXISTS */ +#line 813 "bison_parser.y" + { (yyval.bval) = true; } +#line 4347 "bison_parser.cpp" + break; + + case 109: /* opt_exists: %empty */ +#line 814 "bison_parser.y" + { (yyval.bval) = false; } +#line 4353 "bison_parser.cpp" + break; + + case 110: /* alter_statement: ALTER TABLE opt_exists table_name alter_action */ +#line 821 "bison_parser.y" + { + (yyval.alter_stmt) = new AlterStatement((yyvsp[-1].table_name).name, (yyvsp[0].alter_action_t)); + (yyval.alter_stmt)->ifTableExists = (yyvsp[-2].bval); + (yyval.alter_stmt)->schema = (yyvsp[-1].table_name).schema; +} +#line 4363 "bison_parser.cpp" + break; + + case 111: /* alter_action: drop_action */ +#line 827 "bison_parser.y" + { (yyval.alter_action_t) = (yyvsp[0].drop_action_t); } +#line 4369 "bison_parser.cpp" + break; + + case 112: /* drop_action: DROP COLUMN opt_exists IDENTIFIER */ +#line 829 "bison_parser.y" + { + (yyval.drop_action_t) = new DropColumnAction((yyvsp[0].sval)); + (yyval.drop_action_t)->ifExists = (yyvsp[-1].bval); +} +#line 4378 "bison_parser.cpp" + break; + + case 113: /* delete_statement: DELETE FROM table_name opt_where */ +#line 839 "bison_parser.y" + { + (yyval.delete_stmt) = new DeleteStatement(); + (yyval.delete_stmt)->schema = (yyvsp[-1].table_name).schema; + (yyval.delete_stmt)->tableName = (yyvsp[-1].table_name).name; + (yyval.delete_stmt)->expr = (yyvsp[0].expr); +} +#line 4389 "bison_parser.cpp" + break; + + case 114: /* truncate_statement: TRUNCATE table_name */ +#line 846 "bison_parser.y" + { + (yyval.delete_stmt) = new DeleteStatement(); + (yyval.delete_stmt)->schema = (yyvsp[0].table_name).schema; + (yyval.delete_stmt)->tableName = (yyvsp[0].table_name).name; +} +#line 4399 "bison_parser.cpp" + break; + + case 115: /* insert_statement: INSERT INTO table_name opt_column_list VALUES '(' extended_literal_list ')' */ +#line 857 "bison_parser.y" + { + (yyval.insert_stmt) = new InsertStatement(kInsertValues); + (yyval.insert_stmt)->schema = (yyvsp[-5].table_name).schema; + (yyval.insert_stmt)->tableName = (yyvsp[-5].table_name).name; + (yyval.insert_stmt)->columns = (yyvsp[-4].str_vec); + (yyval.insert_stmt)->values = (yyvsp[-1].expr_vec); +} +#line 4411 "bison_parser.cpp" + break; + + case 116: /* insert_statement: INSERT INTO table_name opt_column_list select_no_paren */ +#line 864 "bison_parser.y" + { + (yyval.insert_stmt) = new InsertStatement(kInsertSelect); + (yyval.insert_stmt)->schema = (yyvsp[-2].table_name).schema; + (yyval.insert_stmt)->tableName = (yyvsp[-2].table_name).name; + (yyval.insert_stmt)->columns = (yyvsp[-1].str_vec); + (yyval.insert_stmt)->select = (yyvsp[0].select_stmt); +} +#line 4423 "bison_parser.cpp" + break; + + case 117: /* opt_column_list: '(' ident_commalist ')' */ +#line 872 "bison_parser.y" + { (yyval.str_vec) = (yyvsp[-1].str_vec); } +#line 4429 "bison_parser.cpp" + break; + + case 118: /* opt_column_list: %empty */ +#line 873 "bison_parser.y" + { (yyval.str_vec) = nullptr; } +#line 4435 "bison_parser.cpp" + break; + + case 119: /* update_statement: UPDATE table_ref_name_no_alias SET update_clause_commalist opt_where */ +#line 880 "bison_parser.y" + { + (yyval.update_stmt) = new UpdateStatement(); + (yyval.update_stmt)->table = (yyvsp[-3].table); + (yyval.update_stmt)->updates = (yyvsp[-1].update_vec); + (yyval.update_stmt)->where = (yyvsp[0].expr); +} +#line 4446 "bison_parser.cpp" + break; + + case 120: /* update_clause_commalist: update_clause */ +#line 887 "bison_parser.y" + { + (yyval.update_vec) = new std::vector(); + (yyval.update_vec)->push_back((yyvsp[0].update_t)); +} +#line 4455 "bison_parser.cpp" + break; + + case 121: /* update_clause_commalist: update_clause_commalist ',' update_clause */ +#line 891 "bison_parser.y" + { + (yyvsp[-2].update_vec)->push_back((yyvsp[0].update_t)); + (yyval.update_vec) = (yyvsp[-2].update_vec); +} +#line 4464 "bison_parser.cpp" + break; + + case 122: /* update_clause: IDENTIFIER '=' expr */ +#line 896 "bison_parser.y" + { + (yyval.update_t) = new UpdateClause(); + (yyval.update_t)->column = (yyvsp[-2].sval); + (yyval.update_t)->value = (yyvsp[0].expr); +} +#line 4474 "bison_parser.cpp" + break; + + case 123: /* select_statement: opt_with_clause select_with_paren */ +#line 906 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[0].select_stmt); + (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); +} +#line 4483 "bison_parser.cpp" + break; + + case 124: /* select_statement: opt_with_clause select_no_paren */ +#line 910 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[0].select_stmt); + (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); +} +#line 4492 "bison_parser.cpp" + break; + + case 125: /* select_statement: opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit */ +#line 914 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[-4].select_stmt); + if ((yyval.select_stmt)->setOperations == nullptr) { + (yyval.select_stmt)->setOperations = new std::vector(); + } + (yyval.select_stmt)->setOperations->push_back((yyvsp[-3].set_operator_t)); + (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[-2].select_stmt); + (yyval.select_stmt)->setOperations->back()->resultOrder = (yyvsp[-1].order_vec); + (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[0].limit); + (yyval.select_stmt)->withDescriptions = (yyvsp[-5].with_description_vec); +} +#line 4508 "bison_parser.cpp" + break; + + case 128: /* select_within_set_operation_no_parentheses: select_clause */ +#line 928 "bison_parser.y" + { (yyval.select_stmt) = (yyvsp[0].select_stmt); } +#line 4514 "bison_parser.cpp" + break; + + case 129: /* select_within_set_operation_no_parentheses: select_clause set_operator select_within_set_operation */ +#line 929 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[-2].select_stmt); + if ((yyval.select_stmt)->setOperations == nullptr) { + (yyval.select_stmt)->setOperations = new std::vector(); + } + (yyval.select_stmt)->setOperations->push_back((yyvsp[-1].set_operator_t)); + (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[0].select_stmt); +} +#line 4527 "bison_parser.cpp" + break; + + case 130: /* select_with_paren: '(' select_no_paren ')' */ +#line 938 "bison_parser.y" + { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } +#line 4533 "bison_parser.cpp" + break; + + case 131: /* select_with_paren: '(' select_with_paren ')' */ +#line 939 "bison_parser.y" + { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } +#line 4539 "bison_parser.cpp" + break; + + case 132: /* select_no_paren: select_clause opt_order opt_limit opt_locking_clause */ +#line 941 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[-3].select_stmt); + (yyval.select_stmt)->order = (yyvsp[-2].order_vec); + + // Limit could have been set by TOP. + if ((yyvsp[-1].limit)) { + delete (yyval.select_stmt)->limit; + (yyval.select_stmt)->limit = (yyvsp[-1].limit); + } + + if ((yyvsp[0].locking_clause_vec)) { + (yyval.select_stmt)->lockings = (yyvsp[0].locking_clause_vec); + } +} +#line 4558 "bison_parser.cpp" + break; + + case 133: /* select_no_paren: select_clause set_operator select_within_set_operation opt_order opt_limit opt_locking_clause */ +#line 955 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[-5].select_stmt); + if ((yyval.select_stmt)->setOperations == nullptr) { + (yyval.select_stmt)->setOperations = new std::vector(); + } + (yyval.select_stmt)->setOperations->push_back((yyvsp[-4].set_operator_t)); + (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[-3].select_stmt); + (yyval.select_stmt)->setOperations->back()->resultOrder = (yyvsp[-2].order_vec); + (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[-1].limit); + (yyval.select_stmt)->lockings = (yyvsp[0].locking_clause_vec); +} +#line 4574 "bison_parser.cpp" + break; + + case 134: /* set_operator: set_type opt_all */ +#line 967 "bison_parser.y" + { + (yyval.set_operator_t) = (yyvsp[-1].set_operator_t); + (yyval.set_operator_t)->isAll = (yyvsp[0].bval); +} +#line 4583 "bison_parser.cpp" + break; + + case 135: /* set_type: UNION */ +#line 972 "bison_parser.y" + { + (yyval.set_operator_t) = new SetOperation(); + (yyval.set_operator_t)->setType = SetType::kSetUnion; +} +#line 4592 "bison_parser.cpp" + break; + + case 136: /* set_type: INTERSECT */ +#line 976 "bison_parser.y" + { + (yyval.set_operator_t) = new SetOperation(); + (yyval.set_operator_t)->setType = SetType::kSetIntersect; +} +#line 4601 "bison_parser.cpp" + break; + + case 137: /* set_type: EXCEPT */ +#line 980 "bison_parser.y" + { + (yyval.set_operator_t) = new SetOperation(); + (yyval.set_operator_t)->setType = SetType::kSetExcept; +} +#line 4610 "bison_parser.cpp" + break; + + case 138: /* opt_all: ALL */ +#line 985 "bison_parser.y" + { (yyval.bval) = true; } +#line 4616 "bison_parser.cpp" + break; + + case 139: /* opt_all: %empty */ +#line 986 "bison_parser.y" + { (yyval.bval) = false; } +#line 4622 "bison_parser.cpp" + break; + + case 140: /* select_clause: SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group opt_having */ +#line 988 "bison_parser.y" + { + (yyval.select_stmt) = new SelectStatement(); + (yyval.select_stmt)->limit = (yyvsp[-6].limit); + (yyval.select_stmt)->selectDistinct = (yyvsp[-5].bval); + (yyval.select_stmt)->selectList = (yyvsp[-4].expr_vec); + (yyval.select_stmt)->fromTable = (yyvsp[-3].table); + (yyval.select_stmt)->whereClause = (yyvsp[-2].expr); + (yyval.select_stmt)->groupBy = (yyvsp[-1].group_t); + if ((yyvsp[-1].group_t)) { + (yyval.select_stmt)->groupBy->having = (yyvsp[0].expr); + } else { + (yyval.select_stmt)->having = (yyvsp[0].expr); + } +} +#line 4641 "bison_parser.cpp" + break; + + case 141: /* opt_distinct: DISTINCT */ +#line 1003 "bison_parser.y" + { (yyval.bval) = true; } +#line 4647 "bison_parser.cpp" + break; + + case 142: /* opt_distinct: %empty */ +#line 1004 "bison_parser.y" + { (yyval.bval) = false; } +#line 4653 "bison_parser.cpp" + break; + + case 144: /* opt_from_clause: from_clause */ +#line 1008 "bison_parser.y" + { (yyval.table) = (yyvsp[0].table); } +#line 4659 "bison_parser.cpp" + break; + + case 145: /* opt_from_clause: %empty */ +#line 1009 "bison_parser.y" + { (yyval.table) = nullptr; } +#line 4665 "bison_parser.cpp" + break; + + case 146: /* from_clause: FROM table_ref */ +#line 1011 "bison_parser.y" + { (yyval.table) = (yyvsp[0].table); } +#line 4671 "bison_parser.cpp" + break; + + case 147: /* opt_where: WHERE expr */ +#line 1013 "bison_parser.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 4677 "bison_parser.cpp" + break; + + case 148: /* opt_where: %empty */ +#line 1014 "bison_parser.y" + { (yyval.expr) = nullptr; } +#line 4683 "bison_parser.cpp" + break; + + case 149: /* opt_group: GROUP BY expr_list */ +#line 1016 "bison_parser.y" + { + (yyval.group_t) = new GroupByDescription(); + (yyval.group_t)->columns = (yyvsp[0].expr_vec); +} +#line 4692 "bison_parser.cpp" + break; + + case 150: /* opt_group: %empty */ +#line 1020 "bison_parser.y" + { (yyval.group_t) = nullptr; } +#line 4698 "bison_parser.cpp" + break; + + case 151: /* opt_having: HAVING expr */ +#line 1022 "bison_parser.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 4704 "bison_parser.cpp" + break; + + case 152: /* opt_having: %empty */ +#line 1023 "bison_parser.y" + { (yyval.expr) = nullptr; } +#line 4710 "bison_parser.cpp" + break; + + case 153: /* opt_order: ORDER BY order_list */ +#line 1025 "bison_parser.y" + { (yyval.order_vec) = (yyvsp[0].order_vec); } +#line 4716 "bison_parser.cpp" + break; + + case 154: /* opt_order: %empty */ +#line 1026 "bison_parser.y" + { (yyval.order_vec) = nullptr; } +#line 4722 "bison_parser.cpp" + break; + + case 155: /* order_list: order_desc */ +#line 1028 "bison_parser.y" + { + (yyval.order_vec) = new std::vector(); + (yyval.order_vec)->push_back((yyvsp[0].order)); +} +#line 4731 "bison_parser.cpp" + break; + + case 156: /* order_list: order_list ',' order_desc */ +#line 1032 "bison_parser.y" + { + (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); + (yyval.order_vec) = (yyvsp[-2].order_vec); +} +#line 4740 "bison_parser.cpp" + break; + + case 157: /* order_desc: expr opt_order_type opt_null_ordering */ +#line 1037 "bison_parser.y" + { (yyval.order) = new OrderDescription((yyvsp[-1].order_type), (yyvsp[-2].expr), (yyvsp[0].null_ordering_t)); } +#line 4746 "bison_parser.cpp" + break; + + case 158: /* opt_order_type: ASC */ +#line 1039 "bison_parser.y" + { (yyval.order_type) = kOrderAsc; } +#line 4752 "bison_parser.cpp" + break; + + case 159: /* opt_order_type: DESC */ +#line 1040 "bison_parser.y" + { (yyval.order_type) = kOrderDesc; } +#line 4758 "bison_parser.cpp" + break; + + case 160: /* opt_order_type: %empty */ +#line 1041 "bison_parser.y" + { (yyval.order_type) = kOrderAsc; } +#line 4764 "bison_parser.cpp" + break; + + case 161: /* opt_null_ordering: %empty */ +#line 1043 "bison_parser.y" + { (yyval.null_ordering_t) = NullOrdering::Undefined; } +#line 4770 "bison_parser.cpp" + break; + + case 162: /* opt_null_ordering: IDENTIFIER IDENTIFIER */ +#line 1044 "bison_parser.y" + { + auto null_ordering = NullOrdering::Undefined; + if (strcasecmp((yyvsp[-1].sval), "nulls") == 0) { + if (strcasecmp((yyvsp[0].sval), "first") == 0) { + null_ordering = NullOrdering::First; + } else if (strcasecmp((yyvsp[0].sval), "last") == 0) { + null_ordering = NullOrdering::Last; + } + } + free((yyvsp[-1].sval)); + free((yyvsp[0].sval)); + + if (null_ordering == NullOrdering::Undefined) { + yyerror(&yyloc, result, scanner, "Expected NULLS FIRST or NULLS LAST ordering."); + YYERROR; + } + + (yyval.null_ordering_t) = null_ordering; +} +#line 4794 "bison_parser.cpp" + break; + + case 163: /* opt_top: TOP int_literal */ +#line 1066 "bison_parser.y" + { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } +#line 4800 "bison_parser.cpp" + break; + + case 164: /* opt_top: %empty */ +#line 1067 "bison_parser.y" + { (yyval.limit) = nullptr; } +#line 4806 "bison_parser.cpp" + break; + + case 165: /* opt_limit: LIMIT expr */ +#line 1069 "bison_parser.y" + { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } +#line 4812 "bison_parser.cpp" + break; + + case 166: /* opt_limit: OFFSET expr */ +#line 1070 "bison_parser.y" + { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } +#line 4818 "bison_parser.cpp" + break; + + case 167: /* opt_limit: LIMIT expr OFFSET expr */ +#line 1071 "bison_parser.y" + { (yyval.limit) = new LimitDescription((yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 4824 "bison_parser.cpp" + break; + + case 168: /* opt_limit: LIMIT ALL */ +#line 1072 "bison_parser.y" + { (yyval.limit) = new LimitDescription(nullptr, nullptr); } +#line 4830 "bison_parser.cpp" + break; + + case 169: /* opt_limit: LIMIT ALL OFFSET expr */ +#line 1073 "bison_parser.y" + { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } +#line 4836 "bison_parser.cpp" + break; + + case 170: /* opt_limit: %empty */ +#line 1074 "bison_parser.y" + { (yyval.limit) = nullptr; } +#line 4842 "bison_parser.cpp" + break; + + case 171: /* expr_list: expr_alias */ +#line 1079 "bison_parser.y" + { + (yyval.expr_vec) = new std::vector(); + (yyval.expr_vec)->push_back((yyvsp[0].expr)); +} +#line 4851 "bison_parser.cpp" + break; + + case 172: /* expr_list: expr_list ',' expr_alias */ +#line 1083 "bison_parser.y" + { + (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); + (yyval.expr_vec) = (yyvsp[-2].expr_vec); +} +#line 4860 "bison_parser.cpp" + break; + + case 173: /* opt_extended_literal_list: extended_literal_list */ +#line 1089 "bison_parser.y" + { (yyval.expr_vec) = (yyvsp[0].expr_vec); } +#line 4866 "bison_parser.cpp" + break; + + case 174: /* opt_extended_literal_list: %empty */ +#line 1090 "bison_parser.y" + { (yyval.expr_vec) = nullptr; } +#line 4872 "bison_parser.cpp" + break; + + case 175: /* extended_literal_list: casted_extended_literal */ +#line 1092 "bison_parser.y" + { + (yyval.expr_vec) = new std::vector(); + (yyval.expr_vec)->push_back((yyvsp[0].expr)); +} +#line 4881 "bison_parser.cpp" + break; + + case 176: /* extended_literal_list: extended_literal_list ',' casted_extended_literal */ +#line 1096 "bison_parser.y" + { + (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); + (yyval.expr_vec) = (yyvsp[-2].expr_vec); +} +#line 4890 "bison_parser.cpp" + break; + + case 178: /* casted_extended_literal: CAST '(' extended_literal AS column_type ')' */ +#line 1101 "bison_parser.y" + { + (yyval.expr) = Expr::makeCast((yyvsp[-3].expr), (yyvsp[-1].column_type_t)); +} +#line 4898 "bison_parser.cpp" + break; + + case 179: /* extended_literal: literal */ +#line 1105 "bison_parser.y" + { + if ((yyvsp[0].expr)->type == ExprType::kExprParameter) { + delete (yyvsp[0].expr); + yyerror(&yyloc, result, scanner, "Parameter ? is not a valid literal."); + YYERROR; + } + (yyval.expr) = (yyvsp[0].expr); +} +#line 4911 "bison_parser.cpp" + break; + + case 180: /* extended_literal: '-' num_literal */ +#line 1113 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } +#line 4917 "bison_parser.cpp" + break; + + case 181: /* extended_literal: '-' interval_literal */ +#line 1114 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } +#line 4923 "bison_parser.cpp" + break; + + case 182: /* expr_alias: expr opt_alias */ +#line 1116 "bison_parser.y" + { + (yyval.expr) = (yyvsp[-1].expr); + if ((yyvsp[0].alias_t)) { + (yyval.expr)->alias = (yyvsp[0].alias_t)->name; + (yyvsp[0].alias_t)->name = nullptr; + delete (yyvsp[0].alias_t); + } +} +#line 4936 "bison_parser.cpp" + break; + + case 188: /* operand: '(' expr ')' */ +#line 1127 "bison_parser.y" + { (yyval.expr) = (yyvsp[-1].expr); } +#line 4942 "bison_parser.cpp" + break; + + case 198: /* operand: '(' select_no_paren ')' */ +#line 1129 "bison_parser.y" + { + (yyval.expr) = Expr::makeSelect((yyvsp[-1].select_stmt)); +} +#line 4950 "bison_parser.cpp" + break; + + case 201: /* unary_expr: '-' operand */ +#line 1135 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } +#line 4956 "bison_parser.cpp" + break; + + case 202: /* unary_expr: NOT operand */ +#line 1136 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } +#line 4962 "bison_parser.cpp" + break; + + case 203: /* unary_expr: operand ISNULL */ +#line 1137 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-1].expr)); } +#line 4968 "bison_parser.cpp" + break; + + case 204: /* unary_expr: operand IS NULL */ +#line 1138 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-2].expr)); } +#line 4974 "bison_parser.cpp" + break; + + case 205: /* unary_expr: operand IS NOT NULL */ +#line 1139 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, (yyvsp[-3].expr))); } +#line 4980 "bison_parser.cpp" + break; + + case 207: /* binary_expr: operand '-' operand */ +#line 1141 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMinus, (yyvsp[0].expr)); } +#line 4986 "bison_parser.cpp" + break; + + case 208: /* binary_expr: operand '+' operand */ +#line 1142 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPlus, (yyvsp[0].expr)); } +#line 4992 "bison_parser.cpp" + break; + + case 209: /* binary_expr: operand '/' operand */ +#line 1143 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpSlash, (yyvsp[0].expr)); } +#line 4998 "bison_parser.cpp" + break; + + case 210: /* binary_expr: operand '*' operand */ +#line 1144 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAsterisk, (yyvsp[0].expr)); } +#line 5004 "bison_parser.cpp" + break; + + case 211: /* binary_expr: operand '%' operand */ +#line 1145 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPercentage, (yyvsp[0].expr)); } +#line 5010 "bison_parser.cpp" + break; + + case 212: /* binary_expr: operand MOD operand */ +#line 1146 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMod, (yyvsp[0].expr)); } +#line 5016 "bison_parser.cpp" + break; + + case 213: /* binary_expr: operand DIV operand */ +#line 1147 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpDiv, (yyvsp[0].expr)); } +#line 5022 "bison_parser.cpp" + break; + + case 214: /* binary_expr: operand '^' operand */ +#line 1148 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitXor, (yyvsp[0].expr)); } +#line 5028 "bison_parser.cpp" + break; + + case 215: /* binary_expr: operand '&' operand */ +#line 1149 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitAnd, (yyvsp[0].expr)); } +#line 5034 "bison_parser.cpp" + break; + + case 216: /* binary_expr: operand '|' operand */ +#line 1150 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitOr, (yyvsp[0].expr)); } +#line 5040 "bison_parser.cpp" + break; + + case 217: /* binary_expr: operand BITSHIFTLEFT operand */ +#line 1151 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitShiftLeft, (yyvsp[0].expr)); } +#line 5046 "bison_parser.cpp" + break; + + case 218: /* binary_expr: operand BITSHIFTRIGHT operand */ +#line 1152 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitShiftRight, (yyvsp[0].expr)); } +#line 5052 "bison_parser.cpp" + break; + + case 219: /* binary_expr: operand LIKE operand */ +#line 1153 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } +#line 5058 "bison_parser.cpp" + break; + + case 220: /* binary_expr: operand NOT LIKE operand */ +#line 1154 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } +#line 5064 "bison_parser.cpp" + break; + + case 221: /* binary_expr: operand ILIKE operand */ +#line 1155 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpILike, (yyvsp[0].expr)); } +#line 5070 "bison_parser.cpp" + break; + + case 222: /* binary_expr: operand CONCAT operand */ +#line 1156 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpConcat, (yyvsp[0].expr)); } +#line 5076 "bison_parser.cpp" + break; + + case 223: /* logic_expr: expr AND expr */ +#line 1158 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } +#line 5082 "bison_parser.cpp" + break; + + case 224: /* logic_expr: expr LOGICALAND expr */ +#line 1159 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } +#line 5088 "bison_parser.cpp" + break; + + case 225: /* logic_expr: expr OR expr */ +#line 1160 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } +#line 5094 "bison_parser.cpp" + break; + + case 226: /* logic_expr: expr LOGICALOR expr */ +#line 1161 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } +#line 5100 "bison_parser.cpp" + break; + + case 227: /* in_expr: operand IN '(' expr_list ')' */ +#line 1163 "bison_parser.y" + { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } +#line 5106 "bison_parser.cpp" + break; + + case 228: /* in_expr: operand NOT IN '(' expr_list ')' */ +#line 1164 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } +#line 5112 "bison_parser.cpp" + break; + + case 229: /* in_expr: operand IN '(' select_no_paren ')' */ +#line 1165 "bison_parser.y" + { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } +#line 5118 "bison_parser.cpp" + break; + + case 230: /* in_expr: operand NOT IN '(' select_no_paren ')' */ +#line 1166 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } +#line 5124 "bison_parser.cpp" + break; + + case 231: /* case_expr: CASE expr case_list END */ +#line 1170 "bison_parser.y" + { (yyval.expr) = Expr::makeCase((yyvsp[-2].expr), (yyvsp[-1].expr), nullptr); } +#line 5130 "bison_parser.cpp" + break; + + case 232: /* case_expr: CASE expr case_list ELSE expr END */ +#line 1171 "bison_parser.y" + { (yyval.expr) = Expr::makeCase((yyvsp[-4].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } +#line 5136 "bison_parser.cpp" + break; + + case 233: /* case_expr: CASE case_list END */ +#line 1172 "bison_parser.y" + { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-1].expr), nullptr); } +#line 5142 "bison_parser.cpp" + break; + + case 234: /* case_expr: CASE case_list ELSE expr END */ +#line 1173 "bison_parser.y" + { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-3].expr), (yyvsp[-1].expr)); } +#line 5148 "bison_parser.cpp" + break; + + case 235: /* case_list: WHEN expr THEN expr */ +#line 1175 "bison_parser.y" + { (yyval.expr) = Expr::makeCaseList(Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } +#line 5154 "bison_parser.cpp" + break; + + case 236: /* case_list: case_list WHEN expr THEN expr */ +#line 1176 "bison_parser.y" + { (yyval.expr) = Expr::caseListAppend((yyvsp[-4].expr), Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } +#line 5160 "bison_parser.cpp" + break; + + case 237: /* exists_expr: EXISTS '(' select_no_paren ')' */ +#line 1178 "bison_parser.y" + { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } +#line 5166 "bison_parser.cpp" + break; + + case 238: /* exists_expr: NOT EXISTS '(' select_no_paren ')' */ +#line 1179 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } +#line 5172 "bison_parser.cpp" + break; + + case 239: /* comp_expr: operand '=' operand */ +#line 1181 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } +#line 5178 "bison_parser.cpp" + break; + + case 240: /* comp_expr: operand EQUALS operand */ +#line 1182 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } +#line 5184 "bison_parser.cpp" + break; + + case 241: /* comp_expr: operand NULLSAFEEQUALS operand */ +#line 1183 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNullSafeEquals, (yyvsp[0].expr)); } +#line 5190 "bison_parser.cpp" + break; + + case 242: /* comp_expr: operand NOTEQUALS operand */ +#line 1184 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } +#line 5196 "bison_parser.cpp" + break; + + case 243: /* comp_expr: operand '<' operand */ +#line 1185 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLess, (yyvsp[0].expr)); } +#line 5202 "bison_parser.cpp" + break; + + case 244: /* comp_expr: operand '>' operand */ +#line 1186 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreater, (yyvsp[0].expr)); } +#line 5208 "bison_parser.cpp" + break; + + case 245: /* comp_expr: operand LESSEQ operand */ +#line 1187 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } +#line 5214 "bison_parser.cpp" + break; + + case 246: /* comp_expr: operand GREATEREQ operand */ +#line 1188 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } +#line 5220 "bison_parser.cpp" + break; + + case 247: /* function_expr: IDENTIFIER '(' ')' opt_window */ +#line 1192 "bison_parser.y" + { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-3].sval), new std::vector(), false, (yyvsp[0].window_description)); } +#line 5226 "bison_parser.cpp" + break; + + case 248: /* function_expr: IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ +#line 1193 "bison_parser.y" + { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-5].sval), (yyvsp[-2].expr_vec), (yyvsp[-3].bval), (yyvsp[0].window_description)); } +#line 5232 "bison_parser.cpp" + break; + + case 249: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' ')' opt_window */ +#line 1194 "bison_parser.y" + { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-3].sval), (yyvsp[-5].sval), new std::vector(), false, (yyvsp[0].window_description)); } +#line 5238 "bison_parser.cpp" + break; + + case 250: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ +#line 1195 "bison_parser.y" + { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-5].sval), (yyvsp[-7].sval), (yyvsp[-2].expr_vec), (yyvsp[-3].bval), (yyvsp[0].window_description)); } +#line 5244 "bison_parser.cpp" + break; + + case 251: /* opt_window: OVER '(' opt_partition opt_order opt_frame_clause ')' */ +#line 1199 "bison_parser.y" + { (yyval.window_description) = new WindowDescription((yyvsp[-3].expr_vec), (yyvsp[-2].order_vec), (yyvsp[-1].frame_description)); } +#line 5250 "bison_parser.cpp" + break; + + case 252: /* opt_window: %empty */ +#line 1200 "bison_parser.y" + { (yyval.window_description) = nullptr; } +#line 5256 "bison_parser.cpp" + break; + + case 253: /* opt_partition: PARTITION BY expr_list */ +#line 1202 "bison_parser.y" + { (yyval.expr_vec) = (yyvsp[0].expr_vec); } +#line 5262 "bison_parser.cpp" + break; + + case 254: /* opt_partition: %empty */ +#line 1203 "bison_parser.y" + { (yyval.expr_vec) = nullptr; } +#line 5268 "bison_parser.cpp" + break; + + case 255: /* opt_frame_clause: frame_type frame_bound */ +#line 1208 "bison_parser.y" + { (yyval.frame_description) = new FrameDescription{(yyvsp[-1].frame_type), (yyvsp[0].frame_bound), new FrameBound{0, kCurrentRow, false}}; } +#line 5274 "bison_parser.cpp" + break; + + case 256: /* opt_frame_clause: frame_type BETWEEN frame_bound AND frame_bound */ +#line 1209 "bison_parser.y" + { (yyval.frame_description) = new FrameDescription{(yyvsp[-4].frame_type), (yyvsp[-2].frame_bound), (yyvsp[0].frame_bound)}; } +#line 5280 "bison_parser.cpp" + break; + + case 257: /* opt_frame_clause: %empty */ +#line 1210 "bison_parser.y" + { + (yyval.frame_description) = new FrameDescription{kRange, new FrameBound{0, kPreceding, true}, new FrameBound{0, kCurrentRow, false}}; +} +#line 5288 "bison_parser.cpp" + break; + + case 258: /* frame_type: RANGE */ +#line 1214 "bison_parser.y" + { (yyval.frame_type) = kRange; } +#line 5294 "bison_parser.cpp" + break; + + case 259: /* frame_type: ROWS */ +#line 1215 "bison_parser.y" + { (yyval.frame_type) = kRows; } +#line 5300 "bison_parser.cpp" + break; + + case 260: /* frame_type: GROUPS */ +#line 1216 "bison_parser.y" + { (yyval.frame_type) = kGroups; } +#line 5306 "bison_parser.cpp" + break; + + case 261: /* frame_bound: UNBOUNDED PRECEDING */ +#line 1218 "bison_parser.y" + { (yyval.frame_bound) = new FrameBound{0, kPreceding, true}; } +#line 5312 "bison_parser.cpp" + break; + + case 262: /* frame_bound: INTVAL PRECEDING */ +#line 1219 "bison_parser.y" + { (yyval.frame_bound) = new FrameBound{(yyvsp[-1].ival), kPreceding, false}; } +#line 5318 "bison_parser.cpp" + break; + + case 263: /* frame_bound: UNBOUNDED FOLLOWING */ +#line 1220 "bison_parser.y" + { (yyval.frame_bound) = new FrameBound{0, kFollowing, true}; } +#line 5324 "bison_parser.cpp" + break; + + case 264: /* frame_bound: INTVAL FOLLOWING */ +#line 1221 "bison_parser.y" + { (yyval.frame_bound) = new FrameBound{(yyvsp[-1].ival), kFollowing, false}; } +#line 5330 "bison_parser.cpp" + break; + + case 265: /* frame_bound: CURRENT_ROW */ +#line 1222 "bison_parser.y" + { (yyval.frame_bound) = new FrameBound{0, kCurrentRow, false}; } +#line 5336 "bison_parser.cpp" + break; + + case 266: /* extract_expr: EXTRACT '(' datetime_field FROM expr ')' */ +#line 1224 "bison_parser.y" + { (yyval.expr) = Expr::makeExtract((yyvsp[-3].datetime_field), (yyvsp[-1].expr)); } +#line 5342 "bison_parser.cpp" + break; + + case 267: /* cast_expr: CAST '(' expr AS column_type ')' */ +#line 1226 "bison_parser.y" + { (yyval.expr) = Expr::makeCast((yyvsp[-3].expr), (yyvsp[-1].column_type_t)); } +#line 5348 "bison_parser.cpp" + break; + + case 268: /* datetime_field: SECOND */ +#line 1228 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeSecond; } +#line 5354 "bison_parser.cpp" + break; + + case 269: /* datetime_field: MINUTE */ +#line 1229 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeMinute; } +#line 5360 "bison_parser.cpp" + break; + + case 270: /* datetime_field: HOUR */ +#line 1230 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeHour; } +#line 5366 "bison_parser.cpp" + break; + + case 271: /* datetime_field: DAY */ +#line 1231 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeDay; } +#line 5372 "bison_parser.cpp" + break; + + case 272: /* datetime_field: MONTH */ +#line 1232 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeMonth; } +#line 5378 "bison_parser.cpp" + break; + + case 273: /* datetime_field: YEAR */ +#line 1233 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeYear; } +#line 5384 "bison_parser.cpp" + break; + + case 274: /* datetime_field_plural: SECONDS */ +#line 1235 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeSecond; } +#line 5390 "bison_parser.cpp" + break; + + case 275: /* datetime_field_plural: MINUTES */ +#line 1236 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeMinute; } +#line 5396 "bison_parser.cpp" + break; + + case 276: /* datetime_field_plural: HOURS */ +#line 1237 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeHour; } +#line 5402 "bison_parser.cpp" + break; + + case 277: /* datetime_field_plural: DAYS */ +#line 1238 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeDay; } +#line 5408 "bison_parser.cpp" + break; + + case 278: /* datetime_field_plural: MONTHS */ +#line 1239 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeMonth; } +#line 5414 "bison_parser.cpp" + break; + + case 279: /* datetime_field_plural: YEARS */ +#line 1240 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeYear; } +#line 5420 "bison_parser.cpp" + break; + + case 282: /* array_expr: ARRAY '[' expr_list ']' */ +#line 1244 "bison_parser.y" + { (yyval.expr) = Expr::makeArray((yyvsp[-1].expr_vec)); } +#line 5426 "bison_parser.cpp" + break; + + case 283: /* array_index: operand '[' int_literal ']' */ +#line 1246 "bison_parser.y" + { (yyval.expr) = Expr::makeArrayIndex((yyvsp[-3].expr), (yyvsp[-1].expr)->ival); } +#line 5432 "bison_parser.cpp" + break; + + case 284: /* between_expr: operand BETWEEN operand AND operand */ +#line 1248 "bison_parser.y" + { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 5438 "bison_parser.cpp" + break; + + case 285: /* between_expr: operand NOT BETWEEN operand AND operand */ +#line 1249 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeBetween((yyvsp[-5].expr), (yyvsp[-2].expr), (yyvsp[0].expr))); } +#line 5444 "bison_parser.cpp" + break; + + case 286: /* column_name: IDENTIFIER */ +#line 1251 "bison_parser.y" + { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } +#line 5450 "bison_parser.cpp" + break; + + case 287: /* column_name: OFFSET */ +#line 1252 "bison_parser.y" + { (yyval.expr) = Expr::makeColumnRef(strdup("offset")); } +#line 5456 "bison_parser.cpp" + break; + + case 288: /* column_name: IDENTIFIER '.' IDENTIFIER */ +#line 1253 "bison_parser.y" + { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } +#line 5462 "bison_parser.cpp" + break; + + case 289: /* column_name: IDENTIFIER '.' IDENTIFIER '.' IDENTIFIER */ +#line 1254 "bison_parser.y" + { (yyval.expr) = Expr::makeColumnRef((yyvsp[-4].sval), (yyvsp[-2].sval), (yyvsp[0].sval)); } +#line 5468 "bison_parser.cpp" + break; + + case 290: /* column_name: '*' */ +#line 1255 "bison_parser.y" + { (yyval.expr) = Expr::makeStar(); } +#line 5474 "bison_parser.cpp" + break; + + case 291: /* column_name: IDENTIFIER '.' '*' */ +#line 1256 "bison_parser.y" + { (yyval.expr) = Expr::makeStar((yyvsp[-2].sval)); } +#line 5480 "bison_parser.cpp" + break; + + case 299: /* string_literal: STRING */ +#line 1260 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } +#line 5486 "bison_parser.cpp" + break; + + case 300: /* bool_literal: TRUE */ +#line 1262 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral(true); } +#line 5492 "bison_parser.cpp" + break; + + case 301: /* bool_literal: FALSE */ +#line 1263 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral(false); } +#line 5498 "bison_parser.cpp" + break; + + case 302: /* num_literal: FLOATVAL */ +#line 1265 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } +#line 5504 "bison_parser.cpp" + break; + + case 304: /* int_literal: INTVAL */ +#line 1268 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } +#line 5510 "bison_parser.cpp" + break; + + case 305: /* int_literal: BIGINTVAL */ +#line 1269 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteralIntString((yyvsp[0].sval)); } +#line 5516 "bison_parser.cpp" + break; + + case 306: /* null_literal: NULL */ +#line 1271 "bison_parser.y" + { (yyval.expr) = Expr::makeNullLiteral(); } +#line 5522 "bison_parser.cpp" + break; + + case 307: /* date_literal: DATE STRING */ +#line 1273 "bison_parser.y" + { + int day{0}, month{0}, year{0}, chars_parsed{0}; + // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character + if (sscanf((yyvsp[0].sval), "%4d-%2d-%2d%n", &day, &month, &year, &chars_parsed) != 3 || (yyvsp[0].sval)[chars_parsed] != 0) { + free((yyvsp[0].sval)); + yyerror(&yyloc, result, scanner, "Found incorrect date format. Expected format: YYYY-MM-DD"); + YYERROR; + } + (yyval.expr) = Expr::makeDateLiteral((yyvsp[0].sval)); +} +#line 5537 "bison_parser.cpp" + break; + + case 308: /* interval_literal: INTVAL duration_field */ +#line 1284 "bison_parser.y" + { (yyval.expr) = Expr::makeIntervalLiteral((yyvsp[-1].ival), (yyvsp[0].datetime_field)); } +#line 5543 "bison_parser.cpp" + break; + + case 309: /* interval_literal: INTERVAL STRING datetime_field */ +#line 1285 "bison_parser.y" + { + int duration{0}, chars_parsed{0}; + // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character + if (sscanf((yyvsp[-1].sval), "%d%n", &duration, &chars_parsed) != 1 || (yyvsp[-1].sval)[chars_parsed] != 0) { + free((yyvsp[-1].sval)); + yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER"); + YYERROR; + } + free((yyvsp[-1].sval)); + (yyval.expr) = Expr::makeIntervalLiteral(duration, (yyvsp[0].datetime_field)); +} +#line 5559 "bison_parser.cpp" + break; + + case 310: /* interval_literal: INTERVAL STRING */ +#line 1296 "bison_parser.y" + { + int duration{0}, chars_parsed{0}; + // 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte + char unit_string[8]; + // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character + if (sscanf((yyvsp[0].sval), "%d %7s%n", &duration, unit_string, &chars_parsed) != 2 || (yyvsp[0].sval)[chars_parsed] != 0) { + free((yyvsp[0].sval)); + yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER INTERVAL_QUALIIFIER"); + YYERROR; + } + free((yyvsp[0].sval)); + + DatetimeField unit; + if (strcasecmp(unit_string, "second") == 0 || strcasecmp(unit_string, "seconds") == 0) { + unit = kDatetimeSecond; + } else if (strcasecmp(unit_string, "minute") == 0 || strcasecmp(unit_string, "minutes") == 0) { + unit = kDatetimeMinute; + } else if (strcasecmp(unit_string, "hour") == 0 || strcasecmp(unit_string, "hours") == 0) { + unit = kDatetimeHour; + } else if (strcasecmp(unit_string, "day") == 0 || strcasecmp(unit_string, "days") == 0) { + unit = kDatetimeDay; + } else if (strcasecmp(unit_string, "month") == 0 || strcasecmp(unit_string, "months") == 0) { + unit = kDatetimeMonth; + } else if (strcasecmp(unit_string, "year") == 0 || strcasecmp(unit_string, "years") == 0) { + unit = kDatetimeYear; + } else { + yyerror(&yyloc, result, scanner, "Interval qualifier is unknown."); + YYERROR; + } + (yyval.expr) = Expr::makeIntervalLiteral(duration, unit); +} +#line 5595 "bison_parser.cpp" + break; + + case 311: /* param_expr: '?' */ +#line 1328 "bison_parser.y" + { + (yyval.expr) = Expr::makeParameter(yylloc.total_column); + (yyval.expr)->ival2 = yyloc.param_list.size(); + yyloc.param_list.push_back((yyval.expr)); +} +#line 5605 "bison_parser.cpp" + break; + + case 313: /* table_ref: table_ref_commalist ',' table_ref_atomic */ +#line 1337 "bison_parser.y" + { + (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); + auto tbl = new TableRef(kTableCrossProduct); + tbl->list = (yyvsp[-2].table_vec); + (yyval.table) = tbl; +} +#line 5616 "bison_parser.cpp" + break; + + case 317: /* nonjoin_table_ref_atomic: '(' select_statement ')' opt_table_alias */ +#line 1346 "bison_parser.y" + { + auto tbl = new TableRef(kTableSelect); + tbl->select = (yyvsp[-2].select_stmt); + tbl->alias = (yyvsp[0].alias_t); + (yyval.table) = tbl; +} +#line 5627 "bison_parser.cpp" + break; + + case 318: /* table_ref_commalist: table_ref_atomic */ +#line 1353 "bison_parser.y" + { + (yyval.table_vec) = new std::vector(); + (yyval.table_vec)->push_back((yyvsp[0].table)); +} +#line 5636 "bison_parser.cpp" + break; + + case 319: /* table_ref_commalist: table_ref_commalist ',' table_ref_atomic */ +#line 1357 "bison_parser.y" + { + (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); + (yyval.table_vec) = (yyvsp[-2].table_vec); +} +#line 5645 "bison_parser.cpp" + break; + + case 320: /* table_ref_name: table_name opt_table_alias */ +#line 1362 "bison_parser.y" + { + auto tbl = new TableRef(kTableName); + tbl->schema = (yyvsp[-1].table_name).schema; + tbl->name = (yyvsp[-1].table_name).name; + tbl->alias = (yyvsp[0].alias_t); + (yyval.table) = tbl; +} +#line 5657 "bison_parser.cpp" + break; + + case 321: /* table_ref_name_no_alias: table_name */ +#line 1370 "bison_parser.y" + { + (yyval.table) = new TableRef(kTableName); + (yyval.table)->schema = (yyvsp[0].table_name).schema; + (yyval.table)->name = (yyvsp[0].table_name).name; +} +#line 5667 "bison_parser.cpp" + break; + + case 322: /* table_name: IDENTIFIER */ +#line 1376 "bison_parser.y" + { + (yyval.table_name).schema = nullptr; + (yyval.table_name).name = (yyvsp[0].sval); +} +#line 5676 "bison_parser.cpp" + break; + + case 323: /* table_name: IDENTIFIER '.' IDENTIFIER */ +#line 1380 "bison_parser.y" + { + (yyval.table_name).schema = (yyvsp[-2].sval); + (yyval.table_name).name = (yyvsp[0].sval); +} +#line 5685 "bison_parser.cpp" + break; + + case 324: /* opt_index_name: IDENTIFIER */ +#line 1385 "bison_parser.y" + { (yyval.sval) = (yyvsp[0].sval); } +#line 5691 "bison_parser.cpp" + break; + + case 325: /* opt_index_name: %empty */ +#line 1386 "bison_parser.y" + { (yyval.sval) = nullptr; } +#line 5697 "bison_parser.cpp" + break; + + case 327: /* table_alias: AS IDENTIFIER '(' ident_commalist ')' */ +#line 1388 "bison_parser.y" + { (yyval.alias_t) = new Alias((yyvsp[-3].sval), (yyvsp[-1].str_vec)); } +#line 5703 "bison_parser.cpp" + break; + + case 329: /* opt_table_alias: %empty */ +#line 1390 "bison_parser.y" + { (yyval.alias_t) = nullptr; } +#line 5709 "bison_parser.cpp" + break; + + case 330: /* alias: AS IDENTIFIER */ +#line 1392 "bison_parser.y" + { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } +#line 5715 "bison_parser.cpp" + break; + + case 331: /* alias: IDENTIFIER */ +#line 1393 "bison_parser.y" + { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } +#line 5721 "bison_parser.cpp" + break; + + case 333: /* opt_alias: %empty */ +#line 1395 "bison_parser.y" + { (yyval.alias_t) = nullptr; } +#line 5727 "bison_parser.cpp" + break; + + case 334: /* opt_locking_clause: opt_locking_clause_list */ +#line 1401 "bison_parser.y" + { (yyval.locking_clause_vec) = (yyvsp[0].locking_clause_vec); } +#line 5733 "bison_parser.cpp" + break; + + case 335: /* opt_locking_clause: %empty */ +#line 1402 "bison_parser.y" + { (yyval.locking_clause_vec) = nullptr; } +#line 5739 "bison_parser.cpp" + break; + + case 336: /* opt_locking_clause_list: locking_clause */ +#line 1404 "bison_parser.y" + { + (yyval.locking_clause_vec) = new std::vector(); + (yyval.locking_clause_vec)->push_back((yyvsp[0].locking_t)); +} +#line 5748 "bison_parser.cpp" + break; + + case 337: /* opt_locking_clause_list: opt_locking_clause_list locking_clause */ +#line 1408 "bison_parser.y" + { + (yyvsp[-1].locking_clause_vec)->push_back((yyvsp[0].locking_t)); + (yyval.locking_clause_vec) = (yyvsp[-1].locking_clause_vec); +} +#line 5757 "bison_parser.cpp" + break; + + case 338: /* locking_clause: FOR row_lock_mode opt_row_lock_policy */ +#line 1413 "bison_parser.y" + { + (yyval.locking_t) = new LockingClause(); + (yyval.locking_t)->rowLockMode = (yyvsp[-1].lock_mode_t); + (yyval.locking_t)->rowLockWaitPolicy = (yyvsp[0].lock_wait_policy_t); + (yyval.locking_t)->tables = nullptr; +} +#line 5768 "bison_parser.cpp" + break; + + case 339: /* locking_clause: FOR row_lock_mode OF ident_commalist opt_row_lock_policy */ +#line 1419 "bison_parser.y" + { + (yyval.locking_t) = new LockingClause(); + (yyval.locking_t)->rowLockMode = (yyvsp[-3].lock_mode_t); + (yyval.locking_t)->tables = (yyvsp[-1].str_vec); + (yyval.locking_t)->rowLockWaitPolicy = (yyvsp[0].lock_wait_policy_t); +} +#line 5779 "bison_parser.cpp" + break; + + case 340: /* row_lock_mode: UPDATE */ +#line 1426 "bison_parser.y" + { (yyval.lock_mode_t) = RowLockMode::ForUpdate; } +#line 5785 "bison_parser.cpp" + break; + + case 341: /* row_lock_mode: NO KEY UPDATE */ +#line 1427 "bison_parser.y" + { (yyval.lock_mode_t) = RowLockMode::ForNoKeyUpdate; } +#line 5791 "bison_parser.cpp" + break; + + case 342: /* row_lock_mode: SHARE */ +#line 1428 "bison_parser.y" + { (yyval.lock_mode_t) = RowLockMode::ForShare; } +#line 5797 "bison_parser.cpp" + break; + + case 343: /* row_lock_mode: KEY SHARE */ +#line 1429 "bison_parser.y" + { (yyval.lock_mode_t) = RowLockMode::ForKeyShare; } +#line 5803 "bison_parser.cpp" + break; + + case 344: /* opt_row_lock_policy: SKIP LOCKED */ +#line 1431 "bison_parser.y" + { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::SkipLocked; } +#line 5809 "bison_parser.cpp" + break; + + case 345: /* opt_row_lock_policy: NOWAIT */ +#line 1432 "bison_parser.y" + { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::NoWait; } +#line 5815 "bison_parser.cpp" + break; + + case 346: /* opt_row_lock_policy: %empty */ +#line 1433 "bison_parser.y" + { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::None; } +#line 5821 "bison_parser.cpp" + break; + + case 348: /* opt_with_clause: %empty */ +#line 1439 "bison_parser.y" + { (yyval.with_description_vec) = nullptr; } +#line 5827 "bison_parser.cpp" + break; + + case 349: /* with_clause: WITH with_description_list */ +#line 1441 "bison_parser.y" + { (yyval.with_description_vec) = (yyvsp[0].with_description_vec); } +#line 5833 "bison_parser.cpp" + break; + + case 350: /* with_description_list: with_description */ +#line 1443 "bison_parser.y" + { + (yyval.with_description_vec) = new std::vector(); + (yyval.with_description_vec)->push_back((yyvsp[0].with_description_t)); +} +#line 5842 "bison_parser.cpp" + break; + + case 351: /* with_description_list: with_description_list ',' with_description */ +#line 1447 "bison_parser.y" + { + (yyvsp[-2].with_description_vec)->push_back((yyvsp[0].with_description_t)); + (yyval.with_description_vec) = (yyvsp[-2].with_description_vec); +} +#line 5851 "bison_parser.cpp" + break; + + case 352: /* with_description: IDENTIFIER AS select_with_paren */ +#line 1452 "bison_parser.y" + { + (yyval.with_description_t) = new WithDescription(); + (yyval.with_description_t)->alias = (yyvsp[-2].sval); + (yyval.with_description_t)->select = (yyvsp[0].select_stmt); +} +#line 5861 "bison_parser.cpp" + break; + + case 353: /* join_clause: table_ref_atomic NATURAL JOIN nonjoin_table_ref_atomic */ +#line 1462 "bison_parser.y" + { + (yyval.table) = new TableRef(kTableJoin); + (yyval.table)->join = new JoinDefinition(); + (yyval.table)->join->type = kJoinNatural; + (yyval.table)->join->natural = true; + (yyval.table)->join->left = (yyvsp[-3].table); + (yyval.table)->join->right = (yyvsp[0].table); +} +#line 5874 "bison_parser.cpp" + break; + + case 354: /* join_clause: table_ref_atomic NATURAL natural_join_type JOIN nonjoin_table_ref_atomic */ +#line 1470 "bison_parser.y" + { + (yyval.table) = new TableRef(kTableJoin); + (yyval.table)->join = new JoinDefinition(); + (yyval.table)->join->type = (JoinType)(yyvsp[-2].join_type); + (yyval.table)->join->natural = true; + (yyval.table)->join->left = (yyvsp[-4].table); + (yyval.table)->join->right = (yyvsp[0].table); +} +#line 5887 "bison_parser.cpp" + break; + + case 355: /* join_clause: table_ref_atomic CROSS JOIN nonjoin_table_ref_atomic */ +#line 1478 "bison_parser.y" + { + (yyval.table) = new TableRef(kTableJoin); + (yyval.table)->join = new JoinDefinition(); + (yyval.table)->join->type = kJoinCross; + (yyval.table)->join->left = (yyvsp[-3].table); + (yyval.table)->join->right = (yyvsp[0].table); +} +#line 5899 "bison_parser.cpp" + break; + + case 356: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic ON join_condition */ +#line 1485 "bison_parser.y" + { + (yyval.table) = new TableRef(kTableJoin); + (yyval.table)->join = new JoinDefinition(); + (yyval.table)->join->type = (JoinType)(yyvsp[-4].join_type); + (yyval.table)->join->left = (yyvsp[-5].table); + (yyval.table)->join->right = (yyvsp[-2].table); + (yyval.table)->join->condition = (yyvsp[0].expr); +} +#line 5912 "bison_parser.cpp" + break; + + case 357: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic USING '(' ident_commalist ')' */ +#line 1493 "bison_parser.y" + { + (yyval.table) = new TableRef(kTableJoin); + (yyval.table)->join = new JoinDefinition(); + (yyval.table)->join->type = (yyvsp[-6].join_type); + (yyval.table)->join->left = (yyvsp[-7].table); + (yyval.table)->join->right = (yyvsp[-4].table); + (yyval.table)->join->namedColumns = (yyvsp[-1].str_vec); +} +#line 5925 "bison_parser.cpp" + break; + + case 358: /* opt_join_type: INNER */ +#line 1502 "bison_parser.y" + { (yyval.join_type) = kJoinInner; } +#line 5931 "bison_parser.cpp" + break; + + case 359: /* opt_join_type: LEFT OUTER */ +#line 1503 "bison_parser.y" + { (yyval.join_type) = kJoinLeft; } +#line 5937 "bison_parser.cpp" + break; + + case 360: /* opt_join_type: LEFT */ +#line 1504 "bison_parser.y" + { (yyval.join_type) = kJoinLeft; } +#line 5943 "bison_parser.cpp" + break; + + case 361: /* opt_join_type: RIGHT OUTER */ +#line 1505 "bison_parser.y" + { (yyval.join_type) = kJoinRight; } +#line 5949 "bison_parser.cpp" + break; + + case 362: /* opt_join_type: RIGHT */ +#line 1506 "bison_parser.y" + { (yyval.join_type) = kJoinRight; } +#line 5955 "bison_parser.cpp" + break; + + case 363: /* opt_join_type: FULL OUTER */ +#line 1507 "bison_parser.y" + { (yyval.join_type) = kJoinFull; } +#line 5961 "bison_parser.cpp" + break; + + case 364: /* opt_join_type: OUTER */ +#line 1508 "bison_parser.y" + { (yyval.join_type) = kJoinFull; } +#line 5967 "bison_parser.cpp" + break; + + case 365: /* opt_join_type: FULL */ +#line 1509 "bison_parser.y" + { (yyval.join_type) = kJoinFull; } +#line 5973 "bison_parser.cpp" + break; + + case 366: /* opt_join_type: %empty */ +#line 1510 "bison_parser.y" + { (yyval.join_type) = kJoinInner; } +#line 5979 "bison_parser.cpp" + break; + + case 367: /* natural_join_type: INNER */ +#line 1512 "bison_parser.y" + { (yyval.join_type) = kJoinInner; } +#line 5985 "bison_parser.cpp" + break; + + case 368: /* natural_join_type: LEFT OUTER */ +#line 1513 "bison_parser.y" + { (yyval.join_type) = kJoinLeft; } +#line 5991 "bison_parser.cpp" + break; + + case 369: /* natural_join_type: LEFT */ +#line 1514 "bison_parser.y" + { (yyval.join_type) = kJoinLeft; } +#line 5997 "bison_parser.cpp" + break; + + case 370: /* natural_join_type: RIGHT OUTER */ +#line 1515 "bison_parser.y" + { (yyval.join_type) = kJoinRight; } +#line 6003 "bison_parser.cpp" + break; + + case 371: /* natural_join_type: RIGHT */ +#line 1516 "bison_parser.y" + { (yyval.join_type) = kJoinRight; } +#line 6009 "bison_parser.cpp" + break; + + case 372: /* natural_join_type: FULL OUTER */ +#line 1517 "bison_parser.y" + { (yyval.join_type) = kJoinFull; } +#line 6015 "bison_parser.cpp" + break; + + case 373: /* natural_join_type: FULL */ +#line 1518 "bison_parser.y" + { (yyval.join_type) = kJoinFull; } +#line 6021 "bison_parser.cpp" + break; + + case 377: /* ident_commalist: IDENTIFIER */ +#line 1529 "bison_parser.y" + { + (yyval.str_vec) = new std::vector(); + (yyval.str_vec)->push_back((yyvsp[0].sval)); +} +#line 6030 "bison_parser.cpp" + break; + + case 378: /* ident_commalist: ident_commalist ',' IDENTIFIER */ +#line 1533 "bison_parser.y" + { + (yyvsp[-2].str_vec)->push_back((yyvsp[0].sval)); + (yyval.str_vec) = (yyvsp[-2].str_vec); +} +#line 6039 "bison_parser.cpp" + break; + + +#line 6043 "bison_parser.cpp" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + *++yylsp = yyloc; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == SQL_HSQL_EMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + { + yypcontext_t yyctx + = {yyssp, yytoken, &yylloc}; + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == -1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = YY_CAST (char *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); + if (yymsg) + { + yysyntax_error_status + = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); + yymsgp = yymsg; + } + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = YYENOMEM; + } + } + yyerror (&yylloc, result, scanner, yymsgp); + if (yysyntax_error_status == YYENOMEM) + goto yyexhaustedlab; + } + } + + yyerror_range[1] = yylloc; + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= SQL_YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == SQL_YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, &yylloc, result, scanner); + yychar = SQL_HSQL_EMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + yyerror_range[1] = *yylsp; + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp, result, scanner); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + yyerror_range[2] = yylloc; + ++yylsp; + YYLLOC_DEFAULT (*yylsp, yyerror_range, 2); + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + + +#if 1 +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (&yylloc, result, scanner, YY_("memory exhausted")); + yyresult = 2; + goto yyreturn; +#endif + + +/*-------------------------------------------------------. +| yyreturn -- parsing is finished, clean up and return. | +`-------------------------------------------------------*/ +yyreturn: + if (yychar != SQL_HSQL_EMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, &yylloc, result, scanner); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yylsp, result, scanner); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + return yyresult; +} + +#line 1539 "bison_parser.y" + + +/********************************* + ** Section 4: Additional C code + *********************************/ + +/* empty */ + + // clang-format on diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.h b/extern/hyrise_sql_parser/src/parser/bison_parser.h new file mode 100644 index 0000000000..99553d48fc --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/bison_parser.h @@ -0,0 +1,386 @@ +/* A Bison parser, made by GNU Bison 3.7.4. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_HSQL_BISON_PARSER_H_INCLUDED +# define YY_HSQL_BISON_PARSER_H_INCLUDED +/* Debug traces. */ +#ifndef HSQL_DEBUG +# if defined YYDEBUG +#if YYDEBUG +# define HSQL_DEBUG 1 +# else +# define HSQL_DEBUG 0 +# endif +# else /* ! defined YYDEBUG */ +# define HSQL_DEBUG 0 +# endif /* ! defined YYDEBUG */ +#endif /* ! defined HSQL_DEBUG */ +#if HSQL_DEBUG +extern int hsql_debug; +#endif +/* "%code requires" blocks. */ +#line 39 "bison_parser.y" + +// %code requires block + +#include "../SQLParserResult.h" +#include "../sql/statements.h" +#include "parser_typedef.h" + +// Auto update column and line number +#define YY_USER_ACTION \ + yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column; \ + for (int i = 0; yytext[i] != '\0'; i++) { \ + yylloc->total_column++; \ + yylloc->string_length++; \ + if (yytext[i] == '\n') { \ + yylloc->last_line++; \ + yylloc->last_column = 0; \ + } else { \ + yylloc->last_column++; \ + } \ + } + +#line 80 "bison_parser.h" + +/* Token kinds. */ +#ifndef HSQL_TOKENTYPE +# define HSQL_TOKENTYPE + enum hsql_tokentype + { + SQL_HSQL_EMPTY = -2, + SQL_YYEOF = 0, /* "end of file" */ + SQL_HSQL_error = 256, /* error */ + SQL_HSQL_UNDEF = 257, /* "invalid token" */ + SQL_IDENTIFIER = 258, /* IDENTIFIER */ + SQL_STRING = 259, /* STRING */ + SQL_BIGINTVAL = 260, /* BIGINTVAL */ + SQL_FLOATVAL = 261, /* FLOATVAL */ + SQL_INTVAL = 262, /* INTVAL */ + SQL_NULLSAFEEQUALS = 263, /* NULLSAFEEQUALS */ + SQL_DEALLOCATE = 264, /* DEALLOCATE */ + SQL_PARAMETERS = 265, /* PARAMETERS */ + SQL_INTERSECT = 266, /* INTERSECT */ + SQL_TEMPORARY = 267, /* TEMPORARY */ + SQL_TIMESTAMP = 268, /* TIMESTAMP */ + SQL_DISTINCT = 269, /* DISTINCT */ + SQL_NVARCHAR = 270, /* NVARCHAR */ + SQL_RESTRICT = 271, /* RESTRICT */ + SQL_TRUNCATE = 272, /* TRUNCATE */ + SQL_ANALYZE = 273, /* ANALYZE */ + SQL_BETWEEN = 274, /* BETWEEN */ + SQL_CASCADE = 275, /* CASCADE */ + SQL_COLUMNS = 276, /* COLUMNS */ + SQL_CONTROL = 277, /* CONTROL */ + SQL_DEFAULT = 278, /* DEFAULT */ + SQL_EXECUTE = 279, /* EXECUTE */ + SQL_EXPLAIN = 280, /* EXPLAIN */ + SQL_ENCODING = 281, /* ENCODING */ + SQL_INTEGER = 282, /* INTEGER */ + SQL_NATURAL = 283, /* NATURAL */ + SQL_PREPARE = 284, /* PREPARE */ + SQL_SCHEMAS = 285, /* SCHEMAS */ + SQL_CHARACTER_VARYING = 286, /* CHARACTER_VARYING */ + SQL_REAL = 287, /* REAL */ + SQL_DECIMAL = 288, /* DECIMAL */ + SQL_SMALLINT = 289, /* SMALLINT */ + SQL_BIGINT = 290, /* BIGINT */ + SQL_SPATIAL = 291, /* SPATIAL */ + SQL_VARCHAR = 292, /* VARCHAR */ + SQL_VIRTUAL = 293, /* VIRTUAL */ + SQL_DESCRIBE = 294, /* DESCRIBE */ + SQL_BEFORE = 295, /* BEFORE */ + SQL_COLUMN = 296, /* COLUMN */ + SQL_CREATE = 297, /* CREATE */ + SQL_DELETE = 298, /* DELETE */ + SQL_DIRECT = 299, /* DIRECT */ + SQL_DOUBLE = 300, /* DOUBLE */ + SQL_ESCAPE = 301, /* ESCAPE */ + SQL_EXCEPT = 302, /* EXCEPT */ + SQL_EXISTS = 303, /* EXISTS */ + SQL_EXTRACT = 304, /* EXTRACT */ + SQL_CAST = 305, /* CAST */ + SQL_FORMAT = 306, /* FORMAT */ + SQL_GLOBAL = 307, /* GLOBAL */ + SQL_HAVING = 308, /* HAVING */ + SQL_IMPORT = 309, /* IMPORT */ + SQL_INSERT = 310, /* INSERT */ + SQL_ISNULL = 311, /* ISNULL */ + SQL_OFFSET = 312, /* OFFSET */ + SQL_RENAME = 313, /* RENAME */ + SQL_SCHEMA = 314, /* SCHEMA */ + SQL_SELECT = 315, /* SELECT */ + SQL_SORTED = 316, /* SORTED */ + SQL_TABLES = 317, /* TABLES */ + SQL_UNLOAD = 318, /* UNLOAD */ + SQL_UPDATE = 319, /* UPDATE */ + SQL_VALUES = 320, /* VALUES */ + SQL_AFTER = 321, /* AFTER */ + SQL_ALTER = 322, /* ALTER */ + SQL_CROSS = 323, /* CROSS */ + SQL_DELTA = 324, /* DELTA */ + SQL_FLOAT = 325, /* FLOAT */ + SQL_GROUP = 326, /* GROUP */ + SQL_INDEX = 327, /* INDEX */ + SQL_INNER = 328, /* INNER */ + SQL_LIMIT = 329, /* LIMIT */ + SQL_LOCAL = 330, /* LOCAL */ + SQL_MERGE = 331, /* MERGE */ + SQL_MINUS = 332, /* MINUS */ + SQL_ORDER = 333, /* ORDER */ + SQL_OVER = 334, /* OVER */ + SQL_OUTER = 335, /* OUTER */ + SQL_RIGHT = 336, /* RIGHT */ + SQL_TABLE = 337, /* TABLE */ + SQL_UNION = 338, /* UNION */ + SQL_USING = 339, /* USING */ + SQL_WHERE = 340, /* WHERE */ + SQL_CALL = 341, /* CALL */ + SQL_CASE = 342, /* CASE */ + SQL_CHAR = 343, /* CHAR */ + SQL_COPY = 344, /* COPY */ + SQL_DATE = 345, /* DATE */ + SQL_DATETIME = 346, /* DATETIME */ + SQL_DESC = 347, /* DESC */ + SQL_DIV = 348, /* DIV */ + SQL_DROP = 349, /* DROP */ + SQL_ELSE = 350, /* ELSE */ + SQL_FILE = 351, /* FILE */ + SQL_FROM = 352, /* FROM */ + SQL_FULL = 353, /* FULL */ + SQL_HASH = 354, /* HASH */ + SQL_HINT = 355, /* HINT */ + SQL_INTO = 356, /* INTO */ + SQL_JOIN = 357, /* JOIN */ + SQL_LEFT = 358, /* LEFT */ + SQL_LIKE = 359, /* LIKE */ + SQL_LOAD = 360, /* LOAD */ + SQL_LONG = 361, /* LONG */ + SQL_NULL = 362, /* NULL */ + SQL_PARTITION = 363, /* PARTITION */ + SQL_PLAN = 364, /* PLAN */ + SQL_SHOW = 365, /* SHOW */ + SQL_TEXT = 366, /* TEXT */ + SQL_THEN = 367, /* THEN */ + SQL_TIME = 368, /* TIME */ + SQL_VIEW = 369, /* VIEW */ + SQL_WHEN = 370, /* WHEN */ + SQL_WITH = 371, /* WITH */ + SQL_ADD = 372, /* ADD */ + SQL_ALL = 373, /* ALL */ + SQL_AND = 374, /* AND */ + SQL_ASC = 375, /* ASC */ + SQL_END = 376, /* END */ + SQL_FOR = 377, /* FOR */ + SQL_INT = 378, /* INT */ + SQL_NOT = 379, /* NOT */ + SQL_OFF = 380, /* OFF */ + SQL_SET = 381, /* SET */ + SQL_TOP = 382, /* TOP */ + SQL_AS = 383, /* AS */ + SQL_BY = 384, /* BY */ + SQL_IF = 385, /* IF */ + SQL_IN = 386, /* IN */ + SQL_IS = 387, /* IS */ + SQL_OF = 388, /* OF */ + SQL_ON = 389, /* ON */ + SQL_OR = 390, /* OR */ + SQL_TO = 391, /* TO */ + SQL_NO = 392, /* NO */ + SQL_ARRAY = 393, /* ARRAY */ + SQL_CONCAT = 394, /* CONCAT */ + SQL_ILIKE = 395, /* ILIKE */ + SQL_MOD = 396, /* MOD */ + SQL_SECOND = 397, /* SECOND */ + SQL_MINUTE = 398, /* MINUTE */ + SQL_HOUR = 399, /* HOUR */ + SQL_DAY = 400, /* DAY */ + SQL_MONTH = 401, /* MONTH */ + SQL_YEAR = 402, /* YEAR */ + SQL_SECONDS = 403, /* SECONDS */ + SQL_MINUTES = 404, /* MINUTES */ + SQL_HOURS = 405, /* HOURS */ + SQL_DAYS = 406, /* DAYS */ + SQL_MONTHS = 407, /* MONTHS */ + SQL_YEARS = 408, /* YEARS */ + SQL_INTERVAL = 409, /* INTERVAL */ + SQL_TRUE = 410, /* TRUE */ + SQL_FALSE = 411, /* FALSE */ + SQL_BOOLEAN = 412, /* BOOLEAN */ + SQL_TRANSACTION = 413, /* TRANSACTION */ + SQL_BEGIN = 414, /* BEGIN */ + SQL_COMMIT = 415, /* COMMIT */ + SQL_ROLLBACK = 416, /* ROLLBACK */ + SQL_NOWAIT = 417, /* NOWAIT */ + SQL_SKIP = 418, /* SKIP */ + SQL_LOCKED = 419, /* LOCKED */ + SQL_SHARE = 420, /* SHARE */ + SQL_RANGE = 421, /* RANGE */ + SQL_ROWS = 422, /* ROWS */ + SQL_GROUPS = 423, /* GROUPS */ + SQL_UNBOUNDED = 424, /* UNBOUNDED */ + SQL_FOLLOWING = 425, /* FOLLOWING */ + SQL_PRECEDING = 426, /* PRECEDING */ + SQL_CURRENT_ROW = 427, /* CURRENT_ROW */ + SQL_UNIQUE = 428, /* UNIQUE */ + SQL_PRIMARY = 429, /* PRIMARY */ + SQL_FOREIGN = 430, /* FOREIGN */ + SQL_KEY = 431, /* KEY */ + SQL_REFERENCES = 432, /* REFERENCES */ + SQL_BITSHIFTLEFT = 433, /* BITSHIFTLEFT */ + SQL_BITSHIFTRIGHT = 434, /* BITSHIFTRIGHT */ + SQL_LOGICALAND = 435, /* LOGICALAND */ + SQL_LOGICALOR = 436, /* LOGICALOR */ + SQL_EQUALS = 437, /* EQUALS */ + SQL_NOTEQUALS = 438, /* NOTEQUALS */ + SQL_LESS = 439, /* LESS */ + SQL_GREATER = 440, /* GREATER */ + SQL_LESSEQ = 441, /* LESSEQ */ + SQL_GREATEREQ = 442, /* GREATEREQ */ + SQL_NOTNULL = 443, /* NOTNULL */ + SQL_UMINUS = 444 /* UMINUS */ + }; + typedef enum hsql_tokentype hsql_token_kind_t; +#endif + +/* Value type. */ +#if ! defined HSQL_STYPE && ! defined HSQL_STYPE_IS_DECLARED +union HSQL_STYPE +{ +#line 102 "bison_parser.y" + + // clang-format on + bool bval; + char* sval; + double fval; + int64_t ival; + uintmax_t uval; + + // statements + hsql::AlterStatement* alter_stmt; + hsql::CreateStatement* create_stmt; + hsql::DeleteStatement* delete_stmt; + hsql::DropStatement* drop_stmt; + hsql::ExecuteStatement* exec_stmt; + hsql::ExportStatement* export_stmt; + hsql::ImportStatement* import_stmt; + hsql::InsertStatement* insert_stmt; + hsql::PrepareStatement* prep_stmt; + hsql::SelectStatement* select_stmt; + hsql::ShowStatement* show_stmt; + hsql::SQLStatement* statement; + hsql::TransactionStatement* transaction_stmt; + hsql::UpdateStatement* update_stmt; + + hsql::Alias* alias_t; + hsql::AlterAction* alter_action_t; + hsql::ColumnConstraints* column_constraints_t; + hsql::ColumnDefinition* column_t; + hsql::ColumnType column_type_t; + hsql::ConstraintType column_constraint_t; + hsql::DatetimeField datetime_field; + hsql::DropColumnAction* drop_action_t; + hsql::Expr* expr; + hsql::FrameBound* frame_bound; + hsql::FrameDescription* frame_description; + hsql::FrameType frame_type; + hsql::GroupByDescription* group_t; + hsql::ImportType import_type_t; + hsql::JoinType join_type; + hsql::LimitDescription* limit; + hsql::LockingClause* locking_t; + hsql::OrderDescription* order; + hsql::OrderType order_type; + hsql::NullOrdering null_ordering_t; + hsql::ReferencesSpecification* references_spec_t; + hsql::SetOperation* set_operator_t; + hsql::TableConstraint* table_constraint_t; + hsql::TableElement* table_element_t; + hsql::TableName table_name; + hsql::TableRef* table; + hsql::UpdateClause* update_t; + hsql::WindowDescription* window_description; + hsql::WithDescription* with_description_t; + + std::vector* str_vec; + std::vector* expr_vec; + std::vector* order_vec; + std::vector* stmt_vec; + std::vector* table_element_vec; + std::vector* table_vec; + std::vector* update_vec; + std::vector* with_description_vec; + std::vector* locking_clause_vec; + + std::pair* ival_pair; + + hsql::RowLockMode lock_mode_t; + hsql::RowLockWaitPolicy lock_wait_policy_t; + + hsql::ImportExportOptions* import_export_option_t; + std::pair* csv_option_t; + + // clang-format off + +#line 361 "bison_parser.h" + +}; +typedef union HSQL_STYPE HSQL_STYPE; +# define HSQL_STYPE_IS_TRIVIAL 1 +# define HSQL_STYPE_IS_DECLARED 1 +#endif + +/* Location type. */ +#if ! defined HSQL_LTYPE && ! defined HSQL_LTYPE_IS_DECLARED +typedef struct HSQL_LTYPE HSQL_LTYPE; +struct HSQL_LTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +}; +# define HSQL_LTYPE_IS_DECLARED 1 +# define HSQL_LTYPE_IS_TRIVIAL 1 +#endif + + + +int hsql_parse (hsql::SQLParserResult* result, yyscan_t scanner); + +#endif /* !YY_HSQL_BISON_PARSER_H_INCLUDED */ diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.y b/extern/hyrise_sql_parser/src/parser/bison_parser.y new file mode 100644 index 0000000000..b7b897c446 --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/bison_parser.y @@ -0,0 +1,1547 @@ +// clang-format off +%{ + +/** + * bison_parser.y + * defines bison_parser.h + * outputs bison_parser.c + * + * Grammar File Spec: http://dinosaur.compilertools.net/bison/bison_6.html + * + */ +/********************************* + ** Section 1: C Declarations + *********************************/ + +// clang-format on +#include "bison_parser.h" +#include "flex_lexer.h" + +#include +#include + + using namespace hsql; + + int yyerror(YYLTYPE * llocp, SQLParserResult * result, yyscan_t scanner, const char* msg) { + result->setIsValid(false); + result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); + return 0; + } + // clang-format off +%} +// clang-format on +/********************************* + ** Section 2: Bison Parser Declarations + *********************************/ + +// Specify code that is included in the generated .h and .c files +// clang-format off +%code requires { +// %code requires block + +#include "../SQLParserResult.h" +#include "../sql/statements.h" +#include "parser_typedef.h" + +// Auto update column and line number +#define YY_USER_ACTION \ + yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column; \ + for (int i = 0; yytext[i] != '\0'; i++) { \ + yylloc->total_column++; \ + yylloc->string_length++; \ + if (yytext[i] == '\n') { \ + yylloc->last_line++; \ + yylloc->last_column = 0; \ + } else { \ + yylloc->last_column++; \ + } \ + } +} + +// Define the names of the created files (defined in Makefile) +// %output "bison_parser.cpp" +// %defines "bison_parser.h" + +// Raise error on shift/reduce conflict, i.e., when bison's one-token lookahead cannot decide on a single next state. +// Without this line, only a warning is printed. The line raises an error when the expected number of conflicts (0) +// does not occur. +%expect 0 + +// Tell bison to create a reentrant parser. +%define api.pure full + +// Prefix the parser +%define api.prefix {hsql_} +%define api.token.prefix {SQL_} + +%define parse.error verbose +%locations + +%initial-action { + // Initialize + @$.first_column = 0; + @$.last_column = 0; + @$.first_line = 0; + @$.last_line = 0; + @$.total_column = 0; + @$.string_length = 0; +}; + + +// Define additional parameters for yylex (http://www.gnu.org/software/bison/manual/html_node/Pure-Calling.html) +%lex-param { yyscan_t scanner } + +// Define additional parameters for yyparse +%parse-param { hsql::SQLParserResult* result } +%parse-param { yyscan_t scanner } + +/********************************* + ** Define all data-types (http://www.gnu.org/software/bison/manual/html_node/Union-Decl.html) + *********************************/ +%union { + // clang-format on + bool bval; + char* sval; + double fval; + int64_t ival; + uintmax_t uval; + + // statements + hsql::AlterStatement* alter_stmt; + hsql::CreateStatement* create_stmt; + hsql::DeleteStatement* delete_stmt; + hsql::DropStatement* drop_stmt; + hsql::ExecuteStatement* exec_stmt; + hsql::ExportStatement* export_stmt; + hsql::ImportStatement* import_stmt; + hsql::InsertStatement* insert_stmt; + hsql::PrepareStatement* prep_stmt; + hsql::SelectStatement* select_stmt; + hsql::ShowStatement* show_stmt; + hsql::SQLStatement* statement; + hsql::TransactionStatement* transaction_stmt; + hsql::UpdateStatement* update_stmt; + + hsql::Alias* alias_t; + hsql::AlterAction* alter_action_t; + hsql::ColumnConstraints* column_constraints_t; + hsql::ColumnDefinition* column_t; + hsql::ColumnType column_type_t; + hsql::ConstraintType column_constraint_t; + hsql::DatetimeField datetime_field; + hsql::DropColumnAction* drop_action_t; + hsql::Expr* expr; + hsql::FrameBound* frame_bound; + hsql::FrameDescription* frame_description; + hsql::FrameType frame_type; + hsql::GroupByDescription* group_t; + hsql::ImportType import_type_t; + hsql::JoinType join_type; + hsql::LimitDescription* limit; + hsql::LockingClause* locking_t; + hsql::OrderDescription* order; + hsql::OrderType order_type; + hsql::NullOrdering null_ordering_t; + hsql::ReferencesSpecification* references_spec_t; + hsql::SetOperation* set_operator_t; + hsql::TableConstraint* table_constraint_t; + hsql::TableElement* table_element_t; + hsql::TableName table_name; + hsql::TableRef* table; + hsql::UpdateClause* update_t; + hsql::WindowDescription* window_description; + hsql::WithDescription* with_description_t; + + std::vector* str_vec; + std::vector* expr_vec; + std::vector* order_vec; + std::vector* stmt_vec; + std::vector* table_element_vec; + std::vector* table_vec; + std::vector* update_vec; + std::vector* with_description_vec; + std::vector* locking_clause_vec; + + std::pair* ival_pair; + + hsql::RowLockMode lock_mode_t; + hsql::RowLockWaitPolicy lock_wait_policy_t; + + hsql::ImportExportOptions* import_export_option_t; + std::pair* csv_option_t; + + // clang-format off +} + +/********************************* + ** Destructor symbols + *********************************/ + +%destructor { } +%destructor { + free($$.name); + free($$.schema); +} +%destructor { + if ($$) { + for (auto ptr : *($$)) { + free(ptr); + } + } + delete ($$); +} +%destructor { free($$); } +%destructor { + if ($$) { + for (auto ptr : *($$)) { + delete ptr; + } + } + delete ($$); +} +%destructor { + free($$->second); + delete ($$); +} +%destructor { delete ($$); } <*> + + +/********************************* + ** Token Definition + *********************************/ +%token IDENTIFIER STRING +%token BIGINTVAL +%token FLOATVAL +%token INTVAL +%token NULLSAFEEQUALS + +/* SQL Keywords */ +%token DEALLOCATE PARAMETERS INTERSECT TEMPORARY TIMESTAMP +%token DISTINCT NVARCHAR RESTRICT TRUNCATE ANALYZE BETWEEN +%token CASCADE COLUMNS CONTROL DEFAULT EXECUTE EXPLAIN ENCODING +%token INTEGER NATURAL PREPARE SCHEMAS CHARACTER_VARYING REAL DECIMAL SMALLINT BIGINT +%token SPATIAL VARCHAR VIRTUAL DESCRIBE BEFORE COLUMN CREATE DELETE DIRECT +%token DOUBLE ESCAPE EXCEPT EXISTS EXTRACT CAST FORMAT GLOBAL HAVING IMPORT +%token INSERT ISNULL OFFSET RENAME SCHEMA SELECT SORTED +%token TABLES UNLOAD UPDATE VALUES AFTER ALTER CROSS +%token DELTA FLOAT GROUP INDEX INNER LIMIT LOCAL MERGE MINUS ORDER OVER +%token OUTER RIGHT TABLE UNION USING WHERE CALL CASE CHAR COPY DATE DATETIME +%token DESC DIV DROP ELSE FILE FROM FULL HASH HINT INTO JOIN +%token LEFT LIKE LOAD LONG NULL PARTITION PLAN SHOW TEXT THEN TIME +%token VIEW WHEN WITH ADD ALL AND ASC END FOR INT +%token NOT OFF SET TOP AS BY IF IN IS OF ON OR TO NO +%token ARRAY CONCAT ILIKE MOD SECOND MINUTE HOUR DAY MONTH YEAR +%token SECONDS MINUTES HOURS DAYS MONTHS YEARS INTERVAL +%token TRUE FALSE BOOLEAN +%token TRANSACTION BEGIN COMMIT ROLLBACK +%token NOWAIT SKIP LOCKED SHARE +%token RANGE ROWS GROUPS UNBOUNDED FOLLOWING PRECEDING CURRENT_ROW +%token UNIQUE PRIMARY FOREIGN KEY REFERENCES +%token BITSHIFTLEFT BITSHIFTRIGHT LOGICALAND LOGICALOR + +/********************************* + ** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html) + *********************************/ +%type statement_list +%type statement preparable_statement +%type execute_statement +%type transaction_statement +%type prepare_statement +%type select_statement select_with_paren select_no_paren select_clause select_within_set_operation select_within_set_operation_no_parentheses +%type import_statement +%type export_statement +%type create_statement +%type insert_statement +%type delete_statement truncate_statement +%type update_statement +%type drop_statement +%type alter_statement +%type show_statement +%type table_name +%type opt_index_name +%type file_path prepare_target_query +%type opt_frame_clause +%type frame_bound +%type frame_type +%type opt_window +%type opt_not_exists opt_exists opt_distinct opt_all +%type opt_decimal_specification +%type opt_time_precision +%type opt_join_type natural_join_type +%type opt_from_clause from_clause table_ref table_ref_atomic table_ref_name nonjoin_table_ref_atomic +%type
join_clause table_ref_name_no_alias +%type expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr extract_expr cast_expr +%type function_expr between_expr expr_alias param_expr +%type column_name literal int_literal num_literal string_literal bool_literal date_literal interval_literal +%type comp_expr opt_where join_condition opt_having case_expr case_list in_expr hint +%type array_expr array_index null_literal extended_literal casted_extended_literal +%type opt_limit opt_top +%type order_desc +%type opt_order_type +%type opt_null_ordering +%type datetime_field datetime_field_plural duration_field +%type column_def +%type table_elem +%type column_type +%type references_spec +%type table_constraint +%type update_clause +%type locking_clause +%type opt_group +%type opt_table_alias table_alias opt_alias alias +%type with_description +%type set_operator set_type +%type column_constraint +%type opt_column_constraints column_constraints +%type alter_action +%type drop_action +%type opt_row_lock_policy +%type row_lock_mode + +// ImportType is used for compatibility reasons +%type file_type +%type opt_import_export_options import_export_options +%type csv_option + +%type ident_commalist opt_column_list +%type expr_list select_list opt_extended_literal_list extended_literal_list hint_list opt_hints opt_partition +%type table_ref_commalist +%type opt_order order_list +%type opt_with_clause with_clause with_description_list +%type update_clause_commalist +%type table_elem_commalist +%type opt_locking_clause_list opt_locking_clause + +/****************************** + ** Token Precedence and Associativity + ** Precedence: lowest to highest + ******************************/ +%left OR LOGICALOR +%left AND LOGICALAND +%right NOT +%nonassoc '=' EQUALS NULLSAFEEQUALS NOTEQUALS LIKE ILIKE +%nonassoc '<' '>' LESS GREATER LESSEQ GREATEREQ + +%nonassoc NOTNULL +%nonassoc ISNULL +%nonassoc IS /* sets precedence for IS NULL, etc */ +%left '|' +%left '^' +%left '&' +%left BITSHIFTLEFT BITSHIFTRIGHT +%left '+' '-' +%left '*' '/' '%' MOD DIV +%left CONCAT + +/* Unary Operators */ +%right UMINUS +%left '[' ']' +%left '(' ')' +%left '.' +%left JOIN +%% +/********************************* + ** Section 3: Grammar Definition + *********************************/ + +// Defines our general input. +input : statement_list opt_semicolon { + for (SQLStatement* stmt : *$1) { + // Transfers ownership of the statement. + result->addStatement(stmt); + } + + unsigned param_id = 0; + for (void* param : yyloc.param_list) { + if (param) { + Expr* expr = (Expr*)param; + expr->ival = param_id; + result->addParameter(expr); + ++param_id; + } + } + delete $1; + }; + +// clang-format on +statement_list : statement { + $1->stringLength = yylloc.string_length; + yylloc.string_length = 0; + $$ = new std::vector(); + $$->push_back($1); +} +| statement_list ';' statement { + $3->stringLength = yylloc.string_length; + yylloc.string_length = 0; + $1->push_back($3); + $$ = $1; +}; + +statement : prepare_statement opt_hints { + $$ = $1; + $$->hints = $2; +} +| preparable_statement opt_hints { + $$ = $1; + $$->hints = $2; +} +| show_statement { $$ = $1; } +| import_statement { $$ = $1; } +| export_statement { $$ = $1; }; + +preparable_statement : select_statement { $$ = $1; } +| create_statement { $$ = $1; } +| insert_statement { $$ = $1; } +| delete_statement { $$ = $1; } +| truncate_statement { $$ = $1; } +| update_statement { $$ = $1; } +| drop_statement { $$ = $1; } +| alter_statement { $$ = $1; } +| execute_statement { $$ = $1; } +| transaction_statement { $$ = $1; }; + +/****************************** + * Hints + ******************************/ + +opt_hints : WITH HINT '(' hint_list ')' { $$ = $4; } +| /* empty */ { $$ = nullptr; }; + +hint_list : hint { + $$ = new std::vector(); + $$->push_back($1); +} +| hint_list ',' hint { + $1->push_back($3); + $$ = $1; +}; + +hint : IDENTIFIER { + $$ = Expr::make(kExprHint); + $$->name = $1; +} +| IDENTIFIER '(' extended_literal_list ')' { + $$ = Expr::make(kExprHint); + $$->name = $1; + $$->exprList = $3; +}; + +/****************************** + * Transaction Statement + ******************************/ + +transaction_statement : BEGIN opt_transaction_keyword { $$ = new TransactionStatement(kBeginTransaction); } +| ROLLBACK opt_transaction_keyword { $$ = new TransactionStatement(kRollbackTransaction); } +| COMMIT opt_transaction_keyword { $$ = new TransactionStatement(kCommitTransaction); }; + +opt_transaction_keyword : TRANSACTION | /* empty */ + ; + +/****************************** + * Prepared Statement + ******************************/ +prepare_statement : PREPARE IDENTIFIER FROM prepare_target_query { + $$ = new PrepareStatement(); + $$->name = $2; + $$->query = $4; +}; + +prepare_target_query : STRING; + +execute_statement : EXECUTE IDENTIFIER { + $$ = new ExecuteStatement(); + $$->name = $2; +} +| EXECUTE IDENTIFIER '(' opt_extended_literal_list ')' { + $$ = new ExecuteStatement(); + $$->name = $2; + $$->parameters = $4; +}; + +/****************************** + * Import Statement + * IMPORT FROM TBL FILE 'test/students.tbl' INTO students + * COPY students FROM 'test/students.tbl' + * COPY students FROM 'test/students.tbl' WITH (FORMAT TBL, ENCODING 'Dictionary') + ******************************/ +import_statement : IMPORT FROM file_type FILE file_path INTO table_name { + $$ = new ImportStatement($3); + $$->filePath = $5; + $$->schema = $7.schema; + $$->tableName = $7.name; +} +| COPY table_name FROM file_path opt_import_export_options opt_where { + $$ = new ImportStatement($5->format); + $$->filePath = $4; + $$->schema = $2.schema; + $$->tableName = $2.name; + $$->whereClause = $6; + if ($5->encoding) { + $$->encoding = $5->encoding; + $5->encoding = nullptr; + } + if ($5->csv_options) { + $$->csv_options = $5->csv_options; + $5->csv_options = nullptr; + } + delete $5; +}; + +file_type : IDENTIFIER { + if (strcasecmp($1, "csv") == 0) { + $$ = kImportCSV; + } else if (strcasecmp($1, "tbl") == 0) { + $$ = kImportTbl; + } else if (strcasecmp($1, "binary") == 0 || strcasecmp($1, "bin") == 0) { + $$ = kImportBinary; + } else { + free($1); + yyerror(&yyloc, result, scanner, "File type is unknown."); + YYERROR; + } + free($1); +}; + +file_path : STRING { $$ = $1; }; + +opt_import_export_options : WITH '(' import_export_options ')' { $$ = $3; } +| '(' import_export_options ')' { $$ = $2; } +| /* empty */ { $$ = new ImportExportOptions{}; }; + +import_export_options : import_export_options ',' FORMAT file_type { + if ($1->format != kImportAuto) { + delete $1; + yyerror(&yyloc, result, scanner, "File type must only be provided once."); + YYERROR; + } + if ($1->csv_options && $4 != kImportCSV && $4 != kImportAuto) { + delete $1; + yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); + YYERROR; + } + $1->format = $4; + $$ = $1; +} +| FORMAT file_type { + $$ = new ImportExportOptions{}; + $$->format = $2; +} +| import_export_options ',' ENCODING STRING { + if ($1->encoding) { + delete $1; + free($4); + yyerror(&yyloc, result, scanner, "Encoding type must only be provided once."); + YYERROR; + } + $1->encoding = $4; + $$ = $1; +} +| ENCODING STRING { + $$ = new ImportExportOptions{}; + $$->encoding = $2; +} +| import_export_options ',' csv_option { + if ($1->format != kImportAuto && $1->format != kImportCSV) { + delete $1; + free($3->second); + delete $3; + yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); + YYERROR; + } + + if ($1->csv_options == nullptr) { + $1->csv_options = new CsvOptions{}; + } + + if (!$1->csv_options->accept_csv_option($3)) { + free($3->second); + delete $3; + delete $1; + yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) cannot be provided more than once."); + YYERROR; + } + + delete $3; + $$ = $1; +} +| csv_option { + $$ = new ImportExportOptions{}; + $$->csv_options = new CsvOptions{}; + $$->csv_options->accept_csv_option($1); + + delete $1; +} + +csv_option : IDENTIFIER STRING { + if (strcasecmp($1, "DELIMITER") == 0) { + $$ = new std::pair(CsvOptionType::Delimiter, $2); + } else if (strcasecmp($1, "QUOTE") == 0) { + $$ = new std::pair(CsvOptionType::Quote, $2); + } else { + free($1); + free($2); + yyerror(&yyloc, result, scanner, "Unknown CSV option."); + YYERROR; + } + free($1); +} +| NULL STRING { $$ = new std::pair(CsvOptionType::Null, $2); } + +/****************************** + * Export Statement + * COPY students TO 'test/students.tbl' + * COPY students TO 'test/students.tbl' WITH (FORMAT BINARY, ENCODING 'Dictionary') + ******************************/ +export_statement : COPY table_name TO file_path opt_import_export_options { + $$ = new ExportStatement($5->format); + $$->filePath = $4; + $$->schema = $2.schema; + $$->tableName = $2.name; + if ($5->encoding) { + $$->encoding = $5->encoding; + $5->encoding = nullptr; + } + if ($5->csv_options) { + $$->csv_options = $5->csv_options; + $5->csv_options = nullptr; + } + delete $5; +} +| COPY select_with_paren TO file_path opt_import_export_options { + $$ = new ExportStatement($5->format); + $$->filePath = $4; + $$->select = $2; + if ($5->encoding) { + $$->encoding = $5->encoding; + $5->encoding = nullptr; + } + if ($5->csv_options) { + $$->csv_options = $5->csv_options; + $5->csv_options = nullptr; + } + delete $5; +}; + +/****************************** + * Show Statement + * SHOW TABLES; + ******************************/ + +show_statement : SHOW TABLES { $$ = new ShowStatement(kShowTables); } +| SHOW COLUMNS table_name { + $$ = new ShowStatement(kShowColumns); + $$->schema = $3.schema; + $$->name = $3.name; +} +| DESCRIBE table_name { + $$ = new ShowStatement(kShowColumns); + $$->schema = $2.schema; + $$->name = $2.name; +}; + +/****************************** + * Create Statement + * CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE) + * CREATE TABLE students FROM TBL FILE 'test/students.tbl' + ******************************/ +create_statement : CREATE TABLE opt_not_exists table_name FROM IDENTIFIER FILE file_path { + $$ = new CreateStatement(kCreateTableFromTbl); + $$->ifNotExists = $3; + $$->schema = $4.schema; + $$->tableName = $4.name; + if (strcasecmp($6, "tbl") != 0) { + free($6); + yyerror(&yyloc, result, scanner, "File type is unknown."); + YYERROR; + } + free($6); + $$->filePath = $8; +} +| CREATE TABLE opt_not_exists table_name '(' table_elem_commalist ')' { + $$ = new CreateStatement(kCreateTable); + $$->ifNotExists = $3; + $$->schema = $4.schema; + $$->tableName = $4.name; + $$->setColumnDefsAndConstraints($6); + delete $6; + if (result->errorMsg()) { + delete $$; + YYERROR; + } +} +| CREATE TABLE opt_not_exists table_name AS select_statement { + $$ = new CreateStatement(kCreateTable); + $$->ifNotExists = $3; + $$->schema = $4.schema; + $$->tableName = $4.name; + $$->select = $6; +} +| CREATE INDEX opt_not_exists opt_index_name ON table_name '(' ident_commalist ')' { + $$ = new CreateStatement(kCreateIndex); + $$->indexName = $4; + $$->ifNotExists = $3; + $$->tableName = $6.name; + $$->indexColumns = $8; +} +| CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement { + $$ = new CreateStatement(kCreateView); + $$->ifNotExists = $3; + $$->schema = $4.schema; + $$->tableName = $4.name; + $$->viewColumns = $5; + $$->select = $7; +}; + +opt_not_exists : IF NOT EXISTS { $$ = true; } +| /* empty */ { $$ = false; }; + +table_elem_commalist : table_elem { + $$ = new std::vector(); + $$->push_back($1); +} +| table_elem_commalist ',' table_elem { + $1->push_back($3); + $$ = $1; +}; + +table_elem : column_def { $$ = $1; } +| table_constraint { $$ = $1; }; + +column_def : IDENTIFIER column_type opt_column_constraints { + $$ = new ColumnDefinition($1, $2, $3->constraints, $3->references); + if (!$$->trySetNullableExplicit()) { + yyerror(&yyloc, result, scanner, ("Conflicting nullability constraints for " + std::string{$1}).c_str()); + } + delete $3; +}; + +column_type : BIGINT { $$ = ColumnType{DataType::BIGINT}; } +| BOOLEAN { $$ = ColumnType{DataType::BOOLEAN}; } +| CHAR '(' INTVAL ')' { $$ = ColumnType{DataType::CHAR, $3}; } +| CHARACTER_VARYING '(' INTVAL ')' { $$ = ColumnType{DataType::VARCHAR, $3}; } +| DATE { $$ = ColumnType{DataType::DATE}; }; +| DATETIME { $$ = ColumnType{DataType::DATETIME}; } +| DECIMAL opt_decimal_specification { + $$ = ColumnType{DataType::DECIMAL, 0, $2->first, $2->second}; + delete $2; +} +| DOUBLE { $$ = ColumnType{DataType::DOUBLE}; } +| FLOAT { $$ = ColumnType{DataType::FLOAT}; } +| INT { $$ = ColumnType{DataType::INT}; } +| INTEGER { $$ = ColumnType{DataType::INT}; } +| LONG { $$ = ColumnType{DataType::LONG}; } +| REAL { $$ = ColumnType{DataType::REAL}; } +| SMALLINT { $$ = ColumnType{DataType::SMALLINT}; } +| TEXT { $$ = ColumnType{DataType::TEXT}; } +| TIME opt_time_precision { $$ = ColumnType{DataType::TIME, 0, $2}; } +| TIMESTAMP { $$ = ColumnType{DataType::DATETIME}; } +| VARCHAR '(' INTVAL ')' { $$ = ColumnType{DataType::VARCHAR, $3}; }; + +opt_time_precision : '(' INTVAL ')' { $$ = $2; } +| /* empty */ { $$ = 0; }; + +opt_decimal_specification : '(' INTVAL ',' INTVAL ')' { $$ = new std::pair{$2, $4}; } +| '(' INTVAL ')' { $$ = new std::pair{$2, 0}; } +| /* empty */ { $$ = new std::pair{0, 0}; }; + +opt_column_constraints : column_constraints { $$ = $1; } +| /* empty */ { $$ = new ColumnConstraints(); }; + +column_constraints : column_constraint { + $$ = new ColumnConstraints(); + $$->constraints->insert($1); +} +| column_constraints column_constraint { + $1->constraints->insert($2); + $$ = $1; +} +| references_spec { + $$ = new ColumnConstraints(); + $$->constraints->insert(ConstraintType::ForeignKey); + $$->references->emplace_back($1); +} +| column_constraints references_spec { + // Multiple foreign keys for the same column could be possible, so we do not raise an error in that case. + // Think of foreign keys referenced on multiple levels (returned item references sold item references items). + $1->constraints->insert(ConstraintType::ForeignKey); + $1->references->emplace_back($2); + $$ = $1; +}; + +column_constraint : PRIMARY KEY { $$ = ConstraintType::PrimaryKey; } +| UNIQUE { $$ = ConstraintType::Unique; } +| NULL { $$ = ConstraintType::Null; } +| NOT NULL { $$ = ConstraintType::NotNull; }; + +table_constraint : PRIMARY KEY '(' ident_commalist ')' { $$ = new TableConstraint(ConstraintType::PrimaryKey, $4); } +| UNIQUE '(' ident_commalist ')' { $$ = new TableConstraint(ConstraintType::Unique, $3); } +| FOREIGN KEY '(' ident_commalist ')' references_spec { $$ = new ForeignKeyConstraint($4, $6); }; + +references_spec : REFERENCES table_name opt_column_list { $$ = new ReferencesSpecification($2.schema, $2.name, $3); }; + +/****************************** + * Drop Statement + * DROP TABLE students; + * DEALLOCATE PREPARE stmt; + ******************************/ + +drop_statement : DROP TABLE opt_exists table_name { + $$ = new DropStatement(kDropTable); + $$->ifExists = $3; + $$->schema = $4.schema; + $$->name = $4.name; +} +| DROP VIEW opt_exists table_name { + $$ = new DropStatement(kDropView); + $$->ifExists = $3; + $$->schema = $4.schema; + $$->name = $4.name; +} +| DEALLOCATE PREPARE IDENTIFIER { + $$ = new DropStatement(kDropPreparedStatement); + $$->ifExists = false; + $$->name = $3; +} + +| DROP INDEX opt_exists IDENTIFIER { + $$ = new DropStatement(kDropIndex); + $$->ifExists = $3; + $$->indexName = $4; +}; + +opt_exists : IF EXISTS { $$ = true; } +| /* empty */ { $$ = false; }; + +/****************************** + * ALTER Statement + * ALTER TABLE students DROP COLUMN name; + ******************************/ + +alter_statement : ALTER TABLE opt_exists table_name alter_action { + $$ = new AlterStatement($4.name, $5); + $$->ifTableExists = $3; + $$->schema = $4.schema; +}; + +alter_action : drop_action { $$ = $1; } + +drop_action : DROP COLUMN opt_exists IDENTIFIER { + $$ = new DropColumnAction($4); + $$->ifExists = $3; +}; + +/****************************** + * Delete Statement / Truncate statement + * DELETE FROM students WHERE grade > 3.0 + * DELETE FROM students <=> TRUNCATE students + ******************************/ +delete_statement : DELETE FROM table_name opt_where { + $$ = new DeleteStatement(); + $$->schema = $3.schema; + $$->tableName = $3.name; + $$->expr = $4; +}; + +truncate_statement : TRUNCATE table_name { + $$ = new DeleteStatement(); + $$->schema = $2.schema; + $$->tableName = $2.name; +}; + +/****************************** + * Insert Statement + * INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3) + * INSERT INTO employees SELECT * FROM stundents + ******************************/ +insert_statement : INSERT INTO table_name opt_column_list VALUES '(' extended_literal_list ')' { + $$ = new InsertStatement(kInsertValues); + $$->schema = $3.schema; + $$->tableName = $3.name; + $$->columns = $4; + $$->values = $7; +} +| INSERT INTO table_name opt_column_list select_no_paren { + $$ = new InsertStatement(kInsertSelect); + $$->schema = $3.schema; + $$->tableName = $3.name; + $$->columns = $4; + $$->select = $5; +}; + +opt_column_list : '(' ident_commalist ')' { $$ = $2; } +| /* empty */ { $$ = nullptr; }; + +/****************************** + * Update Statement + * UPDATE students SET grade = 1.3, name='Felix Fürstenberg' WHERE name = 'Max Mustermann'; + ******************************/ + +update_statement : UPDATE table_ref_name_no_alias SET update_clause_commalist opt_where { + $$ = new UpdateStatement(); + $$->table = $2; + $$->updates = $4; + $$->where = $5; +}; + +update_clause_commalist : update_clause { + $$ = new std::vector(); + $$->push_back($1); +} +| update_clause_commalist ',' update_clause { + $1->push_back($3); + $$ = $1; +}; + +update_clause : IDENTIFIER '=' expr { + $$ = new UpdateClause(); + $$->column = $1; + $$->value = $3; +}; + +/****************************** + * Select Statement + ******************************/ + +select_statement : opt_with_clause select_with_paren { + $$ = $2; + $$->withDescriptions = $1; +} +| opt_with_clause select_no_paren { + $$ = $2; + $$->withDescriptions = $1; +} +| opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit { + $$ = $2; + if ($$->setOperations == nullptr) { + $$->setOperations = new std::vector(); + } + $$->setOperations->push_back($3); + $$->setOperations->back()->nestedSelectStatement = $4; + $$->setOperations->back()->resultOrder = $5; + $$->setOperations->back()->resultLimit = $6; + $$->withDescriptions = $1; +}; + +select_within_set_operation : select_with_paren | select_within_set_operation_no_parentheses; + +select_within_set_operation_no_parentheses : select_clause { $$ = $1; } +| select_clause set_operator select_within_set_operation { + $$ = $1; + if ($$->setOperations == nullptr) { + $$->setOperations = new std::vector(); + } + $$->setOperations->push_back($2); + $$->setOperations->back()->nestedSelectStatement = $3; +}; + +select_with_paren : '(' select_no_paren ')' { $$ = $2; } +| '(' select_with_paren ')' { $$ = $2; }; + +select_no_paren : select_clause opt_order opt_limit opt_locking_clause { + $$ = $1; + $$->order = $2; + + // Limit could have been set by TOP. + if ($3) { + delete $$->limit; + $$->limit = $3; + } + + if ($4) { + $$->lockings = $4; + } +} +| select_clause set_operator select_within_set_operation opt_order opt_limit opt_locking_clause { + $$ = $1; + if ($$->setOperations == nullptr) { + $$->setOperations = new std::vector(); + } + $$->setOperations->push_back($2); + $$->setOperations->back()->nestedSelectStatement = $3; + $$->setOperations->back()->resultOrder = $4; + $$->setOperations->back()->resultLimit = $5; + $$->lockings = $6; +}; + +set_operator : set_type opt_all { + $$ = $1; + $$->isAll = $2; +}; + +set_type : UNION { + $$ = new SetOperation(); + $$->setType = SetType::kSetUnion; +} +| INTERSECT { + $$ = new SetOperation(); + $$->setType = SetType::kSetIntersect; +} +| EXCEPT { + $$ = new SetOperation(); + $$->setType = SetType::kSetExcept; +}; + +opt_all : ALL { $$ = true; } +| /* empty */ { $$ = false; }; + +select_clause : SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group opt_having { + $$ = new SelectStatement(); + $$->limit = $2; + $$->selectDistinct = $3; + $$->selectList = $4; + $$->fromTable = $5; + $$->whereClause = $6; + $$->groupBy = $7; + if ($7) { + $$->groupBy->having = $8; + } else { + $$->having = $8; + } +}; + +opt_distinct : DISTINCT { $$ = true; } +| /* empty */ { $$ = false; }; + +select_list : expr_list; + +opt_from_clause : from_clause { $$ = $1; } +| /* empty */ { $$ = nullptr; }; + +from_clause : FROM table_ref { $$ = $2; }; + +opt_where : WHERE expr { $$ = $2; } +| /* empty */ { $$ = nullptr; }; + +opt_group : GROUP BY expr_list { + $$ = new GroupByDescription(); + $$->columns = $3; +} +| /* empty */ { $$ = nullptr; }; + +opt_having : HAVING expr { $$ = $2; } +| /* empty */ { $$ = nullptr; }; + +opt_order : ORDER BY order_list { $$ = $3; } +| /* empty */ { $$ = nullptr; }; + +order_list : order_desc { + $$ = new std::vector(); + $$->push_back($1); +} +| order_list ',' order_desc { + $1->push_back($3); + $$ = $1; +}; + +order_desc : expr opt_order_type opt_null_ordering { $$ = new OrderDescription($2, $1, $3); }; + +opt_order_type : ASC { $$ = kOrderAsc; } +| DESC { $$ = kOrderDesc; } +| /* empty */ { $$ = kOrderAsc; }; + +opt_null_ordering : /* empty */ { $$ = NullOrdering::Undefined; } +| IDENTIFIER IDENTIFIER { + auto null_ordering = NullOrdering::Undefined; + if (strcasecmp($1, "nulls") == 0) { + if (strcasecmp($2, "first") == 0) { + null_ordering = NullOrdering::First; + } else if (strcasecmp($2, "last") == 0) { + null_ordering = NullOrdering::Last; + } + } + free($1); + free($2); + + if (null_ordering == NullOrdering::Undefined) { + yyerror(&yyloc, result, scanner, "Expected NULLS FIRST or NULLS LAST ordering."); + YYERROR; + } + + $$ = null_ordering; +}; + +// TODO: TOP and LIMIT can take more than just int literals. + +opt_top : TOP int_literal { $$ = new LimitDescription($2, nullptr); } +| /* empty */ { $$ = nullptr; }; + +opt_limit : LIMIT expr { $$ = new LimitDescription($2, nullptr); } +| OFFSET expr { $$ = new LimitDescription(nullptr, $2); } +| LIMIT expr OFFSET expr { $$ = new LimitDescription($2, $4); } +| LIMIT ALL { $$ = new LimitDescription(nullptr, nullptr); } +| LIMIT ALL OFFSET expr { $$ = new LimitDescription(nullptr, $4); } +| /* empty */ { $$ = nullptr; }; + +/****************************** + * Expressions + ******************************/ +expr_list : expr_alias { + $$ = new std::vector(); + $$->push_back($1); +} +| expr_list ',' expr_alias { + $1->push_back($3); + $$ = $1; +}; + +// Literals, casted literals, and negative numbers/intervals are allowed for INSERT and EXECUTE statements or hints. +opt_extended_literal_list : extended_literal_list { $$ = $1; } +| /* empty */ { $$ = nullptr; }; + +extended_literal_list : casted_extended_literal { + $$ = new std::vector(); + $$->push_back($1); +} +| extended_literal_list ',' casted_extended_literal { + $1->push_back($3); + $$ = $1; +}; + +casted_extended_literal : extended_literal | CAST '(' extended_literal AS column_type ')' { + $$ = Expr::makeCast($3, $5); +}; + +extended_literal : literal { + if ($1->type == ExprType::kExprParameter) { + delete $1; + yyerror(&yyloc, result, scanner, "Parameter ? is not a valid literal."); + YYERROR; + } + $$ = $1; +} +| '-' num_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus, $2); }; +| '-' interval_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus, $2); }; + +expr_alias : expr opt_alias { + $$ = $1; + if ($2) { + $$->alias = $2->name; + $2->name = nullptr; + delete $2; + } +}; + +expr : operand | between_expr | logic_expr | exists_expr | in_expr; + +operand : '(' expr ')' { $$ = $2; } +| array_index | scalar_expr | unary_expr | binary_expr | case_expr | function_expr | extract_expr | cast_expr | + array_expr | '(' select_no_paren ')' { + $$ = Expr::makeSelect($2); +}; + +scalar_expr : column_name | literal; + +unary_expr : '-' operand { $$ = Expr::makeOpUnary(kOpUnaryMinus, $2); } +| NOT operand { $$ = Expr::makeOpUnary(kOpNot, $2); } +| operand ISNULL { $$ = Expr::makeOpUnary(kOpIsNull, $1); } +| operand IS NULL { $$ = Expr::makeOpUnary(kOpIsNull, $1); } +| operand IS NOT NULL { $$ = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, $1)); }; + +binary_expr : comp_expr | operand '-' operand { $$ = Expr::makeOpBinary($1, kOpMinus, $3); } +| operand '+' operand { $$ = Expr::makeOpBinary($1, kOpPlus, $3); } +| operand '/' operand { $$ = Expr::makeOpBinary($1, kOpSlash, $3); } +| operand '*' operand { $$ = Expr::makeOpBinary($1, kOpAsterisk, $3); } +| operand '%' operand { $$ = Expr::makeOpBinary($1, kOpPercentage, $3); } +| operand MOD operand { $$ = Expr::makeOpBinary($1, kOpMod, $3); } +| operand DIV operand { $$ = Expr::makeOpBinary($1, kOpDiv, $3); } +| operand '^' operand { $$ = Expr::makeOpBinary($1, kOpBitXor, $3); } +| operand '&' operand { $$ = Expr::makeOpBinary($1, kOpBitAnd, $3); } +| operand '|' operand { $$ = Expr::makeOpBinary($1, kOpBitOr, $3); } +| operand BITSHIFTLEFT operand { $$ = Expr::makeOpBinary($1, kOpBitShiftLeft, $3); } +| operand BITSHIFTRIGHT operand { $$ = Expr::makeOpBinary($1, kOpBitShiftRight, $3); } +| operand LIKE operand { $$ = Expr::makeOpBinary($1, kOpLike, $3); } +| operand NOT LIKE operand { $$ = Expr::makeOpBinary($1, kOpNotLike, $4); } +| operand ILIKE operand { $$ = Expr::makeOpBinary($1, kOpILike, $3); } +| operand CONCAT operand { $$ = Expr::makeOpBinary($1, kOpConcat, $3); }; + +logic_expr : expr AND expr { $$ = Expr::makeOpBinary($1, kOpAnd, $3); } +| expr LOGICALAND expr { $$ = Expr::makeOpBinary($1, kOpAnd, $3); } +| expr OR expr { $$ = Expr::makeOpBinary($1, kOpOr, $3); } +| expr LOGICALOR expr { $$ = Expr::makeOpBinary($1, kOpOr, $3); }; + +in_expr : operand IN '(' expr_list ')' { $$ = Expr::makeInOperator($1, $4); } +| operand NOT IN '(' expr_list ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeInOperator($1, $5)); } +| operand IN '(' select_no_paren ')' { $$ = Expr::makeInOperator($1, $4); } +| operand NOT IN '(' select_no_paren ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeInOperator($1, $5)); }; + +// CASE grammar based on: flex & bison by John Levine +// https://www.safaribooksonline.com/library/view/flex-bison/9780596805418/ch04.html#id352665 +case_expr : CASE expr case_list END { $$ = Expr::makeCase($2, $3, nullptr); } +| CASE expr case_list ELSE expr END { $$ = Expr::makeCase($2, $3, $5); } +| CASE case_list END { $$ = Expr::makeCase(nullptr, $2, nullptr); } +| CASE case_list ELSE expr END { $$ = Expr::makeCase(nullptr, $2, $4); }; + +case_list : WHEN expr THEN expr { $$ = Expr::makeCaseList(Expr::makeCaseListElement($2, $4)); } +| case_list WHEN expr THEN expr { $$ = Expr::caseListAppend($1, Expr::makeCaseListElement($3, $5)); }; + +exists_expr : EXISTS '(' select_no_paren ')' { $$ = Expr::makeExists($3); } +| NOT EXISTS '(' select_no_paren ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeExists($4)); }; + +comp_expr : operand '=' operand { $$ = Expr::makeOpBinary($1, kOpEquals, $3); } +| operand EQUALS operand { $$ = Expr::makeOpBinary($1, kOpEquals, $3); } +| operand NULLSAFEEQUALS operand { $$ = Expr::makeOpBinary($1, kOpNullSafeEquals, $3); } +| operand NOTEQUALS operand { $$ = Expr::makeOpBinary($1, kOpNotEquals, $3); } +| operand '<' operand { $$ = Expr::makeOpBinary($1, kOpLess, $3); } +| operand '>' operand { $$ = Expr::makeOpBinary($1, kOpGreater, $3); } +| operand LESSEQ operand { $$ = Expr::makeOpBinary($1, kOpLessEq, $3); } +| operand GREATEREQ operand { $$ = Expr::makeOpBinary($1, kOpGreaterEq, $3); }; + +// `function_expr is used for window functions, aggregate expressions, and functions calls because we run into shift/ +// reduce conflicts when splitting them. +function_expr : IDENTIFIER '(' ')' opt_window { $$ = Expr::makeFunctionRef($1, new std::vector(), false, $4); } +| IDENTIFIER '(' opt_distinct expr_list ')' opt_window { $$ = Expr::makeFunctionRef($1, $4, $3, $6); } +| IDENTIFIER '.' IDENTIFIER '(' ')' opt_window { $$ = Expr::makeFunctionRef($3, $1, new std::vector(), false, $6); } +| IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window { $$ = Expr::makeFunctionRef($3, $1, $6, $5, $8); }; + +// Window function expressions, based on https://www.postgresql.org/docs/15/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS +// We do not support named windows, collations and exclusions (for simplicity) and filters (not part of the SQL standard). +opt_window : OVER '(' opt_partition opt_order opt_frame_clause ')' { $$ = new WindowDescription($3, $4, $5); } +| /* empty */ { $$ = nullptr; }; + +opt_partition : PARTITION BY expr_list { $$ = $3; } +| /* empty */ { $$ = nullptr; }; + +// We use the Postgres default if the frame end or the whole frame clause is omitted. "If `frame_end` is omitted, the +// end defaults to `CURRENT ROW`. [...] The default framing option is `RANGE UNBOUNDED PRECEDING`, which is the same as +// `RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`." +opt_frame_clause : frame_type frame_bound { $$ = new FrameDescription{$1, $2, new FrameBound{0, kCurrentRow, false}}; } +| frame_type BETWEEN frame_bound AND frame_bound { $$ = new FrameDescription{$1, $3, $5}; } +| /* empty */ { + $$ = new FrameDescription{kRange, new FrameBound{0, kPreceding, true}, new FrameBound{0, kCurrentRow, false}}; +}; + +frame_type : RANGE { $$ = kRange; } +| ROWS { $$ = kRows; } +| GROUPS { $$ = kGroups; }; + +frame_bound : UNBOUNDED PRECEDING { $$ = new FrameBound{0, kPreceding, true}; } +| INTVAL PRECEDING { $$ = new FrameBound{$1, kPreceding, false}; } +| UNBOUNDED FOLLOWING { $$ = new FrameBound{0, kFollowing, true}; } +| INTVAL FOLLOWING { $$ = new FrameBound{$1, kFollowing, false}; } +| CURRENT_ROW { $$ = new FrameBound{0, kCurrentRow, false}; }; + +extract_expr : EXTRACT '(' datetime_field FROM expr ')' { $$ = Expr::makeExtract($3, $5); }; + +cast_expr : CAST '(' expr AS column_type ')' { $$ = Expr::makeCast($3, $5); }; + +datetime_field : SECOND { $$ = kDatetimeSecond; } +| MINUTE { $$ = kDatetimeMinute; } +| HOUR { $$ = kDatetimeHour; } +| DAY { $$ = kDatetimeDay; } +| MONTH { $$ = kDatetimeMonth; } +| YEAR { $$ = kDatetimeYear; }; + +datetime_field_plural : SECONDS { $$ = kDatetimeSecond; } +| MINUTES { $$ = kDatetimeMinute; } +| HOURS { $$ = kDatetimeHour; } +| DAYS { $$ = kDatetimeDay; } +| MONTHS { $$ = kDatetimeMonth; } +| YEARS { $$ = kDatetimeYear; }; + +duration_field : datetime_field | datetime_field_plural; + +array_expr : ARRAY '[' expr_list ']' { $$ = Expr::makeArray($3); }; + +array_index : operand '[' int_literal ']' { $$ = Expr::makeArrayIndex($1, $3->ival); }; + +between_expr : operand BETWEEN operand AND operand { $$ = Expr::makeBetween($1, $3, $5); } +| operand NOT BETWEEN operand AND operand { $$ = Expr::makeOpUnary(kOpNot, Expr::makeBetween($1, $4, $6)); }; + +column_name : IDENTIFIER { $$ = Expr::makeColumnRef($1); } +| OFFSET { $$ = Expr::makeColumnRef(strdup("offset")); } +| IDENTIFIER '.' IDENTIFIER { $$ = Expr::makeColumnRef($1, $3); } +| IDENTIFIER '.' IDENTIFIER '.' IDENTIFIER { $$ = Expr::makeColumnRef($1, $3, $5); } +| '*' { $$ = Expr::makeStar(); } +| IDENTIFIER '.' '*' { $$ = Expr::makeStar($1); }; + +literal : string_literal | bool_literal | num_literal | null_literal | date_literal | interval_literal | param_expr; + +string_literal : STRING { $$ = Expr::makeLiteral($1); }; + +bool_literal : TRUE { $$ = Expr::makeLiteral(true); } +| FALSE { $$ = Expr::makeLiteral(false); }; + +num_literal : FLOATVAL { $$ = Expr::makeLiteral($1); } +| int_literal; + +int_literal : INTVAL { $$ = Expr::makeLiteral($1); } +| BIGINTVAL { $$ = Expr::makeLiteralIntString($1); }; + +null_literal : NULL { $$ = Expr::makeNullLiteral(); }; + +date_literal : DATE STRING { + int day{0}, month{0}, year{0}, chars_parsed{0}; + // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character + if (sscanf($2, "%4d-%2d-%2d%n", &day, &month, &year, &chars_parsed) != 3 || $2[chars_parsed] != 0) { + free($2); + yyerror(&yyloc, result, scanner, "Found incorrect date format. Expected format: YYYY-MM-DD"); + YYERROR; + } + $$ = Expr::makeDateLiteral($2); +}; + +interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2); } +| INTERVAL STRING datetime_field { + int duration{0}, chars_parsed{0}; + // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character + if (sscanf($2, "%d%n", &duration, &chars_parsed) != 1 || $2[chars_parsed] != 0) { + free($2); + yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER"); + YYERROR; + } + free($2); + $$ = Expr::makeIntervalLiteral(duration, $3); +} +| INTERVAL STRING { + int duration{0}, chars_parsed{0}; + // 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte + char unit_string[8]; + // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character + if (sscanf($2, "%d %7s%n", &duration, unit_string, &chars_parsed) != 2 || $2[chars_parsed] != 0) { + free($2); + yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER INTERVAL_QUALIIFIER"); + YYERROR; + } + free($2); + + DatetimeField unit; + if (strcasecmp(unit_string, "second") == 0 || strcasecmp(unit_string, "seconds") == 0) { + unit = kDatetimeSecond; + } else if (strcasecmp(unit_string, "minute") == 0 || strcasecmp(unit_string, "minutes") == 0) { + unit = kDatetimeMinute; + } else if (strcasecmp(unit_string, "hour") == 0 || strcasecmp(unit_string, "hours") == 0) { + unit = kDatetimeHour; + } else if (strcasecmp(unit_string, "day") == 0 || strcasecmp(unit_string, "days") == 0) { + unit = kDatetimeDay; + } else if (strcasecmp(unit_string, "month") == 0 || strcasecmp(unit_string, "months") == 0) { + unit = kDatetimeMonth; + } else if (strcasecmp(unit_string, "year") == 0 || strcasecmp(unit_string, "years") == 0) { + unit = kDatetimeYear; + } else { + yyerror(&yyloc, result, scanner, "Interval qualifier is unknown."); + YYERROR; + } + $$ = Expr::makeIntervalLiteral(duration, unit); +}; + +param_expr : '?' { + $$ = Expr::makeParameter(yylloc.total_column); + $$->ival2 = yyloc.param_list.size(); + yyloc.param_list.push_back($$); +}; + +/****************************** + * Table + ******************************/ +table_ref : table_ref_atomic | table_ref_commalist ',' table_ref_atomic { + $1->push_back($3); + auto tbl = new TableRef(kTableCrossProduct); + tbl->list = $1; + $$ = tbl; +}; + +table_ref_atomic : nonjoin_table_ref_atomic | join_clause; + +nonjoin_table_ref_atomic : table_ref_name | '(' select_statement ')' opt_table_alias { + auto tbl = new TableRef(kTableSelect); + tbl->select = $2; + tbl->alias = $4; + $$ = tbl; +}; + +table_ref_commalist : table_ref_atomic { + $$ = new std::vector(); + $$->push_back($1); +} +| table_ref_commalist ',' table_ref_atomic { + $1->push_back($3); + $$ = $1; +}; + +table_ref_name : table_name opt_table_alias { + auto tbl = new TableRef(kTableName); + tbl->schema = $1.schema; + tbl->name = $1.name; + tbl->alias = $2; + $$ = tbl; +}; + +table_ref_name_no_alias : table_name { + $$ = new TableRef(kTableName); + $$->schema = $1.schema; + $$->name = $1.name; +}; + +table_name : IDENTIFIER { + $$.schema = nullptr; + $$.name = $1; +} +| IDENTIFIER '.' IDENTIFIER { + $$.schema = $1; + $$.name = $3; +}; + +opt_index_name : IDENTIFIER { $$ = $1; } +| /* empty */ { $$ = nullptr; }; + +table_alias : alias | AS IDENTIFIER '(' ident_commalist ')' { $$ = new Alias($2, $4); }; + +opt_table_alias : table_alias | /* empty */ { $$ = nullptr; }; + +alias : AS IDENTIFIER { $$ = new Alias($2); } +| IDENTIFIER { $$ = new Alias($1); }; + +opt_alias : alias | /* empty */ { $$ = nullptr; }; + +/****************************** + * Row Locking Descriptions + ******************************/ + +opt_locking_clause : opt_locking_clause_list { $$ = $1; } +| /* empty */ { $$ = nullptr; }; + +opt_locking_clause_list : locking_clause { + $$ = new std::vector(); + $$->push_back($1); +} +| opt_locking_clause_list locking_clause { + $1->push_back($2); + $$ = $1; +}; + +locking_clause : FOR row_lock_mode opt_row_lock_policy { + $$ = new LockingClause(); + $$->rowLockMode = $2; + $$->rowLockWaitPolicy = $3; + $$->tables = nullptr; +} +| FOR row_lock_mode OF ident_commalist opt_row_lock_policy { + $$ = new LockingClause(); + $$->rowLockMode = $2; + $$->tables = $4; + $$->rowLockWaitPolicy = $5; +}; + +row_lock_mode : UPDATE { $$ = RowLockMode::ForUpdate; } +| NO KEY UPDATE { $$ = RowLockMode::ForNoKeyUpdate; } +| SHARE { $$ = RowLockMode::ForShare; } +| KEY SHARE { $$ = RowLockMode::ForKeyShare; }; + +opt_row_lock_policy : SKIP LOCKED { $$ = RowLockWaitPolicy::SkipLocked; } +| NOWAIT { $$ = RowLockWaitPolicy::NoWait; } +| /* empty */ { $$ = RowLockWaitPolicy::None; }; + +/****************************** + * With Descriptions + ******************************/ + +opt_with_clause : with_clause | /* empty */ { $$ = nullptr; }; + +with_clause : WITH with_description_list { $$ = $2; }; + +with_description_list : with_description { + $$ = new std::vector(); + $$->push_back($1); +} +| with_description_list ',' with_description { + $1->push_back($3); + $$ = $1; +}; + +with_description : IDENTIFIER AS select_with_paren { + $$ = new WithDescription(); + $$->alias = $1; + $$->select = $3; +}; + +/****************************** + * Join Statements + ******************************/ + +join_clause : table_ref_atomic NATURAL JOIN nonjoin_table_ref_atomic { + $$ = new TableRef(kTableJoin); + $$->join = new JoinDefinition(); + $$->join->type = kJoinNatural; + $$->join->natural = true; + $$->join->left = $1; + $$->join->right = $4; +} +| table_ref_atomic NATURAL natural_join_type JOIN nonjoin_table_ref_atomic { + $$ = new TableRef(kTableJoin); + $$->join = new JoinDefinition(); + $$->join->type = (JoinType)$3; + $$->join->natural = true; + $$->join->left = $1; + $$->join->right = $5; +} +| table_ref_atomic CROSS JOIN nonjoin_table_ref_atomic { + $$ = new TableRef(kTableJoin); + $$->join = new JoinDefinition(); + $$->join->type = kJoinCross; + $$->join->left = $1; + $$->join->right = $4; +} +| table_ref_atomic opt_join_type JOIN table_ref_atomic ON join_condition { + $$ = new TableRef(kTableJoin); + $$->join = new JoinDefinition(); + $$->join->type = (JoinType)$2; + $$->join->left = $1; + $$->join->right = $4; + $$->join->condition = $6; +} +| table_ref_atomic opt_join_type JOIN table_ref_atomic USING '(' ident_commalist ')' { + $$ = new TableRef(kTableJoin); + $$->join = new JoinDefinition(); + $$->join->type = $2; + $$->join->left = $1; + $$->join->right = $4; + $$->join->namedColumns = $7; +}; + +opt_join_type : INNER { $$ = kJoinInner; } +| LEFT OUTER { $$ = kJoinLeft; } +| LEFT { $$ = kJoinLeft; } +| RIGHT OUTER { $$ = kJoinRight; } +| RIGHT { $$ = kJoinRight; } +| FULL OUTER { $$ = kJoinFull; } +| OUTER { $$ = kJoinFull; } +| FULL { $$ = kJoinFull; } +| /* empty, default */ { $$ = kJoinInner; }; + +natural_join_type : INNER { $$ = kJoinInner; } +| LEFT OUTER { $$ = kJoinLeft; } +| LEFT { $$ = kJoinLeft; } +| RIGHT OUTER { $$ = kJoinRight; } +| RIGHT { $$ = kJoinRight; } +| FULL OUTER { $$ = kJoinFull; } +| FULL { $$ = kJoinFull; }; + +join_condition : expr; + +/****************************** + * Misc + ******************************/ + +opt_semicolon : ';' | /* empty */ + ; + +ident_commalist : IDENTIFIER { + $$ = new std::vector(); + $$->push_back($1); +} +| ident_commalist ',' IDENTIFIER { + $1->push_back($3); + $$ = $1; +}; + +// clang-format off +%% + +/********************************* + ** Section 4: Additional C code + *********************************/ + +/* empty */ + + // clang-format on diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp b/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp new file mode 100644 index 0000000000..6b8d0b3f21 --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp @@ -0,0 +1,5720 @@ +#line 1 "flex_lexer.cpp" + +#line 3 "flex_lexer.cpp" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +#ifdef yy_create_buffer +#define hsql__create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer hsql__create_buffer +#endif + +#ifdef yy_delete_buffer +#define hsql__delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer hsql__delete_buffer +#endif + +#ifdef yy_scan_buffer +#define hsql__scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer hsql__scan_buffer +#endif + +#ifdef yy_scan_string +#define hsql__scan_string_ALREADY_DEFINED +#else +#define yy_scan_string hsql__scan_string +#endif + +#ifdef yy_scan_bytes +#define hsql__scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes hsql__scan_bytes +#endif + +#ifdef yy_init_buffer +#define hsql__init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer hsql__init_buffer +#endif + +#ifdef yy_flush_buffer +#define hsql__flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer hsql__flush_buffer +#endif + +#ifdef yy_load_buffer_state +#define hsql__load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state hsql__load_buffer_state +#endif + +#ifdef yy_switch_to_buffer +#define hsql__switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer hsql__switch_to_buffer +#endif + +#ifdef yypush_buffer_state +#define hsql_push_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state hsql_push_buffer_state +#endif + +#ifdef yypop_buffer_state +#define hsql_pop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state hsql_pop_buffer_state +#endif + +#ifdef yyensure_buffer_stack +#define hsql_ensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack hsql_ensure_buffer_stack +#endif + +#ifdef yylex +#define hsql_lex_ALREADY_DEFINED +#else +#define yylex hsql_lex +#endif + +#ifdef yyrestart +#define hsql_restart_ALREADY_DEFINED +#else +#define yyrestart hsql_restart +#endif + +#ifdef yylex_init +#define hsql_lex_init_ALREADY_DEFINED +#else +#define yylex_init hsql_lex_init +#endif + +#ifdef yylex_init_extra +#define hsql_lex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra hsql_lex_init_extra +#endif + +#ifdef yylex_destroy +#define hsql_lex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy hsql_lex_destroy +#endif + +#ifdef yyget_debug +#define hsql_get_debug_ALREADY_DEFINED +#else +#define yyget_debug hsql_get_debug +#endif + +#ifdef yyset_debug +#define hsql_set_debug_ALREADY_DEFINED +#else +#define yyset_debug hsql_set_debug +#endif + +#ifdef yyget_extra +#define hsql_get_extra_ALREADY_DEFINED +#else +#define yyget_extra hsql_get_extra +#endif + +#ifdef yyset_extra +#define hsql_set_extra_ALREADY_DEFINED +#else +#define yyset_extra hsql_set_extra +#endif + +#ifdef yyget_in +#define hsql_get_in_ALREADY_DEFINED +#else +#define yyget_in hsql_get_in +#endif + +#ifdef yyset_in +#define hsql_set_in_ALREADY_DEFINED +#else +#define yyset_in hsql_set_in +#endif + +#ifdef yyget_out +#define hsql_get_out_ALREADY_DEFINED +#else +#define yyget_out hsql_get_out +#endif + +#ifdef yyset_out +#define hsql_set_out_ALREADY_DEFINED +#else +#define yyset_out hsql_set_out +#endif + +#ifdef yyget_leng +#define hsql_get_leng_ALREADY_DEFINED +#else +#define yyget_leng hsql_get_leng +#endif + +#ifdef yyget_text +#define hsql_get_text_ALREADY_DEFINED +#else +#define yyget_text hsql_get_text +#endif + +#ifdef yyget_lineno +#define hsql_get_lineno_ALREADY_DEFINED +#else +#define yyget_lineno hsql_get_lineno +#endif + +#ifdef yyset_lineno +#define hsql_set_lineno_ALREADY_DEFINED +#else +#define yyset_lineno hsql_set_lineno +#endif + +#ifdef yyget_column +#define hsql_get_column_ALREADY_DEFINED +#else +#define yyget_column hsql_get_column +#endif + +#ifdef yyset_column +#define hsql_set_column_ALREADY_DEFINED +#else +#define yyset_column hsql_set_column +#endif + +#ifdef yywrap +#define hsql_wrap_ALREADY_DEFINED +#else +#define yywrap hsql_wrap +#endif + +#ifdef yyget_lval +#define hsql_get_lval_ALREADY_DEFINED +#else +#define yyget_lval hsql_get_lval +#endif + +#ifdef yyset_lval +#define hsql_set_lval_ALREADY_DEFINED +#else +#define yyset_lval hsql_set_lval +#endif + +#ifdef yyget_lloc +#define hsql_get_lloc_ALREADY_DEFINED +#else +#define yyget_lloc hsql_get_lloc +#endif + +#ifdef yyset_lloc +#define hsql_set_lloc_ALREADY_DEFINED +#else +#define yyset_lloc hsql_set_lloc +#endif + +#ifdef yyalloc +#define hsql_alloc_ALREADY_DEFINED +#else +#define yyalloc hsql_alloc +#endif + +#ifdef yyrealloc +#define hsql_realloc_ALREADY_DEFINED +#else +#define yyrealloc hsql_realloc +#endif + +#ifdef yyfree +#define hsql_free_ALREADY_DEFINED +#else +#define yyfree hsql_free +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +typedef uint64_t flex_uint64_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* begin standard C++ headers. */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin , yyscanner ) +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + yy_size_t yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart ( FILE *input_file , yyscan_t yyscanner ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); +void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); +void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); +void yypop_buffer_state ( yyscan_t yyscanner ); + +static void yyensure_buffer_stack ( yyscan_t yyscanner ); +static void yy_load_buffer_state ( yyscan_t yyscanner ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) + +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); + +void *yyalloc ( yy_size_t , yyscan_t yyscanner ); +void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); +void yyfree ( void * , yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define hsql_wrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP +typedef flex_uint8_t YY_CHAR; + +typedef int yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); +static int yy_get_next_buffer ( yyscan_t yyscanner ); +static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (yy_size_t) (yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; +#define YY_NUM_RULES 197 +#define YY_END_OF_BUFFER 198 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static const flex_int16_t yy_accept[1406] = + { 0, + 0, 0, 194, 194, 2, 2, 198, 196, 4, 4, + 196, 196, 183, 183, 192, 183, 183, 188, 183, 183, + 183, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 196, 183, 194, 195, 2, + 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, + 175, 0, 179, 1, 0, 185, 184, 188, 0, 181, + + 177, 176, 173, 178, 182, 191, 191, 191, 191, 191, + 191, 12, 191, 191, 191, 19, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 74, 191, 191, 77, 86, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 105, 191, 191, 110, 113, + 114, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 151, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 0, 180, 194, 193, 2, 2, 2, 2, 2, + + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 189, 0, 0, 184, 0, 0, 186, 174, 5, 191, + 7, 191, 191, 10, 191, 13, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 34, 191, 191, 191, 191, 191, 191, 191, + 45, 191, 191, 191, 191, 50, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 61, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 81, 191, 191, 89, 191, 191, 191, 191, 191, 191, + 191, 191, 101, 191, 191, 106, 191, 191, 191, 111, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + + 191, 191, 191, 191, 191, 191, 191, 191, 137, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 152, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 190, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 185, 0, 184, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 20, 191, 22, 23, + 24, 191, 191, 191, 29, 191, 191, 191, 32, 35, + + 191, 191, 191, 191, 191, 41, 191, 191, 191, 47, + 48, 191, 191, 191, 191, 191, 191, 191, 191, 58, + 191, 191, 191, 191, 64, 65, 191, 191, 69, 191, + 71, 72, 191, 191, 191, 191, 191, 191, 85, 191, + 88, 90, 91, 191, 93, 191, 191, 96, 191, 191, + 191, 191, 191, 108, 191, 191, 191, 191, 117, 191, + 191, 120, 191, 191, 191, 191, 125, 191, 191, 191, + 191, 191, 131, 191, 191, 191, 191, 139, 140, 191, + 191, 191, 191, 191, 147, 148, 149, 191, 154, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 164, 191, + + 166, 191, 168, 169, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 6, 8, 191, + 11, 191, 15, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 31, 191, 191, 191, 191, 191, 191, 40, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 57, 59, 191, 191, 191, 191, 67, 191, 73, + 75, 191, 78, 79, 191, 191, 191, 191, 92, 94, + 191, 97, 98, 191, 102, 191, 191, 191, 191, 115, + + 116, 191, 191, 191, 191, 191, 124, 191, 191, 191, + 129, 191, 191, 191, 191, 138, 191, 191, 191, 144, + 191, 191, 191, 191, 191, 157, 191, 191, 191, 161, + 191, 191, 191, 167, 170, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 191, 14, 191, 17, 191, + 191, 191, 25, 27, 191, 30, 191, 191, 191, 191, + 191, 39, 191, 43, 191, 46, 191, 51, 52, 191, + 54, 191, 191, 191, 191, 63, 66, 68, 70, 76, + 80, 191, 191, 191, 87, 95, 99, 103, 191, 107, + 191, 112, 191, 191, 191, 191, 191, 191, 127, 191, + 191, 132, 134, 136, 191, 142, 191, 145, 191, 191, + + 191, 191, 191, 158, 159, 160, 162, 191, 191, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 9, 16, 18, 21, 191, + 26, 28, 191, 191, 191, 37, 38, 191, 191, 191, + + 53, 55, 56, 191, 62, 82, 191, 191, 100, 104, + 191, 191, 191, 191, 122, 123, 191, 191, 191, 133, + 135, 191, 143, 191, 191, 191, 191, 191, 163, 165, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 191, 0, 33, + 191, 42, 44, 49, 191, 191, 84, 109, 191, 191, + 191, 191, 128, 130, 141, 191, 191, 191, 155, 191, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 191, 0, 191, 60, 83, + 191, 119, 121, 191, 146, 150, 191, 156, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 36, 118, 126, 191, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 171, 153, + 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 0, 172, 2, 2, 0, 2, + + 0, 2, 187, 2, 0 + } ; + +static const YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 1, 1, 6, 7, 8, 6, + 6, 6, 9, 6, 10, 11, 6, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 6, 6, 22, + 23, 24, 6, 1, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 6, 1, 6, 6, 51, 52, 53, 54, 55, 56, + + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 6, 79, 6, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static const YY_CHAR yy_meta[80] = + { 0, + 1, 1, 2, 1, 3, 1, 1, 4, 5, 5, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 1, 1, 1, 8, 8, 8, 8, 9, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 10, 8, 8, 8, 8, 9, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 1 + } ; + +static const flex_int16_t yy_base[1421] = + { 0, + 0, 0, 667, 661, 79, 0, 662, 9173, 157, 159, + 635, 0, 9173, 648, 9173, 153, 152, 164, 154, 622, + 156, 194, 152, 158, 181, 169, 241, 205, 228, 254, + 148, 159, 239, 270, 276, 294, 234, 0, 305, 346, + 390, 308, 308, 166, 214, 0, 558, 0, 613, 0, + 192, 252, 582, 596, 0, 591, 0, 236, 375, 450, + 331, 559, 239, 507, 586, 641, 694, 743, 796, 382, + 471, 840, 507, 550, 573, 587, 892, 942, 992, 600, + 643, 1039, 1092, 686, 664, 736, 741, 514, 481, 314, + 9173, 553, 9173, 9173, 541, 250, 253, 348, 347, 9173, + + 527, 9173, 9173, 9173, 9173, 0, 257, 291, 363, 403, + 300, 353, 447, 351, 345, 0, 490, 373, 457, 415, + 375, 490, 797, 741, 376, 416, 430, 447, 472, 818, + 505, 506, 505, 511, 513, 521, 537, 561, 613, 565, + 568, 0, 581, 578, 856, 585, 591, 583, 641, 644, + 855, 636, 650, 700, 668, 688, 694, 714, 715, 0, + 721, 734, 759, 747, 770, 810, 787, 877, 795, 878, + 799, 896, 894, 803, 812, 802, 821, 855, 881, 856, + 889, 896, 924, 937, 922, 922, 940, 929, 946, 935, + 960, 446, 9173, 0, 9173, 0, 431, 0, 487, 0, + + 0, 476, 1158, 1204, 1251, 1300, 0, 465, 0, 0, + 0, 0, 990, 993, 1079, 1039, 1297, 1084, 1296, 1344, + 1293, 1052, 1309, 982, 1353, 1394, 1389, 1394, 1424, 1477, + 1518, 1163, 1449, 1164, 1568, 1457, 1618, 1210, 1211, 1470, + 1527, 1485, 1564, 1576, 1617, 1634, 1633, 1675, 1653, 1673, + 1698, 1748, 1678, 1728, 1741, 1764, 1813, 1866, 1790, 1735, + 1801, 1851, 1907, 1860, 1910, 1929, 1932, 1956, 1971, 1977, + 2007, 2026, 2024, 2024, 2079, 2075, 2078, 2092, 2142, 2142, + 2143, 2182, 2183, 2208, 2197, 2230, 2223, 2250, 2253, 2280, + 2328, 2295, 2309, 2345, 2361, 2368, 2375, 2401, 436, 0, + + 9173, 473, 427, 976, 429, 1176, 1276, 9173, 0, 998, + 0, 1006, 1000, 0, 1016, 0, 1022, 1053, 1083, 1100, + 1099, 1101, 1299, 1096, 1094, 1120, 1137, 1133, 1161, 1155, + 1161, 1175, 1170, 1209, 1217, 1226, 1354, 1228, 1227, 1213, + 0, 1273, 1262, 1308, 1310, 0, 1354, 1352, 1357, 1342, + 1357, 1355, 1396, 1412, 1419, 1411, 1520, 1411, 1413, 1426, + 1438, 1457, 1461, 1464, 1497, 1505, 1505, 1516, 1521, 1522, + 1551, 1510, 1520, 0, 1515, 1542, 1568, 1582, 1596, 1582, + 1583, 1575, 0, 1582, 1582, 0, 1611, 1624, 1623, 1644, + 1678, 1696, 1686, 1735, 1698, 1790, 1735, 1750, 1746, 1758, + + 1798, 1783, 1803, 1800, 1797, 1814, 1808, 1824, 0, 1827, + 1826, 1839, 1846, 1839, 1840, 1849, 1848, 1848, 1862, 1876, + 0, 1868, 1900, 1902, 1921, 1922, 1960, 1959, 1956, 1975, + 1964, 1973, 2010, 2001, 1999, 9173, 0, 472, 2470, 2480, + 2529, 2498, 2508, 0, 2394, 2522, 2523, 2524, 2401, 2522, + 2539, 2559, 2575, 2580, 2611, 2610, 2590, 2626, 2676, 2662, + 2667, 2712, 2713, 2726, 2739, 2759, 2772, 2772, 2808, 2809, + 2821, 2838, 2857, 2883, 2864, 2904, 2878, 2897, 2923, 2940, + 2949, 2954, 2979, 2980, 3006, 3006, 3026, 3043, 3051, 3067, + 3096, 3094, 3117, 3122, 3150, 3154, 3167, 3181, 3215, 3217, + + 3220, 3266, 3267, 3269, 3292, 3306, 3309, 3323, 3339, 3356, + 3370, 3362, 3404, 3419, 3472, 3433, 3473, 3470, 3487, 3512, + 3513, 3526, 3543, 3559, 3563, 3576, 3589, 3612, 3615, 3668, + 3632, 3719, 3668, 3705, 3713, 3661, 3753, 3764, 3783, 3781, + 3790, 3820, 3829, 3834, 3843, 3860, 3879, 3874, 3886, 3917, + 3928, 3931, 3937, 3973, 3948, 3989, 3994, 3993, 4024, 4019, + 4044, 4045, 4085, 4061, 4105, 4092, 4136, 4144, 4153, 4161, + 4192, 0, 470, 4229, 4257, 4267, 4277, 2008, 2016, 2017, + 2021, 2029, 2044, 2063, 2067, 2079, 0, 2094, 0, 0, + 2104, 2094, 2105, 2118, 0, 2117, 2122, 2141, 2129, 0, + + 2138, 2140, 2151, 2173, 2202, 2200, 2221, 2230, 2245, 0, + 0, 2260, 2258, 2263, 2259, 2264, 2288, 2293, 2306, 0, + 2293, 2304, 2312, 2343, 0, 0, 2349, 2338, 0, 2346, + 0, 2370, 2391, 2404, 2405, 2433, 2434, 2575, 0, 2466, + 0, 0, 0, 2461, 0, 2470, 2478, 0, 2479, 2636, + 2499, 2498, 2533, 0, 2591, 2591, 2585, 2611, 0, 2628, + 2637, 0, 2653, 2660, 2664, 2665, 0, 2657, 2689, 2688, + 2691, 2712, 0, 2719, 2733, 2749, 2752, 0, 0, 2755, + 2765, 2765, 2783, 2774, 0, 0, 2784, 2788, 0, 2807, + 2792, 2815, 2816, 2839, 2822, 2845, 2871, 2887, 0, 2897, + + 0, 2920, 0, 2914, 469, 4287, 4297, 4307, 4317, 4303, + 4306, 4100, 4314, 4351, 4349, 4365, 4363, 4402, 4404, 4411, + 4437, 4444, 4467, 4458, 4493, 4498, 4500, 4540, 4500, 4549, + 4570, 4589, 4577, 4596, 4632, 4621, 4638, 4646, 4663, 4686, + 4685, 4688, 4694, 4738, 4735, 4744, 4752, 4783, 4797, 4805, + 4803, 4833, 4854, 4856, 4863, 4889, 4896, 4910, 4919, 4945, + 4950, 4952, 4955, 4972, 4996, 5013, 5001, 5018, 5033, 5079, + 5064, 5070, 5115, 5116, 5124, 5130, 5161, 5167, 5062, 5179, + 5190, 5178, 5223, 5222, 5246, 5251, 5277, 5272, 5298, 5324, + 5313, 5349, 5338, 5363, 5364, 5394, 5403, 5405, 5420, 5434, + + 5457, 5460, 5459, 5486, 5499, 5512, 5514, 5545, 5525, 5558, + 5565, 5565, 5591, 5594, 5605, 5620, 5631, 5634, 5664, 5667, + 5678, 5686, 5710, 5723, 5727, 5742, 5766, 5781, 5782, 5821, + 5822, 5835, 5836, 5861, 5862, 5878, 461, 0, 0, 2916, + 0, 2938, 0, 2939, 2942, 2967, 2971, 2975, 2984, 2979, + 2985, 2996, 0, 3000, 3010, 3009, 3035, 3029, 3046, 0, + 3047, 3040, 3057, 3069, 3072, 3081, 3067, 3076, 3093, 3107, + 3114, 0, 0, 3100, 3136, 3128, 3140, 3138, 3175, 0, + 0, 3163, 0, 0, 3167, 3194, 3212, 3196, 0, 0, + 3209, 0, 0, 3213, 3220, 3250, 3235, 3253, 3260, 0, + + 0, 3280, 3268, 3291, 3280, 3309, 0, 3328, 3331, 3328, + 0, 3340, 3349, 3353, 3353, 0, 3365, 3379, 3387, 3373, + 3375, 3377, 3403, 3406, 3412, 0, 3422, 3427, 3428, 0, + 3417, 3438, 3442, 0, 0, 427, 5889, 5897, 5898, 5934, + 5918, 5954, 5955, 5957, 5984, 5997, 6011, 6019, 6027, 6040, + 6047, 6073, 6073, 6086, 6099, 6126, 6126, 6128, 6139, 6165, + 6179, 6177, 6178, 6205, 6228, 6230, 6231, 6235, 6261, 6286, + 6287, 6288, 6313, 6328, 6342, 6330, 6364, 6377, 6386, 6401, + 6420, 6423, 6437, 6462, 6478, 6466, 6493, 6508, 6522, 6525, + 6539, 6542, 6578, 6566, 6595, 6608, 6622, 6647, 6651, 6664, + + 6675, 6677, 6717, 6718, 6747, 6704, 6754, 6773, 6780, 6787, + 6810, 6813, 6840, 6849, 6866, 6875, 6901, 6906, 6734, 6918, + 6933, 6955, 6975, 6974, 6989, 7015, 7028, 7029, 7030, 7045, + 7074, 7077, 7088, 7096, 397, 3441, 0, 3451, 0, 3500, + 3524, 3513, 3517, 0, 3527, 0, 3554, 3571, 3582, 3579, + 3577, 0, 3605, 0, 3605, 0, 3615, 0, 0, 3626, + 0, 3620, 3619, 3634, 3633, 0, 0, 0, 0, 0, + 0, 3632, 3658, 3684, 0, 0, 3671, 0, 3683, 0, + 3699, 0, 3682, 3697, 3727, 3734, 3717, 3730, 0, 3743, + 3745, 3730, 3756, 0, 3769, 0, 3773, 0, 3786, 3793, + + 3796, 3798, 3860, 0, 0, 0, 0, 3863, 3879, 385, + 7122, 7136, 7120, 7144, 7152, 7165, 7192, 7169, 7191, 7208, + 7222, 7237, 7254, 7251, 7278, 7293, 7297, 7312, 7334, 7348, + 7349, 7363, 7380, 7394, 7414, 7428, 7402, 7436, 7454, 7456, + 7480, 7481, 7500, 7517, 7525, 7531, 7542, 7565, 7586, 7588, + 7591, 7593, 7608, 7635, 7639, 7664, 7650, 7689, 7690, 7705, + 7719, 7730, 7735, 7752, 7766, 7767, 7781, 7798, 7812, 7813, + 7827, 7844, 7858, 7861, 7875, 7904, 7900, 7917, 7931, 7946, + 7960, 7963, 7977, 7980, 388, 0, 0, 0, 0, 3890, + 0, 0, 438, 3930, 3945, 0, 0, 3949, 3938, 3995, + + 0, 0, 0, 3997, 0, 0, 4015, 4011, 0, 0, + 4037, 4058, 4050, 4054, 0, 0, 4071, 4059, 4073, 0, + 0, 4072, 0, 4081, 4108, 4122, 4141, 4146, 0, 0, + 386, 7994, 7997, 8014, 8028, 8048, 8062, 8067, 8081, 8088, + 8107, 8102, 8128, 8133, 8142, 8173, 8159, 8168, 8182, 8208, + 8217, 8225, 8239, 8242, 8259, 8273, 8284, 8307, 8312, 8327, + 8340, 8344, 8359, 8383, 8398, 8402, 8415, 8439, 8452, 8456, + 8471, 8495, 8501, 8515, 8516, 8541, 385, 4143, 4353, 0, + 4142, 0, 0, 0, 4159, 4161, 0, 0, 4184, 4193, + 4205, 4209, 0, 0, 0, 4190, 4300, 4317, 0, 4330, + + 359, 8546, 4414, 8571, 8582, 8596, 8601, 8622, 8636, 8637, + 8651, 8672, 8677, 8548, 8684, 8702, 8707, 8728, 8733, 8742, + 8747, 8768, 8773, 8798, 350, 478, 4321, 4332, 0, 0, + 4353, 0, 0, 4359, 0, 0, 4371, 0, 332, 8839, + 4380, 8799, 8824, 8838, 8826, 8846, 8871, 8875, 8888, 8902, + 8928, 8941, 327, 4443, 4405, 0, 0, 0, 4416, 310, + 4472, 4410, 8942, 8943, 8968, 8978, 306, 4437, 9173, 0, + 303, 4477, 0, 8995, 276, 4471, 271, 4510, 257, 4504, + 240, 4509, 230, 4529, 225, 4530, 220, 4534, 189, 4536, + 187, 4552, 185, 4562, 176, 9173, 172, 0, 177, 174, + + 164, 162, 9173, 0, 9173, 9071, 9081, 9086, 9089, 9098, + 9107, 9117, 9127, 9137, 9147, 9151, 9154, 9159, 9162, 9165 + } ; + +static const flex_int16_t yy_def[1421] = + { 0, + 1405, 1, 1406, 1406, 1405, 5, 1405, 1405, 1405, 1405, + 1405, 1407, 1405, 1405, 1405, 1405, 1405, 1408, 1405, 1405, + 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1410, 1405, 1411, 1405, 1412, + 1412, 1405, 1412, 1413, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1414, 1414, 65, 65, 65, 66, 68, + 65, 68, 65, 65, 65, 65, 66, 66, 66, 65, + 65, 65, 65, 68, 65, 65, 65, 1415, 1412, 1405, + 1405, 1407, 1405, 1405, 1405, 1416, 1417, 1408, 1418, 1405, + + 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1410, 1405, 1411, 1405, 1412, 1412, 1412, 1413, 1412, + + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 65, 65, 65, 68, 68, 68, 68, 68, + 68, 65, 65, 68, 68, 68, 65, 65, 65, 68, + 68, 68, 65, 68, 68, 68, 65, 68, 68, 65, + 68, 65, 68, 65, 65, 68, 68, 68, 68, 65, + 65, 68, 68, 65, 65, 65, 65, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, + 65, 65, 65, 68, 68, 68, 68, 68, 68, 65, + 65, 65, 65, 65, 65, 68, 65, 65, 65, 66, + 65, 65, 65, 68, 65, 65, 65, 65, 1415, 1412, + + 1405, 1405, 1419, 1417, 1420, 1405, 1405, 1405, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1405, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 65, 65, 65, 65, 68, 68, + 68, 68, 65, 65, 65, 65, 68, 68, 65, 65, + 65, 65, 65, 65, 65, 68, 68, 65, 68, 68, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 68, 68, 68, 68, 65, + 65, 68, 65, 65, 68, 68, 68, 68, 65, 65, + + 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, + 68, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 68, 68, 68, 65, 65, 65, 65, + 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, + 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, + 68, 68, 68, 68, 68, 65, 65, 68, 68, 65, + 65, 65, 65, 68, 68, 68, 68, 68, 68, 68, + 68, 1412, 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1412, 1412, 1412, 1412, 1412, 68, + 68, 65, 65, 65, 68, 65, 68, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 68, 65, + 65, 65, 68, 68, 68, 68, 68, 68, 68, 65, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 68, 68, 68, 65, 65, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, + 65, 68, 68, 68, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + + 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, + 65, 68, 65, 65, 65, 65, 65, 65, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, + 65, 65, 65, 65, 65, 68, 1405, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1412, 68, 68, 68, 68, + 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, + 65, 65, 68, 65, 65, 65, 68, 65, 65, 65, + 65, 68, 65, 65, 65, 65, 65, 68, 65, 65, + 65, 65, 65, 65, 65, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 65, 68, 68, 68, 68, 68, + 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, + + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, + 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, + 68, 68, 68, 68, 1405, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, + 65, 65, 68, 68, 68, 65, 65, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 65, 65, 68, 68, 65, 68, + 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, + 65, 68, 68, 68, 68, 68, 68, 68, 65, 65, + 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 1405, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1412, 68, 68, 68, 68, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, + 68, 68, 68, 68, 68, 68, 68, 65, 65, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 65, 65, 65, 65, 1405, 1409, 1405, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1412, 65, 1412, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 68, 68, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 1405, 1409, 1405, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, 65, + 1412, 65, 65, 65, 68, 68, 68, 68, 68, 68, + 65, 65, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1412, + 1412, 1412, 65, 65, 65, 68, 1405, 1405, 1405, 1409, + 1412, 1412, 1412, 68, 1405, 1405, 1412, 1412, 1405, 1405, + 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, + 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1412, + + 1405, 1412, 1405, 1412, 0, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405 + } ; + +static const flex_int16_t yy_nxt[9253] = + { 0, + 8, 9, 10, 11, 12, 13, 14, 15, 13, 16, + 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 38, 45, 38, + 8, 46, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 38, 45, 38, 47, 50, + 51, 52, 53, 54, 55, 56, 57, 55, 58, 59, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 80, 87, 80, 50, + 88, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 80, 87, 80, 89, 90, 90, + 90, 90, 94, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 95, 97, 100, 101, 102, 104, 105, + 113, 1404, 117, 1403, 114, 1402, 147, 148, 1401, 118, + 115, 1400, 99, 197, 90, 1399, 119, 189, 190, 120, + + 116, 1397, 121, 1395, 127, 122, 128, 1393, 113, 123, + 117, 129, 114, 124, 147, 148, 130, 118, 115, 125, + 99, 107, 126, 108, 119, 189, 190, 120, 116, 109, + 121, 110, 127, 122, 128, 111, 112, 123, 1391, 129, + 137, 124, 191, 1389, 130, 201, 138, 125, 1387, 107, + 126, 108, 139, 90, 90, 1385, 202, 109, 164, 110, + 140, 211, 212, 111, 112, 131, 141, 149, 137, 165, + 191, 150, 1383, 132, 138, 166, 133, 151, 303, 134, + 139, 305, 135, 142, 309, 136, 164, 1381, 140, 143, + 144, 145, 1379, 131, 141, 149, 146, 165, 152, 150, + + 155, 132, 153, 166, 133, 151, 303, 134, 154, 305, + 135, 142, 309, 136, 156, 90, 90, 143, 144, 145, + 157, 158, 1377, 159, 146, 1375, 152, 1371, 155, 167, + 153, 160, 187, 168, 310, 161, 154, 169, 162, 163, + 188, 315, 156, 170, 1367, 184, 1360, 185, 157, 158, + 186, 159, 207, 208, 209, 306, 306, 167, 97, 160, + 187, 168, 310, 161, 1353, 169, 162, 163, 188, 315, + 1339, 170, 171, 184, 172, 185, 99, 173, 186, 316, + 174, 320, 175, 321, 176, 177, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 1325, 324, 311, 1301, + + 171, 1277, 172, 1231, 99, 173, 312, 316, 174, 320, + 175, 321, 176, 177, 178, 1185, 331, 244, 179, 213, + 342, 180, 181, 245, 213, 324, 311, 313, 182, 213, + 314, 183, 197, 90, 312, 574, 574, 576, 576, 1279, + 1279, 1110, 178, 329, 331, 244, 179, 213, 342, 180, + 181, 245, 213, 330, 343, 313, 182, 213, 314, 183, + 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 329, 344, 345, 346, 1035, 317, 318, 206, 1354, + 1354, 330, 343, 936, 837, 705, 573, 572, 444, 438, + 319, 437, 325, 326, 327, 246, 328, 436, 347, 213, + + 344, 345, 346, 247, 317, 318, 206, 196, 196, 248, + 196, 196, 196, 196, 196, 196, 196, 196, 319, 213, + 325, 326, 327, 246, 328, 322, 347, 213, 196, 196, + 196, 247, 323, 332, 214, 213, 215, 248, 333, 213, + 353, 354, 216, 355, 217, 254, 356, 213, 218, 219, + 308, 358, 357, 322, 302, 213, 359, 301, 196, 300, + 323, 332, 214, 213, 215, 196, 333, 213, 353, 354, + 216, 355, 217, 254, 356, 360, 218, 219, 255, 358, + 357, 210, 213, 213, 359, 196, 196, 196, 213, 196, + 196, 196, 196, 196, 196, 196, 196, 200, 213, 361, + + 196, 256, 364, 360, 198, 257, 255, 196, 196, 196, + 213, 258, 365, 366, 220, 259, 213, 367, 221, 260, + 195, 213, 372, 373, 222, 261, 213, 361, 213, 256, + 364, 374, 213, 257, 223, 213, 193, 196, 213, 258, + 365, 366, 220, 259, 103, 367, 221, 260, 213, 213, + 372, 373, 222, 261, 93, 362, 213, 91, 363, 374, + 213, 1405, 223, 213, 196, 224, 213, 274, 49, 213, + 375, 275, 225, 213, 49, 276, 213, 381, 376, 226, + 377, 277, 227, 362, 1405, 228, 363, 382, 294, 213, + 1405, 213, 213, 224, 1405, 274, 295, 213, 375, 275, + + 225, 213, 213, 276, 1405, 381, 376, 226, 377, 277, + 227, 385, 213, 228, 1405, 382, 294, 213, 229, 213, + 213, 213, 230, 291, 295, 292, 231, 383, 293, 388, + 213, 386, 232, 213, 387, 233, 1405, 384, 389, 385, + 213, 1405, 213, 1405, 390, 1405, 229, 1405, 391, 213, + 230, 291, 1405, 292, 231, 383, 293, 388, 1405, 386, + 232, 213, 387, 233, 213, 384, 389, 296, 297, 298, + 213, 213, 390, 213, 213, 213, 391, 392, 234, 213, + 235, 213, 339, 340, 213, 236, 341, 393, 394, 213, + 237, 213, 213, 1405, 395, 296, 297, 298, 1405, 213, + + 1405, 213, 213, 213, 1405, 392, 234, 213, 235, 213, + 339, 340, 213, 236, 341, 393, 394, 213, 237, 213, + 238, 334, 395, 335, 398, 403, 336, 213, 239, 1405, + 406, 240, 337, 1405, 241, 412, 413, 242, 396, 338, + 243, 1405, 397, 414, 348, 415, 349, 1405, 238, 334, + 350, 335, 398, 403, 336, 213, 239, 351, 406, 240, + 337, 352, 241, 412, 413, 242, 396, 338, 243, 249, + 397, 414, 348, 415, 349, 250, 251, 252, 350, 378, + 416, 379, 253, 368, 419, 351, 1405, 213, 1405, 352, + 1405, 1405, 380, 369, 1405, 1405, 1405, 249, 370, 371, + + 1405, 399, 1405, 250, 251, 252, 400, 378, 416, 379, + 253, 368, 419, 404, 401, 213, 262, 417, 410, 402, + 380, 369, 407, 213, 405, 420, 370, 371, 418, 399, + 263, 408, 411, 213, 400, 421, 264, 265, 1405, 409, + 1405, 404, 401, 1405, 262, 417, 410, 402, 422, 427, + 407, 213, 405, 420, 428, 1405, 418, 431, 263, 408, + 411, 213, 424, 421, 264, 265, 213, 409, 423, 425, + 432, 266, 426, 213, 433, 429, 422, 427, 434, 267, + 213, 430, 428, 268, 435, 431, 269, 270, 1405, 1405, + 424, 1405, 1405, 1405, 213, 1405, 423, 425, 432, 266, + + 426, 213, 433, 429, 305, 1405, 434, 267, 213, 430, + 1405, 268, 435, 1405, 269, 270, 271, 458, 213, 213, + 445, 213, 213, 213, 459, 213, 578, 272, 213, 213, + 213, 213, 305, 273, 579, 580, 213, 1405, 213, 1405, + 581, 213, 1405, 1405, 271, 458, 213, 213, 445, 213, + 213, 213, 459, 213, 578, 272, 213, 213, 213, 213, + 582, 273, 579, 580, 213, 278, 213, 279, 581, 213, + 280, 213, 1405, 281, 447, 282, 213, 283, 284, 1405, + 213, 213, 448, 1405, 213, 583, 213, 213, 582, 1405, + 457, 1405, 1405, 278, 1405, 279, 1405, 1405, 280, 213, + + 213, 281, 447, 282, 213, 283, 284, 213, 213, 213, + 448, 213, 213, 583, 213, 213, 285, 213, 457, 213, + 286, 213, 446, 287, 288, 451, 213, 213, 213, 584, + 289, 213, 585, 290, 586, 213, 587, 591, 592, 213, + 213, 1405, 1405, 1405, 285, 213, 1405, 213, 286, 213, + 446, 287, 288, 451, 213, 213, 593, 584, 289, 213, + 585, 290, 586, 1405, 587, 591, 592, 1405, 213, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 1405, + 594, 595, 1405, 1405, 593, 596, 439, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 597, 213, 213, + + 213, 213, 598, 599, 1405, 213, 480, 478, 594, 595, + 213, 213, 600, 596, 439, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 597, 213, 213, 213, 213, + 598, 599, 441, 213, 480, 478, 1405, 1405, 213, 213, + 600, 1405, 1405, 1405, 601, 489, 490, 213, 213, 602, + 603, 1405, 213, 213, 606, 607, 608, 213, 213, 1405, + 441, 204, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 601, 489, 490, 213, 213, 602, 603, 206, + 213, 213, 606, 607, 608, 213, 213, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 1405, 609, 1405, + + 1405, 610, 1405, 1405, 1405, 1405, 1405, 206, 442, 442, + 1405, 443, 443, 443, 443, 443, 443, 443, 443, 443, + 443, 449, 452, 456, 450, 588, 609, 589, 213, 610, + 213, 213, 213, 213, 213, 213, 611, 213, 213, 213, + 213, 213, 590, 213, 213, 1405, 1405, 213, 612, 449, + 452, 456, 450, 588, 1405, 589, 213, 213, 213, 213, + 213, 213, 213, 213, 611, 213, 213, 213, 213, 213, + 590, 213, 213, 453, 454, 213, 612, 460, 613, 213, + 614, 213, 604, 615, 616, 213, 213, 455, 213, 1405, + 213, 213, 617, 1405, 1405, 213, 618, 605, 1405, 1405, + + 213, 453, 454, 1405, 1405, 460, 613, 213, 614, 213, + 604, 615, 616, 1405, 213, 455, 213, 465, 213, 213, + 617, 213, 213, 213, 618, 605, 213, 466, 213, 461, + 462, 463, 213, 464, 1405, 467, 213, 213, 619, 1405, + 620, 213, 213, 621, 1405, 465, 622, 625, 626, 213, + 213, 627, 213, 1405, 213, 466, 213, 461, 462, 463, + 213, 464, 213, 467, 213, 213, 619, 468, 620, 213, + 213, 621, 469, 1405, 622, 625, 626, 213, 1405, 627, + 213, 213, 628, 483, 213, 1405, 1405, 479, 629, 1405, + 213, 1405, 213, 630, 213, 468, 1405, 213, 213, 213, + + 469, 470, 213, 471, 213, 213, 472, 631, 491, 213, + 628, 483, 473, 213, 213, 479, 629, 213, 213, 474, + 213, 630, 213, 494, 213, 213, 213, 213, 1405, 470, + 213, 471, 213, 213, 472, 631, 491, 1405, 632, 633, + 473, 213, 213, 634, 635, 213, 213, 474, 623, 636, + 637, 494, 213, 213, 640, 213, 624, 641, 642, 475, + 476, 213, 492, 477, 213, 213, 632, 633, 493, 213, + 643, 634, 635, 1405, 213, 1405, 623, 636, 637, 638, + 1405, 213, 640, 213, 624, 641, 642, 475, 476, 639, + 492, 477, 213, 213, 481, 482, 493, 213, 643, 495, + + 644, 213, 213, 213, 213, 213, 213, 638, 213, 645, + 213, 213, 648, 649, 496, 213, 1405, 639, 1405, 650, + 646, 1405, 481, 482, 213, 651, 652, 495, 644, 213, + 647, 213, 213, 213, 213, 653, 213, 645, 213, 213, + 648, 649, 496, 213, 484, 213, 485, 650, 646, 213, + 486, 1405, 213, 651, 652, 497, 213, 487, 647, 654, + 1405, 488, 1405, 653, 655, 213, 213, 1405, 213, 213, + 500, 213, 484, 213, 485, 213, 498, 213, 486, 499, + 213, 213, 1405, 497, 213, 487, 656, 654, 213, 488, + 213, 1405, 655, 213, 213, 213, 213, 213, 500, 213, + + 213, 213, 1405, 213, 498, 502, 657, 499, 213, 213, + 213, 213, 213, 213, 656, 508, 213, 213, 213, 501, + 213, 213, 213, 213, 658, 213, 213, 659, 213, 213, + 213, 1405, 1405, 502, 657, 662, 213, 503, 213, 213, + 213, 213, 1405, 508, 1405, 213, 213, 501, 213, 213, + 213, 1405, 658, 213, 213, 659, 213, 1405, 213, 660, + 509, 1405, 1405, 662, 213, 503, 213, 1405, 1405, 213, + 213, 665, 518, 213, 213, 504, 213, 213, 661, 213, + 666, 667, 213, 213, 213, 505, 668, 660, 509, 510, + 506, 507, 213, 511, 213, 213, 213, 213, 213, 665, + + 518, 213, 213, 504, 213, 213, 661, 213, 666, 667, + 213, 213, 213, 505, 668, 1405, 663, 510, 506, 507, + 213, 511, 669, 213, 213, 213, 670, 213, 519, 664, + 213, 517, 213, 1405, 671, 672, 213, 213, 520, 673, + 213, 213, 674, 213, 663, 213, 675, 512, 213, 513, + 669, 213, 676, 213, 670, 213, 519, 664, 1405, 517, + 213, 213, 671, 672, 213, 213, 520, 673, 677, 213, + 674, 213, 678, 213, 675, 512, 213, 513, 679, 213, + 676, 680, 681, 682, 683, 1405, 213, 684, 213, 213, + 514, 685, 515, 213, 521, 524, 677, 213, 213, 686, + + 678, 213, 213, 516, 687, 688, 679, 213, 213, 680, + 681, 682, 683, 213, 213, 684, 213, 1405, 514, 685, + 515, 213, 521, 524, 1405, 213, 213, 686, 689, 213, + 213, 516, 687, 688, 525, 213, 213, 690, 1405, 1405, + 691, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, + 522, 1405, 213, 523, 213, 1405, 689, 213, 526, 692, + 694, 693, 525, 1405, 213, 690, 213, 213, 691, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 522, 213, + 213, 523, 213, 527, 695, 213, 526, 692, 694, 693, + 1405, 213, 213, 213, 213, 213, 696, 213, 213, 213, + + 697, 698, 213, 213, 213, 529, 213, 213, 213, 213, + 699, 527, 695, 213, 528, 213, 700, 1405, 213, 213, + 1405, 213, 1405, 1405, 696, 213, 213, 1405, 697, 698, + 1405, 213, 703, 529, 213, 213, 213, 213, 699, 213, + 704, 213, 528, 213, 700, 213, 213, 701, 530, 838, + 531, 702, 532, 213, 213, 213, 533, 839, 213, 213, + 703, 534, 213, 213, 213, 840, 213, 213, 704, 841, + 842, 213, 213, 213, 213, 701, 530, 838, 531, 702, + 532, 843, 213, 213, 533, 839, 213, 213, 1405, 534, + 213, 844, 213, 840, 213, 1405, 1405, 841, 842, 213, + + 213, 1405, 213, 535, 845, 539, 1405, 846, 536, 843, + 213, 1405, 213, 540, 213, 213, 537, 213, 847, 844, + 213, 538, 213, 542, 541, 213, 213, 213, 848, 213, + 849, 535, 845, 539, 213, 846, 536, 850, 213, 213, + 213, 540, 213, 213, 537, 213, 847, 1405, 213, 538, + 213, 542, 541, 213, 213, 213, 848, 213, 849, 851, + 852, 1405, 213, 1405, 853, 850, 546, 213, 543, 854, + 213, 213, 855, 856, 213, 548, 857, 544, 1405, 213, + 547, 213, 1405, 1405, 213, 545, 1405, 851, 852, 213, + 213, 213, 853, 1405, 546, 858, 543, 854, 213, 213, + + 855, 856, 213, 548, 857, 544, 549, 213, 547, 213, + 213, 213, 213, 545, 213, 213, 859, 213, 213, 213, + 213, 213, 552, 858, 550, 213, 860, 1405, 1405, 213, + 213, 213, 551, 1405, 549, 213, 213, 1405, 213, 213, + 213, 861, 213, 213, 859, 213, 213, 862, 213, 213, + 552, 555, 550, 213, 860, 213, 213, 213, 213, 213, + 551, 213, 863, 213, 213, 213, 553, 213, 213, 861, + 1405, 213, 213, 213, 213, 862, 1405, 554, 213, 555, + 864, 213, 213, 213, 213, 213, 556, 865, 213, 213, + 863, 213, 557, 213, 553, 213, 1405, 866, 213, 213, + + 213, 213, 867, 868, 558, 554, 213, 869, 864, 213, + 213, 213, 870, 213, 556, 865, 213, 871, 213, 213, + 557, 213, 563, 213, 559, 866, 213, 213, 1405, 213, + 867, 868, 558, 213, 872, 869, 873, 213, 1405, 213, + 870, 564, 874, 213, 875, 871, 213, 213, 1405, 213, + 563, 213, 559, 560, 1405, 213, 213, 213, 1405, 1405, + 561, 213, 872, 562, 873, 213, 213, 876, 1405, 564, + 874, 213, 875, 877, 1405, 213, 213, 878, 1405, 1405, + 565, 560, 213, 879, 213, 213, 566, 213, 561, 567, + 1405, 562, 213, 213, 213, 876, 569, 1405, 1405, 213, + + 213, 877, 568, 213, 213, 878, 213, 213, 565, 213, + 213, 879, 880, 213, 566, 213, 213, 567, 570, 881, + 213, 213, 213, 213, 569, 571, 213, 213, 213, 213, + 568, 213, 213, 213, 213, 213, 712, 213, 213, 213, + 880, 213, 213, 213, 213, 882, 570, 881, 213, 213, + 213, 213, 883, 571, 213, 1405, 1405, 213, 1405, 1405, + 213, 213, 1405, 1405, 712, 1405, 213, 213, 1405, 1405, + 213, 213, 1405, 882, 884, 885, 213, 213, 706, 706, + 883, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 707, 440, 440, 440, 440, 440, 440, 440, 440, 440, + + 440, 888, 884, 885, 889, 890, 891, 892, 441, 443, + 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, + 443, 443, 443, 443, 443, 443, 443, 443, 443, 888, + 895, 1405, 889, 890, 891, 892, 441, 708, 708, 896, + 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, + 710, 213, 711, 1405, 213, 213, 213, 213, 895, 213, + 213, 213, 213, 713, 213, 897, 1405, 896, 1405, 213, + 213, 213, 213, 1405, 213, 1405, 213, 1405, 710, 213, + 711, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 713, 213, 897, 213, 1405, 213, 213, 213, 213, + + 213, 213, 213, 213, 213, 886, 213, 213, 213, 213, + 1405, 1405, 715, 714, 213, 1405, 887, 898, 213, 899, + 1405, 1405, 213, 213, 213, 718, 900, 213, 213, 213, + 1405, 213, 213, 886, 213, 213, 213, 213, 213, 213, + 715, 714, 717, 213, 887, 898, 213, 899, 213, 213, + 1405, 213, 901, 718, 900, 213, 213, 716, 213, 213, + 213, 719, 1405, 213, 902, 213, 213, 213, 213, 903, + 717, 213, 1405, 213, 1405, 1405, 213, 213, 893, 894, + 901, 904, 1405, 1405, 905, 716, 213, 213, 906, 719, + 213, 213, 902, 907, 213, 213, 213, 903, 908, 213, + + 213, 213, 720, 723, 721, 213, 893, 894, 213, 904, + 213, 724, 905, 1405, 213, 213, 906, 1405, 213, 722, + 1405, 907, 213, 213, 213, 909, 908, 213, 213, 910, + 720, 723, 721, 213, 911, 1405, 213, 912, 213, 724, + 213, 213, 213, 213, 213, 213, 1405, 722, 725, 1405, + 213, 213, 213, 909, 213, 913, 726, 910, 213, 1405, + 213, 213, 911, 728, 213, 912, 1405, 213, 213, 213, + 914, 213, 213, 213, 727, 915, 725, 213, 213, 213, + 916, 1405, 213, 913, 726, 1405, 213, 213, 213, 213, + 917, 728, 213, 918, 213, 213, 213, 919, 914, 213, + + 731, 729, 727, 915, 213, 213, 213, 213, 916, 213, + 213, 920, 921, 730, 213, 213, 1405, 1405, 917, 213, + 213, 918, 213, 1405, 213, 919, 922, 1405, 731, 729, + 923, 1405, 213, 924, 213, 213, 925, 213, 213, 920, + 921, 730, 213, 213, 733, 213, 213, 213, 213, 213, + 732, 213, 926, 734, 922, 213, 213, 1405, 923, 213, + 927, 924, 735, 928, 925, 929, 213, 1405, 1405, 213, + 213, 213, 733, 213, 213, 930, 213, 213, 732, 213, + 926, 734, 1405, 213, 213, 736, 213, 213, 927, 213, + 735, 928, 739, 929, 213, 213, 213, 213, 213, 931, + + 737, 1405, 213, 930, 213, 213, 213, 1405, 1405, 738, + 213, 213, 213, 736, 213, 213, 213, 213, 932, 1405, + 739, 213, 741, 213, 213, 213, 213, 931, 737, 213, + 213, 213, 213, 213, 213, 213, 213, 738, 213, 213, + 213, 933, 213, 213, 213, 213, 932, 740, 934, 213, + 741, 213, 213, 213, 213, 213, 935, 213, 1405, 213, + 213, 213, 742, 213, 213, 1036, 1037, 1038, 743, 933, + 213, 213, 213, 213, 1405, 740, 934, 213, 213, 213, + 213, 213, 213, 213, 935, 1039, 213, 744, 213, 213, + 742, 1040, 213, 1036, 1037, 1038, 743, 213, 1041, 213, + + 213, 1042, 213, 745, 1405, 213, 213, 213, 746, 213, + 213, 213, 213, 1039, 213, 744, 213, 213, 213, 1040, + 213, 1043, 1044, 1045, 1046, 213, 1041, 213, 213, 1042, + 213, 745, 747, 1405, 213, 213, 746, 1047, 213, 213, + 213, 213, 1048, 213, 213, 213, 213, 1049, 748, 1043, + 1044, 1045, 1046, 213, 213, 213, 213, 1405, 1405, 1050, + 747, 749, 213, 213, 1051, 1047, 213, 1405, 213, 213, + 1048, 213, 213, 213, 1052, 1049, 748, 1405, 213, 1053, + 213, 213, 213, 1054, 750, 213, 213, 1050, 213, 749, + 213, 213, 1051, 751, 1055, 752, 213, 1056, 213, 213, + + 1405, 213, 1052, 1405, 1057, 213, 213, 1053, 213, 1058, + 1059, 1054, 750, 213, 213, 213, 213, 1405, 213, 1060, + 753, 751, 1055, 752, 213, 1056, 213, 213, 213, 754, + 1405, 213, 1057, 213, 213, 1061, 213, 1058, 1059, 1062, + 1063, 213, 1405, 213, 213, 755, 1064, 1060, 753, 213, + 213, 1405, 213, 756, 213, 213, 213, 754, 757, 213, + 213, 1405, 213, 1061, 213, 213, 1065, 1062, 1063, 213, + 213, 1066, 213, 755, 1064, 1067, 1405, 213, 213, 759, + 1068, 756, 213, 213, 1405, 758, 757, 213, 213, 213, + 1405, 213, 213, 213, 1065, 1405, 213, 213, 213, 1066, + + 1405, 213, 213, 1067, 213, 1069, 1070, 759, 1068, 213, + 1071, 760, 761, 758, 213, 213, 213, 213, 213, 213, + 213, 1405, 1072, 213, 213, 213, 1405, 1405, 213, 213, + 213, 1075, 213, 1069, 1070, 1405, 1076, 213, 1071, 760, + 761, 1077, 213, 213, 213, 213, 213, 762, 213, 213, + 1072, 213, 213, 213, 1073, 213, 213, 1074, 213, 1075, + 763, 764, 1078, 213, 1076, 213, 1405, 1405, 213, 1077, + 1405, 213, 1405, 213, 1079, 762, 213, 213, 1080, 1405, + 213, 213, 1073, 213, 1081, 1074, 213, 1405, 763, 764, + 1078, 213, 1405, 213, 213, 213, 213, 767, 213, 213, + + 765, 213, 1079, 1082, 213, 766, 1080, 213, 1083, 1405, + 1405, 1084, 1081, 1405, 213, 213, 1405, 213, 1085, 1405, + 768, 1086, 213, 213, 213, 767, 213, 213, 765, 213, + 213, 1082, 213, 766, 769, 213, 1083, 770, 213, 1084, + 213, 213, 213, 213, 213, 213, 1085, 771, 768, 1086, + 1087, 213, 213, 1405, 213, 213, 1088, 213, 213, 1089, + 1090, 213, 769, 1405, 1091, 770, 213, 772, 213, 213, + 1405, 213, 213, 1092, 213, 771, 773, 1405, 1087, 213, + 1093, 213, 213, 213, 1088, 213, 213, 1089, 1090, 213, + 775, 213, 1091, 213, 213, 772, 1094, 1095, 213, 213, + + 213, 1092, 213, 213, 773, 213, 1096, 213, 1093, 213, + 213, 1097, 213, 774, 213, 1098, 1099, 213, 775, 213, + 1100, 213, 213, 1405, 1094, 1095, 213, 1101, 213, 1405, + 1102, 213, 213, 213, 1096, 213, 776, 1405, 213, 1097, + 213, 774, 213, 1098, 1099, 213, 777, 213, 1100, 1103, + 1104, 213, 213, 1405, 1105, 1101, 1106, 213, 1102, 1107, + 213, 213, 1108, 780, 776, 213, 1109, 213, 1405, 1186, + 213, 213, 1405, 1405, 777, 213, 1405, 1103, 1104, 213, + 213, 213, 1105, 1405, 1106, 213, 1405, 1107, 1187, 213, + 1108, 780, 1405, 213, 1109, 213, 778, 1186, 213, 213, + + 213, 213, 213, 781, 213, 213, 779, 1405, 213, 213, + 213, 213, 1405, 1405, 782, 213, 1187, 1405, 213, 213, + 213, 213, 1405, 1405, 778, 213, 213, 1405, 213, 213, + 213, 781, 213, 213, 779, 213, 213, 1188, 213, 213, + 213, 213, 782, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 1189, 213, 213, 783, 1190, 784, 213, 1191, + 213, 213, 1192, 213, 213, 1188, 1405, 785, 213, 213, + 1405, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, + 1189, 213, 213, 783, 1190, 784, 213, 1191, 213, 213, + 1192, 213, 213, 1405, 786, 785, 213, 1193, 213, 213, + + 213, 213, 213, 213, 787, 213, 213, 1194, 1195, 213, + 213, 213, 1405, 213, 1196, 1405, 1405, 789, 788, 213, + 1197, 213, 786, 213, 213, 1193, 213, 213, 213, 213, + 1198, 1199, 787, 213, 213, 1194, 1195, 213, 213, 213, + 790, 213, 1196, 213, 213, 789, 788, 213, 1197, 213, + 213, 213, 1200, 213, 1201, 213, 791, 1202, 1198, 1199, + 213, 1405, 1203, 213, 1405, 213, 1204, 213, 790, 794, + 1205, 213, 213, 1206, 213, 213, 1405, 1405, 213, 213, + 1200, 213, 1201, 1405, 791, 1202, 1207, 1405, 213, 800, + 1203, 213, 792, 213, 1204, 213, 213, 794, 1205, 213, + + 213, 1206, 213, 213, 797, 213, 213, 213, 1208, 213, + 213, 793, 1405, 1209, 1207, 213, 213, 800, 1210, 1405, + 792, 213, 1405, 1211, 213, 1212, 1405, 213, 213, 1213, + 1405, 213, 797, 213, 213, 798, 1208, 213, 213, 793, + 213, 1209, 213, 213, 213, 795, 1210, 213, 799, 1405, + 213, 1211, 213, 1212, 213, 213, 213, 1213, 796, 1214, + 213, 213, 1215, 798, 1405, 1216, 213, 1217, 213, 1218, + 213, 1219, 1220, 795, 1405, 213, 799, 801, 213, 1405, + 213, 213, 213, 213, 213, 213, 796, 1214, 213, 213, + 1215, 213, 213, 1216, 213, 1217, 213, 1218, 1221, 1219, + + 1220, 213, 213, 1405, 1405, 801, 1222, 802, 1223, 213, + 1224, 213, 213, 213, 803, 213, 804, 1225, 213, 213, + 213, 213, 1226, 213, 213, 213, 1221, 213, 213, 213, + 213, 213, 805, 1405, 1222, 802, 1223, 213, 1224, 213, + 213, 1227, 803, 213, 804, 1225, 213, 1405, 806, 213, + 1226, 213, 213, 213, 1405, 213, 213, 213, 213, 213, + 805, 213, 808, 1405, 1405, 213, 213, 807, 213, 1227, + 1405, 213, 213, 1405, 1405, 213, 806, 213, 1405, 1405, + 213, 213, 213, 1405, 1405, 213, 213, 1228, 213, 213, + 808, 213, 213, 1405, 213, 807, 213, 1405, 213, 213, + + 213, 809, 213, 213, 1229, 213, 213, 213, 213, 213, + 213, 213, 213, 811, 1230, 1228, 213, 213, 1278, 213, + 213, 812, 213, 213, 1405, 810, 213, 213, 213, 809, + 213, 1405, 1229, 213, 213, 213, 213, 1405, 1405, 213, + 213, 811, 1230, 1405, 1405, 213, 1278, 1405, 1405, 812, + 213, 213, 213, 810, 213, 213, 213, 1405, 1280, 213, + 813, 213, 1405, 213, 213, 213, 815, 1405, 213, 1281, + 213, 814, 213, 213, 213, 213, 816, 1282, 213, 213, + 213, 1283, 213, 213, 213, 818, 1280, 213, 813, 1405, + 213, 213, 213, 213, 815, 213, 213, 1281, 213, 814, + + 213, 213, 213, 213, 816, 1282, 213, 213, 213, 1283, + 213, 213, 213, 818, 1405, 213, 817, 819, 213, 1405, + 213, 213, 213, 213, 1405, 1284, 213, 213, 213, 1405, + 820, 1405, 213, 1405, 1285, 213, 213, 213, 213, 1405, + 213, 1286, 213, 213, 817, 819, 1287, 213, 213, 213, + 213, 213, 821, 1284, 213, 213, 213, 823, 820, 213, + 213, 822, 1285, 213, 1405, 213, 213, 213, 213, 1286, + 213, 213, 213, 213, 1287, 213, 213, 213, 1288, 213, + 821, 1405, 824, 826, 825, 823, 1289, 213, 1290, 822, + 1405, 1291, 213, 213, 213, 213, 213, 1292, 828, 213, + + 213, 213, 1293, 213, 213, 213, 1288, 1294, 213, 827, + 824, 826, 825, 213, 1289, 1295, 1290, 213, 830, 1291, + 213, 213, 1296, 213, 213, 1292, 828, 213, 213, 213, + 1293, 213, 213, 213, 213, 1294, 213, 827, 213, 213, + 213, 213, 213, 1295, 1297, 213, 830, 213, 939, 829, + 1296, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, + 213, 213, 213, 1405, 1405, 1298, 213, 213, 213, 1299, + 213, 213, 1297, 213, 1300, 213, 939, 829, 213, 213, + 213, 213, 831, 213, 1326, 1328, 213, 832, 213, 1329, + 833, 213, 835, 1298, 834, 213, 213, 1299, 213, 213, + + 213, 213, 1300, 213, 1330, 1405, 213, 213, 213, 213, + 831, 213, 1326, 1328, 213, 832, 213, 1329, 833, 213, + 835, 1405, 834, 213, 213, 1331, 213, 213, 213, 213, + 1332, 213, 1330, 836, 213, 1333, 213, 1334, 1335, 213, + 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, + 1405, 1405, 1405, 1331, 1405, 213, 1405, 213, 1332, 1405, + 1405, 836, 213, 1333, 1405, 1334, 1335, 213, 575, 575, + 575, 575, 575, 575, 575, 575, 575, 575, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, 707, 707, + + 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 707, 707, 707, 707, 707, 707, 707, 707, 709, 709, + 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 709, 709, 709, 709, 709, 709, 213, 1336, + 213, 213, 213, 213, 937, 213, 213, 938, 213, 1337, + 213, 1405, 213, 213, 1279, 1279, 1405, 1338, 1405, 1355, + 1356, 1405, 940, 1405, 1405, 1405, 213, 1336, 213, 213, + 213, 213, 937, 213, 213, 938, 213, 1337, 213, 213, + 213, 213, 1405, 213, 213, 1338, 942, 1355, 1356, 213, + 940, 213, 941, 943, 1327, 1357, 213, 213, 213, 213, + + 944, 1358, 1405, 213, 1405, 213, 1405, 213, 1405, 1359, + 213, 213, 213, 213, 942, 1303, 1279, 213, 1362, 213, + 941, 943, 1327, 1357, 213, 213, 213, 213, 944, 1358, + 945, 213, 213, 213, 213, 946, 213, 1359, 213, 213, + 213, 213, 213, 213, 1354, 1354, 1362, 1405, 1405, 213, + 213, 1369, 213, 1370, 1405, 1341, 1373, 1405, 945, 213, + 213, 1376, 213, 946, 213, 213, 1405, 213, 213, 213, + 213, 213, 213, 1361, 1354, 213, 213, 213, 213, 1369, + 213, 1370, 213, 1341, 1373, 213, 213, 213, 1368, 1376, + 213, 947, 213, 213, 948, 213, 213, 213, 1405, 213, + + 213, 1378, 1405, 213, 213, 213, 213, 1405, 1405, 1405, + 213, 1405, 1380, 213, 213, 213, 1368, 1372, 213, 947, + 213, 213, 948, 213, 213, 949, 213, 213, 213, 1378, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 950, + 1380, 213, 952, 213, 1405, 1372, 213, 213, 213, 213, + 1405, 1382, 1384, 949, 213, 1405, 213, 1386, 213, 213, + 213, 1388, 1390, 213, 213, 213, 213, 950, 213, 213, + 952, 1392, 213, 1394, 213, 213, 213, 953, 213, 1382, + 1384, 213, 1396, 951, 1405, 1386, 1405, 213, 213, 1388, + 1390, 1405, 1398, 1405, 1405, 1405, 213, 213, 213, 1392, + + 213, 1394, 213, 1405, 1405, 953, 213, 1405, 213, 213, + 1396, 951, 955, 954, 213, 213, 213, 213, 213, 213, + 1398, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, + 213, 213, 956, 213, 1405, 1405, 213, 213, 213, 1405, + 955, 954, 213, 213, 1405, 213, 213, 213, 1405, 213, + 1405, 1405, 213, 1405, 1405, 213, 213, 1405, 213, 213, + 956, 213, 959, 213, 958, 213, 213, 213, 213, 213, + 1405, 213, 1405, 213, 213, 213, 957, 1405, 1405, 213, + 213, 213, 1405, 213, 213, 213, 213, 960, 213, 961, + 959, 213, 958, 213, 1405, 213, 213, 213, 213, 1405, + + 213, 213, 213, 213, 957, 213, 1405, 213, 213, 213, + 213, 213, 1405, 213, 213, 960, 213, 961, 962, 1405, + 963, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, + 1405, 213, 213, 1405, 1405, 1405, 962, 1405, 963, 1405, + 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, + 213, 1405, 213, 213, 213, 964, 1405, 1405, 1405, 213, + 213, 1405, 213, 213, 965, 213, 1405, 213, 1405, 213, + 213, 213, 213, 966, 1405, 213, 213, 213, 1405, 213, + 1405, 213, 1405, 964, 213, 1405, 967, 1405, 213, 213, + + 213, 213, 965, 213, 1405, 213, 1405, 213, 213, 213, + 213, 966, 1405, 213, 213, 213, 1405, 213, 213, 213, + 213, 969, 213, 1405, 967, 213, 968, 213, 1405, 970, + 213, 971, 213, 1405, 213, 213, 1405, 1405, 1405, 213, + 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 969, + 1405, 213, 213, 213, 968, 1405, 1405, 970, 213, 971, + 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, + 213, 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, + 213, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, + 1405, 213, 213, 213, 973, 974, 1405, 972, 1405, 213, + + 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, + 213, 213, 213, 975, 213, 1405, 213, 213, 1405, 213, + 213, 213, 973, 974, 213, 972, 1405, 213, 213, 213, + 213, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, + 1405, 975, 213, 976, 213, 213, 1405, 213, 213, 213, + 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, + 1405, 1405, 213, 1405, 1405, 213, 213, 213, 1405, 1405, + 213, 976, 213, 213, 1405, 213, 213, 213, 213, 213, + 1405, 1405, 213, 213, 977, 213, 213, 213, 213, 978, + 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, + + 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 977, 1405, 979, 213, 213, 978, 213, 213, + 213, 213, 213, 1405, 980, 213, 213, 213, 213, 1405, + 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 1405, + 1405, 213, 979, 213, 213, 213, 1405, 213, 982, 1405, + 1405, 213, 980, 213, 981, 213, 213, 1405, 1405, 983, + 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, + 213, 213, 213, 213, 984, 213, 982, 1405, 1405, 213, + 213, 213, 981, 213, 1405, 1405, 1405, 983, 213, 213, + 990, 1405, 1405, 213, 213, 1405, 213, 1405, 213, 213, + + 213, 213, 984, 213, 1405, 987, 213, 213, 213, 985, + 213, 213, 213, 1405, 213, 1405, 213, 213, 990, 1405, + 986, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, + 1405, 1405, 1405, 987, 213, 213, 1405, 985, 213, 213, + 213, 1405, 213, 1405, 213, 213, 1405, 1405, 986, 213, + 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, + 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, + 1405, 213, 213, 988, 1405, 1405, 1405, 213, 213, 213, + 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, + + 213, 988, 989, 213, 213, 213, 1405, 213, 213, 213, + 1405, 213, 1405, 213, 213, 213, 1405, 213, 991, 1405, + 992, 993, 213, 1405, 213, 213, 213, 213, 213, 1405, + 989, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, + 1405, 213, 213, 213, 1405, 213, 991, 1405, 992, 993, + 213, 1405, 1405, 213, 994, 213, 213, 213, 213, 213, + 213, 1405, 1405, 995, 213, 213, 213, 1405, 1405, 213, + 213, 1405, 1405, 1405, 213, 1405, 1405, 1405, 996, 213, + 1405, 1405, 994, 213, 213, 213, 213, 213, 213, 213, + 1405, 995, 213, 213, 213, 1405, 1405, 213, 213, 213, + + 998, 1405, 213, 997, 213, 213, 996, 213, 1405, 213, + 213, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, + 213, 1405, 213, 1405, 1405, 213, 213, 213, 998, 1405, + 213, 997, 213, 213, 1405, 1405, 213, 213, 213, 999, + 1405, 213, 1405, 213, 1405, 213, 213, 1405, 213, 1405, + 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, + 1405, 213, 213, 1405, 213, 1000, 213, 999, 1405, 213, + 1002, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, + 213, 213, 1405, 1405, 213, 1001, 213, 213, 1405, 213, + 213, 213, 1003, 1000, 213, 213, 213, 213, 1002, 1405, + + 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, + 1405, 213, 213, 1001, 213, 213, 1405, 1405, 1004, 213, + 1003, 1405, 213, 213, 213, 213, 213, 1005, 1405, 213, + 213, 213, 213, 1006, 1405, 213, 1405, 213, 1405, 213, + 213, 213, 213, 213, 1405, 1405, 1004, 1405, 213, 1405, + 213, 213, 213, 213, 213, 1005, 1405, 1405, 213, 213, + 213, 1006, 213, 213, 1405, 213, 213, 1405, 213, 213, + 213, 213, 213, 1405, 1405, 1007, 213, 1405, 1405, 213, + 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, + 213, 213, 213, 1008, 213, 213, 213, 213, 213, 1405, + + 213, 1009, 1010, 1007, 1405, 213, 1405, 213, 213, 1405, + 213, 1011, 1405, 213, 213, 213, 213, 213, 213, 213, + 213, 1008, 1405, 213, 213, 213, 213, 213, 1405, 1009, + 1010, 213, 1405, 213, 213, 213, 213, 213, 1405, 1011, + 213, 1405, 213, 1405, 213, 1405, 213, 213, 1012, 213, + 213, 1013, 213, 1015, 1405, 213, 213, 213, 1405, 213, + 213, 213, 213, 213, 1405, 213, 1405, 1405, 213, 1405, + 1405, 1014, 213, 213, 1405, 213, 1012, 213, 213, 1013, + 213, 1015, 213, 1405, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1014, + + 1016, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, + 213, 1405, 213, 213, 213, 213, 1405, 1405, 213, 1017, + 213, 213, 213, 213, 213, 213, 1018, 1405, 1016, 213, + 213, 213, 213, 1019, 213, 213, 1405, 213, 1405, 213, + 213, 213, 213, 213, 1405, 1405, 1405, 1017, 213, 1405, + 213, 213, 213, 213, 1018, 1405, 1405, 213, 1020, 213, + 213, 1019, 213, 213, 1405, 213, 213, 213, 213, 213, + 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1405, 213, + 213, 213, 213, 1405, 1405, 1405, 1020, 213, 1405, 1405, + 213, 213, 1405, 1405, 213, 1405, 213, 213, 1405, 213, + + 213, 213, 213, 1405, 213, 1405, 1021, 213, 1405, 1022, + 213, 213, 1023, 213, 213, 213, 1405, 1405, 1405, 1405, + 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, + 213, 1405, 213, 213, 1021, 1405, 1405, 1022, 1405, 213, + 1023, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, + 1405, 213, 213, 213, 1024, 1405, 213, 213, 213, 1405, + 1025, 213, 213, 1405, 213, 213, 1027, 1405, 1405, 213, + 213, 1026, 1405, 213, 213, 213, 1405, 213, 1405, 213, + 213, 1405, 1024, 1405, 213, 213, 213, 1405, 1025, 213, + 213, 1405, 213, 213, 1027, 1405, 1405, 213, 213, 1026, + + 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 1028, + 1030, 1029, 213, 213, 213, 1405, 213, 213, 213, 1405, + 213, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, + 213, 213, 1405, 1405, 1405, 1405, 213, 1028, 1030, 1029, + 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, + 213, 213, 1031, 213, 213, 1405, 213, 1405, 213, 213, + 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, + 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 1032, + 1031, 213, 213, 213, 213, 1405, 1405, 213, 213, 1033, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + + 213, 213, 213, 1405, 1405, 1405, 1405, 1032, 1405, 213, + 213, 213, 213, 213, 1405, 213, 1405, 1033, 213, 1405, + 1034, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, + 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 1405, 213, 213, 213, 1112, 1111, 1034, 1405, + 213, 1405, 213, 213, 213, 1405, 213, 1405, 1405, 213, + 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, + 1405, 213, 213, 213, 1112, 1111, 213, 1405, 213, 1405, + 1405, 213, 213, 1113, 213, 213, 213, 213, 1405, 213, + 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, + + 1114, 1405, 213, 213, 213, 213, 1405, 1405, 1115, 213, + 213, 1113, 213, 213, 213, 213, 213, 213, 1405, 1405, + 213, 213, 213, 213, 1116, 213, 1405, 1405, 1114, 213, + 213, 213, 213, 213, 1405, 213, 1115, 1117, 1405, 213, + 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, + 213, 1405, 1116, 213, 213, 1405, 1118, 213, 1405, 213, + 213, 213, 213, 213, 213, 1117, 213, 213, 213, 213, + 1119, 213, 213, 213, 213, 1121, 1405, 213, 1120, 213, + 1405, 1405, 213, 1405, 1118, 213, 1405, 213, 213, 213, + 213, 1405, 213, 1405, 213, 213, 213, 213, 1119, 1405, + + 213, 213, 213, 1121, 1405, 213, 1120, 213, 213, 1405, + 1122, 213, 1405, 213, 213, 213, 213, 1405, 1123, 1405, + 213, 213, 1405, 213, 213, 1405, 1405, 213, 1405, 213, + 1405, 213, 1405, 213, 213, 1405, 213, 1124, 1122, 213, + 1405, 1405, 213, 213, 1405, 1405, 1123, 213, 213, 213, + 1125, 1405, 213, 1405, 213, 213, 1127, 1405, 213, 213, + 213, 1126, 213, 213, 213, 1124, 213, 213, 213, 1405, + 1405, 213, 1405, 213, 213, 213, 213, 213, 1125, 1405, + 1405, 1405, 213, 1405, 1127, 1405, 213, 213, 213, 1126, + 1405, 213, 213, 213, 213, 213, 213, 1128, 1405, 213, + + 1405, 213, 213, 213, 213, 213, 1131, 213, 1405, 1405, + 213, 213, 213, 213, 1130, 213, 213, 213, 1405, 213, + 1405, 213, 1129, 1405, 213, 1128, 213, 213, 1405, 1405, + 1405, 213, 1405, 213, 1131, 213, 1405, 1132, 213, 213, + 213, 213, 1130, 213, 213, 213, 1405, 213, 1405, 1405, + 1129, 1405, 213, 213, 213, 213, 1133, 1405, 213, 213, + 213, 213, 213, 213, 1405, 1132, 213, 1405, 213, 213, + 213, 213, 213, 1134, 1135, 1405, 213, 1136, 213, 213, + 1405, 213, 213, 1405, 1133, 1405, 213, 213, 213, 213, + 213, 213, 1405, 1137, 213, 1405, 213, 213, 213, 213, + + 213, 1134, 1135, 1405, 213, 1136, 213, 213, 1405, 213, + 213, 1405, 1138, 1405, 213, 213, 213, 213, 213, 213, + 213, 1137, 1405, 1405, 213, 213, 213, 213, 1405, 1405, + 1405, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, + 1138, 213, 213, 213, 213, 213, 213, 213, 213, 1405, + 1405, 213, 213, 213, 213, 1405, 213, 1405, 1140, 1139, + 213, 213, 213, 213, 213, 1142, 213, 213, 1405, 213, + 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, + 213, 1405, 1405, 1405, 213, 1141, 1140, 1139, 213, 213, + 213, 1405, 1405, 1142, 213, 213, 1405, 1405, 213, 213, + + 213, 213, 213, 1405, 213, 213, 1143, 1144, 213, 1405, + 1405, 213, 213, 1141, 213, 1405, 1405, 1405, 213, 213, + 1405, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, + 1405, 1405, 1405, 213, 1143, 1144, 213, 1405, 213, 213, + 213, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, + 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, + 213, 213, 213, 1145, 213, 213, 213, 213, 1405, 1405, + 213, 213, 213, 1405, 213, 1405, 213, 1405, 1405, 213, + 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, + 213, 1145, 1405, 213, 1405, 213, 1405, 213, 213, 213, + + 213, 213, 213, 213, 213, 1146, 1147, 213, 1148, 213, + 213, 1149, 213, 213, 1405, 1405, 213, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 213, 213, 213, 1150, 213, + 213, 213, 213, 1146, 1147, 213, 1148, 213, 213, 1149, + 213, 213, 1405, 213, 213, 213, 1405, 1405, 1405, 1405, + 213, 1405, 1151, 1405, 213, 213, 1150, 213, 213, 213, + 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, + 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 213, + 1151, 213, 1405, 213, 213, 213, 213, 213, 213, 213, + 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, + + 213, 213, 213, 213, 213, 213, 1152, 213, 1153, 213, + 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1154, + 1405, 1405, 1405, 1405, 1405, 1405, 213, 1405, 1405, 213, + 213, 213, 213, 1405, 1152, 1405, 1153, 213, 213, 1405, + 1405, 213, 213, 213, 213, 213, 1405, 1154, 1405, 1405, + 213, 1155, 1405, 1156, 213, 213, 1405, 213, 213, 213, + 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 1405, 213, + 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1155, + 1405, 1156, 213, 213, 213, 213, 213, 213, 213, 213, + 1157, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, + + 1405, 213, 1405, 1158, 1405, 213, 213, 213, 1405, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 1157, 1405, + 1159, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, + 1405, 1158, 213, 213, 213, 213, 213, 213, 1405, 213, + 1405, 213, 213, 213, 1160, 213, 213, 1405, 1159, 213, + 213, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1161, + 213, 1405, 1405, 1405, 213, 213, 213, 1405, 1405, 213, + 213, 213, 1160, 213, 213, 213, 1173, 213, 213, 213, + 213, 213, 1163, 213, 213, 213, 213, 1161, 1162, 1405, + 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, + + 1405, 1164, 213, 213, 1173, 213, 1405, 213, 213, 213, + 1163, 213, 1165, 213, 213, 213, 1162, 1405, 213, 213, + 213, 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1164, + 213, 1405, 1405, 213, 1166, 213, 213, 1167, 213, 213, + 1165, 213, 213, 213, 1405, 213, 213, 213, 213, 213, + 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, + 1405, 213, 1166, 213, 1405, 1167, 213, 1168, 213, 213, + 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, + 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, + 1405, 1405, 1169, 1405, 213, 1168, 213, 213, 213, 1405, + + 213, 1405, 1405, 213, 213, 213, 213, 1170, 1405, 213, + 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, + 1169, 1405, 213, 213, 1405, 213, 213, 1405, 1171, 213, + 1172, 213, 213, 213, 213, 1170, 1405, 1405, 213, 213, + 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, + 1405, 213, 1405, 213, 213, 213, 1171, 213, 1172, 1174, + 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, + 213, 1405, 213, 1405, 1405, 213, 1175, 213, 1405, 1176, + 213, 213, 213, 213, 1405, 1405, 1405, 1174, 213, 1405, + 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1177, + + 1405, 1405, 213, 213, 1175, 1405, 1405, 1176, 213, 213, + 213, 1178, 213, 1405, 1405, 1405, 213, 213, 213, 1405, + 213, 213, 213, 1405, 213, 213, 213, 1177, 1405, 1405, + 213, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 1178, + 213, 1405, 1405, 1179, 213, 213, 1405, 213, 1405, 213, + 213, 1405, 213, 213, 213, 1180, 213, 1181, 213, 213, + 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, + 1405, 1179, 1405, 1405, 1405, 213, 213, 213, 213, 1405, + 213, 213, 213, 1180, 213, 1181, 213, 1182, 213, 213, + 213, 213, 213, 1405, 213, 213, 213, 1405, 1183, 1405, + + 1405, 1184, 1405, 1405, 213, 213, 213, 1405, 213, 213, + 213, 213, 213, 1405, 213, 1182, 213, 1405, 1405, 213, + 213, 213, 1405, 213, 213, 213, 1183, 1405, 1405, 1184, + 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, + 213, 1405, 213, 213, 213, 1405, 1405, 213, 1405, 213, + 1232, 213, 213, 213, 213, 213, 1405, 1233, 213, 213, + 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, + 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 1232, 213, + 1405, 213, 213, 213, 213, 1233, 213, 213, 213, 1234, + 213, 213, 213, 1235, 213, 213, 213, 213, 213, 213, + + 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, + 1405, 1237, 213, 213, 213, 213, 213, 1234, 1405, 213, + 213, 1235, 213, 1405, 213, 213, 213, 213, 213, 1405, + 213, 213, 213, 213, 213, 1236, 1405, 1405, 213, 1237, + 213, 213, 1405, 1238, 213, 213, 1405, 1405, 213, 1405, + 213, 1405, 213, 1405, 213, 213, 213, 213, 213, 213, + 1405, 213, 1405, 1236, 213, 1405, 213, 1405, 213, 213, + 1405, 1238, 213, 213, 213, 1405, 1405, 1241, 213, 213, + 1239, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, + 1240, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, + + 213, 213, 213, 1405, 1405, 1241, 1405, 213, 1239, 1405, + 1405, 1405, 213, 1242, 213, 213, 213, 213, 1240, 213, + 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, + 213, 1405, 213, 1405, 213, 213, 1243, 1244, 1405, 213, + 213, 1242, 1405, 213, 213, 1405, 1405, 213, 213, 213, + 1405, 1405, 1405, 213, 213, 1405, 213, 1405, 213, 213, + 213, 1405, 213, 213, 1243, 1244, 1405, 213, 213, 213, + 1405, 213, 213, 1405, 1245, 213, 213, 213, 1405, 1405, + 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, + 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, + + 1246, 1405, 1245, 1405, 213, 213, 1405, 1405, 1405, 213, + 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, + 1405, 1405, 213, 213, 213, 1405, 213, 213, 1246, 213, + 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, 1248, + 1405, 213, 1247, 213, 213, 213, 213, 1405, 1405, 213, + 213, 1405, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 1405, 213, 1405, 213, 213, 213, 1248, 1405, 213, + 1247, 213, 213, 213, 213, 1405, 213, 213, 213, 1249, + 213, 1405, 213, 213, 213, 1405, 1250, 1405, 213, 1405, + 213, 213, 213, 1251, 213, 1405, 1405, 1405, 213, 213, + + 1405, 213, 213, 213, 213, 1405, 213, 1249, 1405, 1405, + 213, 213, 1405, 1405, 1250, 213, 213, 213, 213, 213, + 213, 1251, 213, 213, 1405, 1405, 213, 213, 213, 1405, + 213, 213, 1405, 1405, 1405, 213, 1405, 213, 1405, 1405, + 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, + 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, + 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, + 213, 1405, 213, 213, 1405, 213, 1405, 213, 213, 213, + 213, 1405, 213, 1252, 213, 1405, 1405, 213, 213, 213, + 213, 1405, 213, 1253, 213, 213, 213, 213, 1405, 1405, + + 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 1405, + 1254, 1252, 213, 213, 213, 1405, 213, 213, 213, 213, + 213, 1253, 1405, 213, 213, 213, 213, 1405, 213, 213, + 213, 213, 1405, 1405, 213, 1255, 213, 1405, 1254, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 1405, + 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, + 1405, 1405, 213, 1255, 213, 1405, 1405, 213, 213, 1405, + 1256, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, + 1405, 213, 213, 213, 1405, 213, 213, 213, 1257, 1405, + 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 1256, 213, + + 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, + 213, 213, 1405, 213, 213, 213, 1257, 1405, 213, 1405, + 213, 1405, 1259, 1405, 213, 213, 213, 213, 213, 213, + 1405, 213, 1258, 213, 213, 1405, 213, 1260, 213, 213, + 1405, 1405, 1405, 213, 1405, 1405, 213, 1261, 1405, 1405, + 1259, 213, 213, 213, 213, 1405, 213, 213, 213, 213, + 1258, 213, 213, 1405, 213, 1260, 213, 213, 213, 1405, + 213, 213, 1263, 1405, 1405, 1261, 1405, 213, 1262, 213, + 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 1405, 1264, 1265, 213, 213, 213, 1405, 213, 213, + + 1263, 213, 213, 213, 213, 213, 1262, 1405, 213, 213, + 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, + 1264, 1265, 213, 1266, 1405, 1405, 1405, 213, 213, 213, + 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, + 1267, 213, 213, 1405, 213, 213, 213, 213, 213, 213, + 1268, 1266, 1405, 1405, 213, 213, 213, 1405, 1405, 213, + 213, 213, 213, 213, 213, 1405, 1405, 1405, 1267, 213, + 1405, 1405, 1405, 213, 213, 213, 213, 213, 1268, 1269, + 1405, 213, 213, 213, 1405, 1270, 213, 213, 213, 1405, + 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1271, + + 213, 1405, 213, 213, 1405, 213, 1405, 1269, 213, 213, + 213, 1405, 213, 1270, 213, 1405, 1405, 213, 1405, 213, + 1405, 213, 213, 213, 213, 1405, 213, 1271, 213, 1405, + 1272, 213, 1405, 213, 1405, 213, 213, 213, 213, 213, + 213, 213, 213, 1273, 1274, 213, 213, 213, 1405, 1405, + 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1272, 213, + 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, + 213, 1273, 1274, 213, 213, 213, 1405, 1405, 213, 213, + 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, + 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, + + 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 213, 1405, 213, 1276, 213, 213, 1275, 213, + 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, + 213, 213, 213, 1276, 213, 213, 1275, 213, 1405, 213, + 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, + 213, 1405, 213, 1405, 1405, 213, 1302, 213, 1405, 213, + 213, 1405, 1303, 1279, 213, 1405, 213, 1405, 1405, 213, + 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, + + 213, 1405, 1405, 213, 1302, 213, 1405, 1405, 213, 213, + 213, 1405, 1405, 213, 213, 213, 1304, 1405, 213, 213, + 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, + 213, 1305, 1405, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 1405, 213, 1304, 213, 1405, 213, 213, 1405, + 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 1305, + 213, 1306, 213, 213, 213, 213, 213, 213, 213, 1405, + 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, 1405, + 213, 213, 1405, 213, 213, 1307, 1405, 213, 213, 1306, + 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, + + 213, 213, 213, 1308, 213, 213, 213, 213, 213, 213, + 213, 213, 1405, 1307, 213, 213, 213, 1405, 213, 213, + 213, 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, + 213, 1308, 1405, 213, 213, 213, 1405, 1405, 213, 213, + 1405, 1405, 213, 213, 213, 1309, 1405, 1405, 213, 213, + 213, 1405, 213, 1405, 213, 213, 1405, 1405, 213, 213, + 213, 1405, 213, 1405, 213, 1310, 1405, 213, 1405, 1405, + 1405, 213, 213, 1309, 213, 1405, 213, 1311, 213, 213, + 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, + 213, 1405, 213, 1310, 213, 213, 213, 1405, 1405, 1405, + + 213, 213, 213, 1405, 213, 1311, 213, 213, 213, 213, + 213, 1405, 213, 1405, 213, 213, 1405, 213, 1405, 213, + 213, 213, 213, 1405, 213, 1312, 213, 1405, 1405, 213, + 1405, 213, 1405, 1405, 213, 1313, 213, 1405, 213, 213, + 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, + 1314, 1405, 1405, 1312, 213, 213, 1405, 1405, 1405, 213, + 213, 1405, 213, 1313, 1315, 1405, 1405, 213, 213, 213, + 1405, 1405, 213, 213, 213, 213, 1405, 213, 1314, 213, + 1405, 213, 213, 213, 1405, 1316, 213, 213, 213, 1405, + 213, 213, 1315, 1405, 213, 1405, 213, 213, 1405, 1405, + + 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, + 213, 1405, 1405, 1316, 213, 213, 1405, 1405, 213, 213, + 213, 1405, 213, 1405, 213, 213, 1317, 1405, 1405, 213, + 213, 1405, 1318, 213, 213, 213, 1405, 213, 1405, 213, + 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, 213, + 213, 1405, 213, 213, 1317, 1405, 1405, 213, 213, 1405, + 1318, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, + 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, + 213, 213, 1319, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 1405, 213, 213, 1405, 1405, 1320, 213, 213, + + 1405, 1405, 213, 213, 213, 1405, 213, 1321, 213, 213, + 1319, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, + 1405, 213, 213, 1405, 1405, 1320, 213, 213, 1405, 1323, + 213, 213, 213, 213, 213, 1321, 213, 213, 1322, 213, + 1405, 213, 213, 1324, 213, 1405, 213, 213, 213, 213, + 1405, 1405, 1405, 213, 213, 1405, 1405, 1323, 213, 1405, + 213, 213, 1405, 213, 213, 213, 1322, 213, 1405, 213, + 213, 1324, 213, 213, 213, 213, 213, 213, 213, 213, + 1405, 213, 213, 213, 213, 1346, 1405, 1340, 1405, 213, + 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, + + 1405, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, + 213, 213, 213, 1346, 213, 1340, 1405, 213, 213, 213, + 213, 1405, 213, 213, 213, 1342, 1405, 213, 213, 213, + 213, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, + 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, + 213, 1405, 213, 1342, 213, 1405, 213, 213, 213, 1405, + 213, 213, 213, 1405, 213, 213, 1343, 213, 213, 213, + 213, 1405, 213, 1405, 213, 213, 1405, 213, 213, 213, + 1344, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, + 1405, 1405, 213, 213, 1343, 1405, 213, 213, 213, 213, + + 213, 1405, 213, 213, 213, 213, 1405, 213, 1344, 213, + 213, 213, 213, 213, 1347, 213, 1405, 213, 1345, 213, + 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, + 1348, 213, 213, 213, 213, 213, 1405, 213, 213, 213, + 213, 1405, 1347, 213, 1405, 213, 1345, 213, 213, 213, + 213, 1405, 1405, 213, 213, 213, 213, 1405, 1348, 213, + 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, + 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, + 213, 213, 1405, 213, 213, 213, 1350, 1405, 213, 213, + 1349, 1405, 1405, 213, 213, 213, 213, 1405, 213, 213, + + 1351, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 1405, 213, 1405, 213, 1350, 1405, 213, 1405, 1349, 1405, + 1405, 213, 1405, 213, 213, 1352, 213, 1363, 1351, 213, + 213, 213, 1405, 213, 213, 1405, 213, 213, 1405, 213, + 1361, 1354, 1405, 1405, 213, 1405, 213, 213, 1405, 213, + 1405, 1405, 213, 1352, 213, 1363, 213, 1405, 213, 213, + 1405, 213, 213, 213, 213, 213, 213, 213, 1364, 1405, + 213, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, + 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, + 213, 213, 1405, 213, 213, 213, 1364, 1405, 213, 213, + + 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 1365, 213, 1405, + 1405, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, + 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, + 213, 213, 1405, 1405, 213, 1365, 213, 1405, 1405, 213, + 213, 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, + 213, 1405, 1405, 213, 1405, 213, 1366, 213, 1405, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, + 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, + 213, 213, 1405, 1405, 1366, 1405, 213, 213, 213, 213, + + 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, + 1405, 1405, 1405, 213, 1405, 1374, 213, 213, 213, 213, + 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 213, 1405, + 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 1405, + 1405, 213, 213, 1374, 213, 1405, 1405, 1405, 213, 1405, + 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, + 213, 1405, 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, + 213, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 92, 1405, 1405, 92, 92, 92, 92, 92, 92, + 92, 98, 98, 1405, 98, 106, 106, 106, 192, 1405, + + 192, 192, 192, 192, 192, 192, 192, 194, 194, 194, + 1405, 194, 194, 194, 194, 194, 194, 196, 1405, 196, + 196, 196, 196, 196, 196, 196, 196, 199, 1405, 199, + 199, 199, 199, 199, 199, 199, 199, 213, 1405, 213, + 213, 213, 213, 213, 213, 213, 213, 299, 1405, 299, + 299, 299, 299, 299, 299, 299, 299, 96, 1405, 96, + 304, 1405, 304, 307, 1405, 307, 575, 1405, 575, 577, + 1405, 577, 7, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405 + } ; + +static const flex_int16_t yy_chk[9253] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, + 10, 10, 16, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 16, 18, 19, 19, 19, 21, 21, + 23, 1402, 24, 1401, 23, 1400, 31, 32, 1399, 24, + 23, 1397, 18, 51, 51, 1395, 24, 44, 44, 24, + + 23, 1393, 24, 1391, 26, 25, 26, 1389, 23, 25, + 24, 26, 23, 25, 31, 32, 26, 24, 23, 25, + 18, 22, 25, 22, 24, 44, 44, 24, 23, 22, + 24, 22, 26, 25, 26, 22, 22, 25, 1387, 26, + 28, 25, 45, 1385, 26, 58, 28, 25, 1383, 22, + 25, 22, 29, 52, 52, 1381, 58, 22, 37, 22, + 29, 63, 63, 22, 22, 27, 29, 33, 28, 37, + 45, 33, 1379, 27, 28, 37, 27, 33, 96, 27, + 29, 97, 27, 30, 107, 27, 37, 1377, 29, 30, + 30, 30, 1375, 27, 29, 33, 30, 37, 34, 33, + + 35, 27, 34, 37, 27, 33, 96, 27, 34, 97, + 27, 30, 107, 27, 35, 90, 90, 30, 30, 30, + 35, 35, 1371, 36, 30, 1367, 34, 1360, 35, 39, + 34, 36, 43, 39, 108, 36, 34, 39, 36, 36, + 43, 111, 35, 39, 1353, 42, 1339, 42, 35, 35, + 42, 36, 61, 61, 61, 99, 99, 39, 98, 36, + 43, 39, 108, 36, 1325, 39, 36, 36, 43, 111, + 1301, 39, 40, 42, 40, 42, 98, 40, 42, 112, + 40, 114, 40, 115, 40, 40, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 1277, 118, 109, 1231, + + 40, 1185, 40, 1110, 98, 40, 109, 112, 40, 114, + 40, 115, 40, 40, 41, 1035, 121, 70, 41, 70, + 125, 41, 41, 70, 70, 118, 109, 110, 41, 70, + 110, 41, 197, 197, 109, 303, 303, 305, 305, 1193, + 1193, 936, 41, 120, 121, 70, 41, 70, 125, 41, + 41, 70, 70, 120, 126, 110, 41, 70, 110, 41, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 120, 127, 128, 128, 837, 113, 113, 60, 1326, + 1326, 120, 126, 705, 573, 438, 302, 299, 208, 202, + 113, 199, 119, 119, 119, 71, 119, 192, 129, 71, + + 127, 128, 128, 71, 113, 113, 60, 64, 64, 71, + 64, 64, 64, 64, 64, 64, 64, 64, 113, 71, + 119, 119, 119, 71, 119, 117, 129, 71, 64, 64, + 64, 71, 117, 122, 64, 73, 64, 71, 122, 73, + 131, 132, 64, 133, 64, 73, 134, 71, 64, 64, + 101, 135, 134, 117, 95, 73, 136, 92, 64, 89, + 117, 122, 64, 73, 64, 88, 122, 73, 131, 132, + 64, 133, 64, 73, 134, 137, 64, 64, 74, 135, + 134, 62, 74, 73, 136, 64, 65, 65, 74, 65, + 65, 65, 65, 65, 65, 65, 65, 56, 74, 138, + + 54, 75, 140, 137, 53, 75, 74, 65, 65, 65, + 74, 75, 141, 143, 65, 76, 74, 144, 65, 76, + 49, 75, 146, 147, 65, 76, 74, 138, 80, 75, + 140, 148, 80, 75, 65, 76, 47, 65, 80, 75, + 141, 143, 65, 76, 20, 144, 65, 76, 80, 75, + 146, 147, 65, 76, 14, 139, 80, 11, 139, 148, + 80, 7, 65, 76, 65, 66, 80, 81, 4, 66, + 149, 81, 66, 66, 3, 81, 80, 152, 150, 66, + 150, 81, 66, 139, 0, 66, 139, 153, 85, 66, + 0, 81, 85, 66, 0, 81, 85, 66, 149, 81, + + 66, 66, 85, 81, 0, 152, 150, 66, 150, 81, + 66, 155, 85, 66, 0, 153, 85, 66, 67, 81, + 85, 84, 67, 84, 85, 84, 67, 154, 84, 157, + 85, 156, 67, 84, 156, 67, 0, 154, 158, 155, + 85, 0, 67, 0, 159, 0, 67, 0, 161, 84, + 67, 84, 0, 84, 67, 154, 84, 157, 0, 156, + 67, 84, 156, 67, 86, 154, 158, 86, 86, 87, + 67, 68, 159, 87, 86, 68, 161, 162, 68, 87, + 68, 68, 124, 124, 86, 68, 124, 163, 164, 87, + 68, 68, 86, 0, 165, 86, 86, 87, 0, 68, + + 0, 87, 86, 68, 0, 162, 68, 87, 68, 68, + 124, 124, 86, 68, 124, 163, 164, 87, 68, 68, + 69, 123, 165, 123, 167, 169, 123, 69, 69, 0, + 171, 69, 123, 0, 69, 174, 175, 69, 166, 123, + 69, 0, 166, 176, 130, 177, 130, 0, 69, 123, + 130, 123, 167, 169, 123, 69, 69, 130, 171, 69, + 123, 130, 69, 174, 175, 69, 166, 123, 69, 72, + 166, 176, 130, 177, 130, 72, 72, 72, 130, 151, + 178, 151, 72, 145, 180, 130, 0, 72, 0, 130, + 0, 0, 151, 145, 0, 0, 0, 72, 145, 145, + + 0, 168, 0, 72, 72, 72, 168, 151, 178, 151, + 72, 145, 180, 170, 168, 72, 77, 179, 173, 168, + 151, 145, 172, 77, 170, 181, 145, 145, 179, 168, + 77, 172, 173, 77, 168, 182, 77, 77, 0, 172, + 0, 170, 168, 0, 77, 179, 173, 168, 183, 185, + 172, 77, 170, 181, 186, 0, 179, 188, 77, 172, + 173, 77, 184, 182, 77, 77, 78, 172, 183, 184, + 188, 78, 184, 78, 189, 187, 183, 185, 190, 78, + 78, 187, 186, 78, 191, 188, 78, 78, 0, 0, + 184, 0, 0, 0, 78, 0, 183, 184, 188, 78, + + 184, 78, 189, 187, 304, 0, 190, 78, 78, 187, + 0, 78, 191, 0, 78, 78, 79, 224, 213, 224, + 214, 214, 213, 79, 224, 214, 310, 79, 213, 224, + 79, 214, 304, 79, 312, 313, 79, 0, 213, 0, + 315, 214, 0, 0, 79, 224, 213, 224, 214, 214, + 213, 79, 224, 214, 310, 79, 213, 224, 79, 214, + 317, 79, 312, 313, 79, 82, 213, 82, 315, 214, + 82, 82, 0, 82, 216, 82, 216, 82, 82, 0, + 222, 216, 216, 0, 222, 318, 216, 82, 317, 0, + 222, 0, 0, 82, 0, 82, 0, 0, 82, 82, + + 222, 82, 216, 82, 216, 82, 82, 215, 222, 216, + 216, 215, 222, 318, 216, 82, 83, 215, 222, 218, + 83, 218, 215, 83, 83, 218, 218, 215, 222, 319, + 83, 218, 320, 83, 321, 215, 322, 324, 325, 215, + 83, 0, 0, 0, 83, 215, 0, 218, 83, 218, + 215, 83, 83, 218, 218, 215, 326, 319, 83, 218, + 320, 83, 321, 0, 322, 324, 325, 0, 83, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 0, + 327, 328, 0, 0, 326, 329, 203, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 330, 232, 234, + + 232, 234, 331, 332, 0, 232, 234, 232, 327, 328, + 232, 234, 333, 329, 203, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 330, 232, 234, 232, 234, + 331, 332, 204, 232, 234, 232, 0, 0, 232, 234, + 333, 0, 0, 0, 334, 238, 239, 238, 239, 335, + 336, 0, 238, 239, 338, 339, 340, 238, 239, 0, + 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 334, 238, 239, 238, 239, 335, 336, 205, + 238, 239, 338, 339, 340, 238, 239, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 0, 342, 0, + + 0, 343, 0, 0, 0, 0, 0, 205, 206, 206, + 0, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 217, 219, 221, 217, 323, 342, 323, 221, 343, + 221, 219, 217, 219, 217, 221, 344, 223, 219, 217, + 221, 223, 323, 219, 217, 0, 0, 223, 345, 217, + 219, 221, 217, 323, 0, 323, 221, 223, 221, 219, + 217, 219, 217, 221, 344, 223, 219, 217, 221, 223, + 323, 219, 217, 220, 220, 223, 345, 225, 347, 220, + 348, 220, 337, 349, 350, 223, 220, 220, 225, 0, + 225, 220, 351, 0, 0, 225, 352, 337, 0, 0, + + 225, 220, 220, 0, 0, 225, 347, 220, 348, 220, + 337, 349, 350, 0, 220, 220, 225, 227, 225, 220, + 351, 227, 228, 225, 352, 337, 228, 227, 225, 226, + 226, 226, 228, 226, 0, 228, 226, 227, 353, 0, + 354, 226, 228, 355, 0, 227, 356, 358, 359, 227, + 228, 360, 229, 0, 228, 227, 229, 226, 226, 226, + 228, 226, 229, 228, 226, 227, 353, 229, 354, 226, + 228, 355, 229, 0, 356, 358, 359, 233, 0, 360, + 229, 233, 361, 236, 229, 0, 0, 233, 362, 0, + 229, 0, 236, 363, 236, 229, 0, 233, 240, 236, + + 229, 230, 240, 230, 236, 233, 230, 364, 240, 233, + 361, 236, 230, 242, 230, 233, 362, 242, 240, 230, + 236, 363, 236, 242, 230, 233, 240, 236, 0, 230, + 240, 230, 236, 242, 230, 364, 240, 0, 365, 366, + 230, 242, 230, 367, 368, 242, 240, 230, 357, 369, + 370, 242, 230, 231, 372, 231, 357, 373, 375, 231, + 231, 242, 241, 231, 241, 231, 365, 366, 241, 241, + 376, 367, 368, 0, 241, 0, 357, 369, 370, 371, + 0, 231, 372, 231, 357, 373, 375, 231, 231, 371, + 241, 231, 241, 231, 235, 235, 241, 241, 376, 243, + + 377, 243, 241, 235, 244, 235, 243, 371, 244, 378, + 235, 243, 380, 381, 244, 235, 0, 371, 0, 382, + 379, 0, 235, 235, 244, 384, 385, 243, 377, 243, + 379, 235, 244, 235, 243, 387, 244, 378, 235, 243, + 380, 381, 244, 235, 237, 245, 237, 382, 379, 245, + 237, 0, 244, 384, 385, 245, 237, 237, 379, 388, + 0, 237, 0, 387, 389, 245, 237, 0, 247, 246, + 247, 246, 237, 245, 237, 247, 246, 245, 237, 246, + 247, 246, 0, 245, 237, 237, 390, 388, 249, 237, + 249, 0, 389, 245, 237, 249, 247, 246, 247, 246, + + 249, 250, 0, 247, 246, 250, 391, 246, 247, 246, + 248, 250, 248, 253, 390, 253, 249, 248, 249, 248, + 253, 250, 248, 249, 392, 253, 251, 393, 249, 250, + 251, 0, 0, 250, 391, 395, 251, 251, 248, 250, + 248, 253, 0, 253, 0, 248, 251, 248, 253, 250, + 248, 0, 392, 253, 251, 393, 254, 0, 251, 394, + 254, 0, 0, 395, 251, 251, 254, 0, 0, 255, + 260, 397, 260, 255, 251, 252, 254, 260, 394, 255, + 398, 399, 260, 252, 254, 252, 400, 394, 254, 255, + 252, 252, 256, 256, 254, 252, 256, 255, 260, 397, + + 260, 255, 256, 252, 254, 260, 394, 255, 398, 399, + 260, 252, 256, 252, 400, 0, 396, 255, 252, 252, + 256, 256, 401, 252, 256, 259, 402, 259, 261, 396, + 256, 259, 259, 0, 403, 404, 261, 259, 261, 405, + 256, 257, 406, 261, 396, 257, 407, 257, 261, 257, + 401, 257, 408, 259, 402, 259, 261, 396, 0, 259, + 259, 257, 403, 404, 261, 259, 261, 405, 410, 257, + 406, 261, 411, 257, 407, 257, 261, 257, 412, 257, + 408, 413, 414, 415, 416, 0, 262, 417, 262, 257, + 258, 418, 258, 262, 262, 264, 410, 264, 262, 419, + + 411, 258, 264, 258, 420, 422, 412, 264, 258, 413, + 414, 415, 416, 258, 262, 417, 262, 0, 258, 418, + 258, 262, 262, 264, 0, 264, 262, 419, 423, 258, + 264, 258, 420, 422, 265, 264, 258, 423, 0, 0, + 424, 258, 263, 0, 263, 265, 0, 265, 0, 263, + 263, 0, 265, 263, 263, 0, 423, 265, 266, 425, + 426, 425, 265, 0, 266, 423, 266, 267, 424, 267, + 263, 266, 263, 265, 267, 265, 266, 263, 263, 267, + 265, 263, 263, 268, 427, 265, 266, 425, 426, 425, + 0, 268, 266, 268, 266, 267, 428, 267, 268, 266, + + 429, 430, 267, 268, 266, 270, 269, 267, 269, 270, + 431, 268, 427, 269, 269, 270, 432, 0, 269, 268, + 0, 268, 0, 0, 428, 270, 268, 0, 429, 430, + 0, 268, 434, 270, 269, 271, 269, 270, 431, 271, + 435, 269, 269, 270, 432, 271, 269, 433, 271, 578, + 272, 433, 273, 270, 272, 271, 273, 579, 272, 274, + 434, 274, 273, 271, 272, 580, 274, 271, 435, 581, + 582, 274, 273, 271, 272, 433, 271, 578, 272, 433, + 273, 583, 272, 271, 273, 579, 272, 274, 0, 274, + 273, 584, 272, 580, 274, 0, 0, 581, 582, 274, + + 273, 0, 272, 275, 585, 276, 0, 586, 275, 583, + 276, 0, 276, 277, 275, 277, 275, 276, 588, 584, + 277, 275, 276, 278, 277, 277, 275, 278, 591, 278, + 592, 275, 585, 276, 278, 586, 275, 593, 276, 278, + 276, 277, 275, 277, 275, 276, 588, 0, 277, 275, + 276, 278, 277, 277, 275, 278, 591, 278, 592, 594, + 596, 0, 278, 0, 597, 593, 280, 278, 279, 598, + 280, 281, 599, 601, 280, 281, 602, 279, 0, 279, + 280, 281, 0, 0, 279, 279, 0, 594, 596, 279, + 280, 281, 597, 0, 280, 603, 279, 598, 280, 281, + + 599, 601, 280, 281, 602, 279, 282, 279, 280, 281, + 282, 283, 279, 279, 282, 283, 604, 279, 280, 281, + 282, 283, 285, 603, 283, 285, 605, 0, 0, 285, + 282, 283, 284, 0, 282, 285, 284, 0, 282, 283, + 284, 606, 282, 283, 604, 285, 284, 607, 282, 283, + 285, 287, 283, 285, 605, 287, 284, 285, 282, 283, + 284, 287, 608, 285, 284, 286, 286, 286, 284, 606, + 0, 287, 286, 285, 284, 607, 0, 286, 288, 287, + 609, 289, 288, 287, 284, 289, 288, 612, 288, 287, + 608, 289, 289, 286, 286, 286, 0, 613, 288, 287, + + 286, 289, 614, 615, 290, 286, 288, 616, 609, 289, + 288, 290, 617, 289, 288, 612, 288, 618, 290, 289, + 289, 290, 292, 292, 290, 613, 288, 292, 0, 289, + 614, 615, 290, 292, 619, 616, 621, 293, 0, 290, + 617, 293, 622, 292, 623, 618, 290, 293, 0, 290, + 292, 292, 290, 291, 0, 292, 291, 293, 0, 0, + 291, 292, 619, 291, 621, 293, 291, 624, 0, 293, + 622, 292, 623, 627, 0, 293, 291, 628, 0, 0, + 294, 291, 294, 630, 291, 293, 294, 294, 291, 295, + 0, 291, 294, 295, 291, 624, 296, 0, 0, 295, + + 296, 627, 295, 297, 291, 628, 296, 297, 294, 295, + 294, 630, 632, 297, 294, 294, 296, 295, 297, 633, + 294, 295, 445, 297, 296, 298, 445, 295, 296, 298, + 295, 297, 445, 298, 296, 297, 449, 295, 449, 298, + 632, 297, 445, 449, 296, 634, 297, 633, 449, 298, + 445, 297, 635, 298, 445, 0, 0, 298, 0, 0, + 445, 298, 0, 0, 449, 0, 449, 298, 0, 0, + 445, 449, 0, 634, 636, 637, 449, 298, 439, 439, + 635, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 440, 440, 440, 440, 440, 440, 440, 440, 440, + + 440, 640, 636, 637, 644, 646, 647, 649, 440, 442, + 442, 442, 442, 442, 442, 442, 442, 442, 442, 443, + 443, 443, 443, 443, 443, 443, 443, 443, 443, 640, + 651, 0, 644, 646, 647, 649, 440, 441, 441, 652, + 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, + 446, 447, 448, 0, 446, 447, 448, 450, 651, 450, + 446, 447, 448, 451, 450, 653, 0, 652, 0, 450, + 446, 447, 448, 0, 451, 0, 451, 0, 446, 447, + 448, 451, 446, 447, 448, 450, 451, 450, 446, 447, + 448, 451, 450, 653, 452, 0, 452, 450, 446, 447, + + 448, 452, 451, 453, 451, 638, 452, 453, 454, 451, + 0, 0, 454, 453, 451, 0, 638, 655, 454, 656, + 0, 0, 452, 453, 452, 457, 657, 457, 454, 452, + 0, 453, 457, 638, 452, 453, 454, 457, 456, 455, + 454, 453, 456, 455, 638, 655, 454, 656, 456, 455, + 0, 453, 658, 457, 657, 457, 454, 455, 456, 455, + 457, 458, 0, 458, 660, 457, 456, 455, 458, 661, + 456, 455, 0, 458, 0, 0, 456, 455, 650, 650, + 658, 663, 0, 0, 664, 455, 456, 455, 665, 458, + 460, 458, 660, 666, 460, 461, 458, 661, 668, 461, + + 460, 458, 459, 460, 459, 461, 650, 650, 459, 663, + 460, 461, 664, 0, 459, 461, 665, 0, 460, 459, + 0, 666, 460, 461, 459, 669, 668, 461, 460, 670, + 459, 460, 459, 461, 671, 0, 459, 672, 460, 461, + 462, 463, 459, 461, 462, 463, 0, 459, 462, 0, + 462, 463, 459, 669, 464, 674, 463, 670, 464, 0, + 462, 463, 671, 465, 464, 672, 0, 465, 462, 463, + 675, 465, 462, 463, 464, 676, 462, 465, 462, 463, + 677, 0, 464, 674, 463, 0, 464, 465, 462, 463, + 680, 465, 464, 681, 466, 465, 466, 682, 675, 465, + + 468, 466, 464, 676, 468, 465, 466, 467, 677, 467, + 468, 683, 684, 467, 467, 465, 0, 0, 680, 467, + 468, 681, 466, 0, 466, 682, 687, 0, 468, 466, + 688, 0, 468, 690, 466, 467, 691, 467, 468, 683, + 684, 467, 467, 469, 470, 469, 470, 467, 468, 471, + 469, 470, 692, 471, 687, 469, 470, 0, 688, 471, + 693, 690, 472, 694, 691, 695, 472, 0, 0, 471, + 472, 469, 470, 469, 470, 696, 472, 471, 469, 470, + 692, 471, 0, 469, 470, 473, 472, 471, 693, 473, + 472, 694, 475, 695, 472, 473, 475, 471, 472, 697, + + 473, 0, 475, 696, 472, 473, 477, 0, 0, 474, + 477, 474, 475, 473, 472, 474, 477, 473, 698, 0, + 475, 474, 478, 473, 475, 478, 477, 697, 473, 478, + 475, 474, 476, 473, 477, 478, 476, 474, 477, 474, + 475, 700, 476, 474, 477, 478, 698, 476, 702, 474, + 478, 479, 476, 478, 477, 479, 704, 478, 0, 474, + 476, 479, 479, 478, 476, 840, 842, 844, 480, 700, + 476, 479, 480, 478, 0, 476, 702, 481, 480, 479, + 476, 481, 482, 479, 704, 845, 482, 481, 480, 479, + 479, 846, 482, 840, 842, 844, 480, 481, 847, 479, + + 480, 848, 482, 483, 0, 481, 480, 483, 484, 481, + 482, 483, 484, 845, 482, 481, 480, 483, 484, 846, + 482, 849, 850, 851, 852, 481, 847, 483, 484, 848, + 482, 483, 485, 0, 485, 483, 484, 854, 485, 483, + 484, 486, 855, 486, 485, 483, 484, 856, 486, 849, + 850, 851, 852, 486, 485, 483, 484, 0, 0, 857, + 485, 487, 485, 487, 858, 854, 485, 0, 487, 486, + 855, 486, 485, 487, 859, 856, 486, 0, 488, 861, + 488, 486, 485, 862, 488, 488, 489, 857, 489, 487, + 488, 487, 858, 489, 863, 490, 487, 864, 489, 490, + + 0, 487, 859, 0, 865, 490, 488, 861, 488, 866, + 867, 862, 488, 488, 489, 490, 489, 0, 488, 868, + 491, 489, 863, 490, 491, 864, 489, 490, 491, 492, + 0, 492, 865, 490, 491, 869, 492, 866, 867, 870, + 871, 492, 0, 490, 491, 493, 874, 868, 491, 493, + 494, 0, 491, 493, 494, 493, 491, 492, 494, 492, + 494, 0, 491, 869, 492, 493, 875, 870, 871, 492, + 494, 876, 491, 493, 874, 877, 0, 493, 494, 496, + 878, 493, 494, 493, 0, 495, 494, 495, 494, 496, + 0, 496, 495, 493, 875, 0, 496, 495, 494, 876, + + 0, 496, 497, 877, 497, 879, 882, 496, 878, 497, + 885, 497, 498, 495, 497, 495, 498, 496, 498, 496, + 495, 0, 886, 498, 496, 495, 0, 0, 498, 496, + 497, 888, 497, 879, 882, 0, 891, 497, 885, 497, + 498, 894, 497, 499, 498, 500, 498, 499, 501, 500, + 886, 498, 501, 499, 887, 500, 498, 887, 501, 888, + 500, 501, 895, 499, 891, 500, 0, 0, 501, 894, + 0, 499, 0, 500, 896, 499, 501, 500, 897, 0, + 501, 499, 887, 500, 898, 887, 501, 0, 500, 501, + 895, 499, 0, 500, 502, 503, 501, 504, 502, 503, + + 502, 504, 896, 899, 502, 503, 897, 504, 902, 0, + 0, 903, 898, 0, 502, 503, 0, 504, 904, 0, + 505, 905, 502, 503, 505, 504, 502, 503, 502, 504, + 505, 899, 502, 503, 506, 504, 902, 507, 506, 903, + 505, 507, 502, 503, 506, 504, 904, 507, 505, 905, + 906, 508, 505, 0, 506, 508, 908, 507, 505, 909, + 910, 508, 506, 0, 912, 507, 506, 508, 505, 507, + 0, 508, 506, 913, 509, 507, 509, 0, 906, 508, + 914, 509, 506, 508, 908, 507, 509, 909, 910, 508, + 512, 510, 912, 510, 512, 508, 915, 917, 510, 508, + + 512, 913, 509, 510, 509, 511, 918, 511, 914, 509, + 512, 919, 511, 511, 509, 920, 921, 511, 512, 510, + 922, 510, 512, 0, 915, 917, 510, 923, 512, 0, + 924, 510, 513, 511, 918, 511, 513, 0, 512, 919, + 511, 511, 513, 920, 921, 511, 514, 514, 922, 925, + 927, 514, 513, 0, 928, 923, 929, 514, 924, 931, + 513, 516, 932, 516, 513, 516, 933, 514, 0, 1036, + 513, 516, 0, 0, 514, 514, 0, 925, 927, 514, + 513, 516, 928, 0, 929, 514, 0, 931, 1038, 516, + 932, 516, 0, 516, 933, 514, 515, 1036, 518, 516, + + 515, 517, 518, 517, 515, 517, 515, 0, 518, 516, + 515, 517, 0, 0, 518, 519, 1038, 0, 518, 519, + 515, 517, 0, 0, 515, 519, 518, 0, 515, 517, + 518, 517, 515, 517, 515, 519, 518, 1040, 515, 517, + 520, 521, 518, 519, 520, 521, 518, 519, 515, 517, + 520, 521, 1041, 519, 522, 520, 1042, 521, 522, 1043, + 520, 521, 1045, 519, 522, 1040, 0, 523, 520, 521, + 0, 523, 520, 521, 522, 523, 0, 0, 520, 521, + 1041, 523, 522, 520, 1042, 521, 522, 1043, 520, 521, + 1045, 523, 522, 0, 524, 523, 524, 1047, 525, 523, + + 525, 524, 522, 523, 525, 525, 524, 1048, 1049, 523, + 525, 526, 0, 526, 1050, 0, 0, 527, 526, 523, + 1051, 527, 524, 526, 524, 1047, 525, 527, 525, 524, + 1053, 1055, 525, 525, 524, 1048, 1049, 527, 525, 526, + 528, 526, 1050, 529, 528, 527, 526, 529, 1051, 527, + 528, 526, 1057, 529, 1060, 527, 529, 1062, 1053, 1055, + 528, 0, 1063, 529, 0, 527, 1064, 531, 528, 531, + 1065, 529, 528, 1072, 531, 529, 0, 0, 528, 531, + 1057, 529, 1060, 0, 529, 1062, 1073, 0, 528, 536, + 1063, 529, 530, 536, 1064, 531, 530, 531, 1065, 536, + + 530, 1072, 531, 533, 533, 533, 530, 531, 1074, 536, + 533, 530, 0, 1077, 1073, 533, 530, 536, 1079, 0, + 530, 536, 0, 1081, 530, 1083, 0, 536, 530, 1084, + 0, 533, 533, 533, 530, 534, 1074, 536, 533, 530, + 534, 1077, 534, 533, 530, 532, 1079, 534, 535, 0, + 535, 1081, 534, 1083, 532, 535, 532, 1084, 532, 1085, + 535, 532, 1086, 534, 0, 1087, 532, 1088, 534, 1090, + 534, 1091, 1092, 532, 0, 534, 535, 537, 535, 0, + 534, 537, 532, 535, 532, 537, 532, 1085, 535, 532, + 1086, 537, 538, 1087, 532, 1088, 538, 1090, 1093, 1091, + + 1092, 537, 538, 0, 0, 537, 1095, 538, 1097, 537, + 1099, 539, 538, 537, 539, 539, 540, 1100, 540, 537, + 538, 539, 1101, 540, 538, 541, 1093, 541, 540, 537, + 538, 539, 541, 0, 1095, 538, 1097, 541, 1099, 539, + 538, 1102, 539, 539, 540, 1100, 540, 0, 542, 539, + 1101, 540, 542, 541, 0, 541, 540, 543, 542, 539, + 541, 543, 544, 0, 0, 541, 544, 543, 542, 1102, + 0, 545, 544, 0, 0, 545, 542, 543, 0, 0, + 542, 545, 544, 0, 0, 543, 542, 1103, 546, 543, + 544, 545, 546, 0, 544, 543, 542, 0, 546, 545, + + 544, 546, 548, 545, 1108, 543, 548, 547, 546, 545, + 544, 547, 548, 548, 1109, 1103, 546, 547, 1190, 545, + 546, 549, 548, 549, 0, 547, 546, 547, 549, 546, + 548, 0, 1108, 549, 548, 547, 546, 0, 0, 547, + 548, 548, 1109, 0, 0, 547, 1190, 0, 0, 549, + 548, 549, 550, 547, 550, 547, 549, 0, 1194, 550, + 550, 549, 0, 551, 550, 551, 552, 0, 552, 1195, + 551, 551, 553, 552, 553, 551, 553, 1198, 552, 553, + 550, 1199, 550, 555, 553, 555, 1194, 550, 550, 0, + 555, 551, 550, 551, 552, 555, 552, 1195, 551, 551, + + 553, 552, 553, 551, 553, 1198, 552, 553, 554, 1199, + 554, 555, 553, 555, 0, 554, 554, 556, 555, 0, + 554, 556, 557, 555, 0, 1200, 557, 556, 558, 0, + 558, 0, 557, 0, 1204, 558, 554, 556, 554, 0, + 558, 1207, 557, 554, 554, 556, 1208, 560, 554, 556, + 557, 560, 559, 1200, 557, 556, 558, 560, 558, 559, + 557, 559, 1204, 558, 0, 556, 559, 560, 558, 1207, + 557, 559, 561, 562, 1208, 560, 561, 562, 1211, 560, + 559, 0, 561, 562, 561, 560, 1212, 559, 1213, 559, + 0, 1214, 561, 562, 559, 560, 564, 1217, 564, 559, + + 561, 562, 1218, 564, 561, 562, 1211, 1219, 564, 563, + 561, 562, 561, 563, 1212, 1222, 1213, 563, 566, 1214, + 561, 562, 1224, 563, 564, 1217, 564, 566, 712, 566, + 1218, 564, 712, 563, 566, 1219, 564, 563, 712, 566, + 565, 563, 565, 1222, 1225, 563, 566, 565, 712, 565, + 1224, 563, 565, 0, 0, 566, 712, 566, 0, 0, + 712, 563, 566, 0, 0, 1226, 712, 566, 565, 1227, + 565, 567, 1225, 567, 1228, 565, 712, 565, 567, 568, + 565, 568, 567, 567, 1278, 1281, 568, 568, 569, 1285, + 569, 568, 570, 1226, 569, 569, 570, 1227, 570, 567, + + 569, 567, 1228, 570, 1286, 0, 567, 568, 570, 568, + 567, 567, 1278, 1281, 568, 568, 569, 1285, 569, 568, + 570, 0, 569, 569, 570, 1289, 570, 571, 569, 571, + 1290, 570, 1286, 571, 571, 1291, 570, 1292, 1296, 571, + 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, + 0, 0, 0, 1289, 0, 571, 0, 571, 1290, 0, + 0, 571, 571, 1291, 0, 1292, 1296, 571, 575, 575, + 575, 575, 575, 575, 575, 575, 575, 575, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, 706, 706, + + 706, 706, 706, 706, 706, 706, 706, 706, 707, 707, + 707, 707, 707, 707, 707, 707, 707, 707, 708, 708, + 708, 708, 708, 708, 708, 708, 708, 708, 709, 709, + 709, 709, 709, 709, 709, 709, 709, 709, 710, 1297, + 710, 711, 713, 711, 710, 710, 713, 711, 711, 1298, + 710, 0, 713, 711, 1279, 1279, 0, 1300, 0, 1327, + 1328, 0, 713, 0, 0, 0, 710, 1297, 710, 711, + 713, 711, 710, 710, 713, 711, 711, 1298, 710, 714, + 713, 711, 0, 714, 715, 1300, 715, 1327, 1328, 714, + 713, 715, 714, 716, 1279, 1331, 715, 716, 717, 714, + + 717, 1334, 0, 716, 0, 717, 0, 714, 0, 1337, + 717, 714, 715, 716, 715, 1303, 1303, 714, 1341, 715, + 714, 716, 1279, 1331, 715, 716, 717, 714, 717, 1334, + 718, 716, 719, 717, 718, 720, 719, 1337, 717, 720, + 718, 716, 719, 720, 1354, 1354, 1341, 0, 0, 720, + 718, 1355, 719, 1359, 0, 1303, 1362, 0, 718, 720, + 719, 1368, 718, 720, 719, 721, 0, 720, 718, 721, + 719, 720, 722, 1361, 1361, 721, 722, 720, 718, 1355, + 719, 1359, 722, 1303, 1362, 721, 724, 720, 1354, 1368, + 724, 723, 722, 721, 724, 723, 724, 721, 0, 723, + + 722, 1372, 0, 721, 722, 723, 724, 0, 0, 0, + 722, 0, 1376, 721, 724, 723, 1354, 1361, 724, 723, + 722, 725, 724, 723, 724, 725, 726, 723, 727, 1372, + 726, 725, 727, 723, 724, 729, 726, 729, 727, 726, + 1376, 725, 729, 723, 0, 1361, 726, 729, 727, 725, + 0, 1378, 1380, 725, 726, 0, 727, 1382, 726, 725, + 727, 1384, 1386, 729, 726, 729, 727, 726, 728, 725, + 729, 1388, 728, 1390, 726, 729, 727, 730, 728, 1378, + 1380, 730, 1392, 728, 0, 1382, 0, 730, 728, 1384, + 1386, 0, 1394, 0, 0, 0, 728, 730, 731, 1388, + + 728, 1390, 731, 0, 0, 730, 728, 0, 731, 730, + 1392, 728, 733, 731, 733, 730, 728, 732, 731, 733, + 1394, 732, 0, 0, 733, 730, 731, 732, 0, 0, + 731, 734, 734, 734, 0, 0, 731, 732, 734, 0, + 733, 731, 733, 734, 0, 732, 731, 733, 0, 732, + 0, 0, 733, 0, 0, 732, 736, 0, 736, 734, + 734, 734, 737, 736, 736, 732, 734, 735, 736, 735, + 0, 734, 0, 737, 735, 737, 735, 0, 0, 735, + 737, 738, 0, 738, 736, 737, 736, 738, 738, 739, + 737, 736, 736, 738, 0, 735, 736, 735, 739, 0, + + 739, 737, 735, 737, 735, 739, 0, 735, 737, 738, + 739, 738, 0, 737, 740, 738, 738, 739, 740, 0, + 741, 738, 741, 742, 740, 742, 739, 741, 739, 743, + 742, 743, 741, 739, 740, 742, 743, 0, 739, 0, + 0, 743, 740, 0, 0, 0, 740, 0, 741, 0, + 741, 742, 740, 742, 0, 741, 0, 743, 742, 743, + 741, 0, 740, 742, 743, 744, 0, 0, 0, 743, + 745, 0, 745, 744, 745, 744, 0, 745, 0, 746, + 744, 746, 745, 746, 0, 744, 746, 747, 0, 747, + 0, 746, 0, 744, 747, 0, 747, 0, 745, 747, + + 745, 744, 745, 744, 0, 745, 0, 746, 744, 746, + 745, 746, 0, 744, 746, 747, 0, 747, 748, 746, + 748, 749, 747, 0, 747, 748, 748, 747, 0, 750, + 748, 751, 749, 0, 749, 751, 0, 0, 0, 749, + 750, 751, 750, 0, 749, 0, 748, 750, 748, 749, + 0, 751, 750, 748, 748, 0, 0, 750, 748, 751, + 749, 752, 749, 751, 0, 752, 0, 749, 750, 751, + 750, 752, 749, 0, 0, 750, 0, 0, 0, 751, + 750, 752, 753, 0, 754, 0, 753, 0, 754, 752, + 0, 755, 753, 752, 754, 755, 0, 753, 0, 752, + + 0, 755, 753, 0, 754, 0, 0, 0, 0, 752, + 753, 755, 754, 756, 753, 0, 754, 756, 0, 755, + 753, 756, 754, 755, 757, 753, 0, 756, 757, 755, + 753, 0, 754, 0, 757, 0, 0, 756, 758, 755, + 0, 756, 758, 759, 757, 756, 0, 759, 758, 756, + 0, 759, 757, 0, 0, 756, 757, 759, 758, 0, + 0, 0, 757, 0, 0, 756, 758, 759, 0, 0, + 758, 759, 757, 760, 0, 759, 758, 760, 761, 759, + 0, 0, 761, 760, 760, 759, 758, 762, 761, 762, + 763, 0, 763, 760, 762, 759, 0, 763, 761, 762, + + 0, 760, 763, 0, 0, 760, 761, 764, 0, 764, + 761, 760, 760, 0, 764, 762, 761, 762, 763, 764, + 763, 760, 762, 0, 765, 763, 761, 762, 765, 0, + 763, 0, 0, 0, 765, 764, 767, 764, 767, 0, + 0, 766, 764, 767, 765, 766, 0, 764, 767, 0, + 0, 766, 765, 768, 766, 768, 765, 0, 0, 768, + 768, 766, 765, 0, 767, 768, 767, 0, 769, 766, + 769, 767, 765, 766, 769, 769, 767, 0, 0, 766, + 769, 768, 766, 768, 0, 0, 0, 768, 768, 766, + 779, 0, 0, 768, 779, 0, 769, 0, 769, 771, + + 779, 771, 769, 769, 0, 772, 771, 772, 769, 770, + 779, 771, 772, 0, 770, 0, 770, 772, 779, 0, + 770, 770, 779, 0, 0, 0, 770, 771, 779, 771, + 0, 0, 0, 772, 771, 772, 0, 770, 779, 771, + 772, 0, 770, 0, 770, 772, 0, 0, 770, 770, + 773, 774, 773, 774, 770, 0, 0, 773, 774, 775, + 0, 775, 773, 774, 0, 776, 775, 776, 0, 0, + 0, 775, 776, 776, 0, 0, 0, 776, 773, 774, + 773, 774, 0, 0, 0, 773, 774, 775, 0, 775, + 773, 774, 0, 776, 775, 776, 777, 0, 777, 775, + + 776, 776, 778, 777, 778, 776, 0, 780, 777, 778, + 0, 780, 0, 782, 778, 782, 0, 780, 781, 0, + 782, 782, 781, 0, 777, 782, 777, 780, 781, 0, + 778, 777, 778, 0, 0, 780, 777, 778, 781, 780, + 0, 782, 778, 782, 0, 780, 781, 0, 782, 782, + 781, 0, 0, 782, 783, 780, 781, 784, 783, 784, + 783, 0, 0, 784, 784, 783, 781, 0, 0, 784, + 783, 0, 0, 0, 785, 0, 0, 0, 785, 786, + 0, 0, 783, 786, 785, 784, 783, 784, 783, 786, + 0, 784, 784, 783, 785, 0, 0, 784, 783, 786, + + 788, 0, 785, 787, 788, 787, 785, 786, 0, 787, + 788, 786, 785, 0, 0, 787, 0, 786, 0, 0, + 788, 0, 785, 0, 0, 787, 789, 786, 788, 0, + 789, 787, 788, 787, 0, 0, 789, 787, 788, 789, + 0, 791, 0, 787, 0, 791, 789, 0, 788, 0, + 0, 791, 790, 787, 789, 0, 790, 0, 789, 0, + 0, 791, 790, 0, 789, 790, 793, 789, 0, 791, + 793, 0, 790, 791, 789, 0, 793, 792, 0, 791, + 790, 792, 0, 0, 790, 792, 793, 792, 0, 791, + 790, 794, 795, 790, 793, 794, 795, 792, 793, 0, + + 790, 794, 795, 0, 793, 792, 0, 0, 0, 792, + 0, 794, 795, 792, 793, 792, 0, 0, 796, 794, + 795, 0, 796, 794, 795, 792, 796, 797, 0, 794, + 795, 797, 796, 798, 0, 797, 0, 798, 0, 794, + 795, 797, 796, 798, 0, 0, 796, 0, 799, 0, + 796, 797, 799, 798, 796, 797, 0, 0, 799, 797, + 796, 798, 800, 797, 0, 798, 800, 0, 799, 797, + 796, 798, 800, 0, 0, 800, 799, 0, 0, 797, + 799, 798, 800, 0, 0, 801, 799, 803, 802, 801, + 800, 803, 802, 801, 800, 801, 799, 803, 802, 0, + + 800, 802, 803, 800, 0, 801, 0, 803, 802, 0, + 800, 804, 0, 801, 804, 803, 802, 801, 804, 803, + 802, 801, 0, 801, 804, 803, 802, 805, 0, 802, + 803, 805, 0, 801, 804, 803, 802, 805, 0, 804, + 806, 0, 804, 0, 806, 0, 804, 805, 806, 807, + 806, 807, 804, 809, 0, 805, 807, 809, 0, 805, + 806, 807, 804, 809, 0, 805, 0, 0, 806, 0, + 0, 808, 806, 809, 0, 805, 806, 807, 806, 807, + 808, 809, 808, 0, 807, 809, 810, 808, 806, 807, + 810, 809, 808, 811, 0, 0, 810, 811, 0, 808, + + 812, 809, 812, 811, 0, 0, 810, 812, 808, 0, + 808, 0, 812, 811, 810, 808, 0, 0, 810, 813, + 808, 811, 814, 813, 810, 811, 814, 0, 812, 813, + 812, 811, 814, 815, 810, 812, 0, 815, 0, 813, + 812, 811, 814, 815, 0, 0, 0, 813, 816, 0, + 814, 813, 816, 815, 814, 0, 0, 813, 816, 817, + 814, 815, 818, 817, 0, 815, 818, 813, 816, 817, + 814, 815, 818, 0, 0, 0, 816, 0, 0, 817, + 816, 815, 818, 0, 0, 0, 816, 817, 0, 0, + 818, 817, 0, 0, 818, 0, 816, 817, 0, 819, + + 818, 819, 820, 0, 820, 0, 819, 817, 0, 820, + 818, 819, 822, 821, 820, 821, 0, 0, 0, 0, + 821, 822, 0, 822, 0, 821, 0, 819, 822, 819, + 820, 0, 820, 822, 819, 0, 0, 820, 0, 819, + 822, 821, 820, 821, 0, 823, 0, 823, 821, 822, + 0, 822, 823, 821, 823, 0, 822, 823, 824, 0, + 824, 822, 825, 0, 825, 824, 826, 0, 0, 825, + 824, 825, 0, 823, 825, 823, 0, 826, 0, 826, + 823, 0, 823, 0, 826, 823, 824, 0, 824, 826, + 825, 0, 825, 824, 826, 0, 0, 825, 824, 825, + + 0, 827, 825, 827, 0, 826, 0, 826, 827, 827, + 829, 828, 826, 827, 829, 0, 828, 826, 828, 0, + 829, 0, 0, 828, 0, 0, 0, 0, 828, 827, + 829, 827, 0, 0, 0, 0, 827, 827, 829, 828, + 0, 827, 829, 0, 828, 0, 828, 0, 829, 830, + 831, 828, 830, 830, 831, 0, 828, 0, 829, 830, + 831, 0, 0, 832, 833, 0, 0, 832, 833, 830, + 831, 0, 0, 832, 833, 0, 0, 830, 831, 832, + 830, 830, 831, 832, 833, 0, 0, 830, 831, 834, + 835, 832, 833, 834, 835, 832, 833, 830, 831, 834, + + 835, 832, 833, 0, 0, 0, 0, 832, 0, 834, + 835, 832, 833, 836, 0, 836, 0, 834, 835, 0, + 836, 834, 835, 0, 937, 836, 937, 834, 835, 0, + 0, 937, 938, 939, 938, 939, 937, 834, 835, 938, + 939, 836, 0, 836, 938, 939, 941, 939, 836, 0, + 941, 0, 937, 836, 937, 0, 941, 0, 0, 937, + 938, 939, 938, 939, 937, 0, 941, 938, 939, 940, + 0, 940, 938, 939, 941, 939, 940, 0, 941, 0, + 0, 940, 942, 943, 941, 944, 942, 943, 0, 944, + 0, 0, 942, 943, 941, 944, 0, 940, 0, 940, + + 944, 0, 942, 943, 940, 944, 0, 0, 945, 940, + 942, 943, 945, 944, 942, 943, 945, 944, 0, 0, + 942, 943, 945, 944, 946, 946, 0, 0, 944, 946, + 942, 943, 945, 944, 0, 946, 945, 947, 0, 947, + 945, 0, 0, 947, 945, 946, 0, 0, 0, 947, + 945, 0, 946, 946, 948, 0, 948, 946, 0, 947, + 945, 948, 949, 946, 949, 947, 948, 947, 950, 949, + 949, 947, 950, 946, 949, 951, 0, 947, 950, 951, + 0, 0, 948, 0, 948, 951, 0, 947, 950, 948, + 949, 0, 949, 0, 948, 951, 950, 949, 949, 0, + + 950, 952, 949, 951, 0, 952, 950, 951, 953, 0, + 953, 952, 0, 951, 954, 953, 950, 0, 954, 0, + 953, 952, 0, 951, 954, 0, 0, 955, 0, 952, + 0, 955, 0, 952, 954, 0, 953, 955, 953, 952, + 0, 0, 954, 953, 0, 0, 954, 955, 953, 952, + 956, 0, 954, 0, 956, 955, 958, 0, 956, 955, + 958, 957, 954, 957, 956, 955, 958, 959, 957, 0, + 0, 959, 0, 957, 956, 955, 958, 959, 956, 0, + 0, 0, 956, 0, 958, 0, 956, 959, 958, 957, + 0, 957, 956, 960, 958, 959, 957, 960, 0, 959, + + 0, 957, 956, 960, 958, 959, 963, 961, 0, 0, + 963, 961, 962, 960, 962, 959, 963, 961, 0, 962, + 0, 960, 961, 0, 962, 960, 963, 961, 0, 0, + 0, 960, 0, 964, 963, 961, 0, 964, 963, 961, + 962, 960, 962, 964, 963, 961, 0, 962, 0, 0, + 961, 0, 962, 964, 963, 961, 965, 0, 966, 967, + 965, 964, 966, 967, 0, 964, 965, 0, 966, 967, + 968, 964, 968, 966, 967, 0, 965, 968, 966, 967, + 0, 964, 968, 0, 965, 0, 966, 967, 965, 969, + 966, 967, 0, 969, 965, 0, 966, 967, 968, 969, + + 968, 966, 967, 0, 965, 968, 966, 967, 0, 969, + 968, 0, 970, 0, 970, 971, 972, 969, 970, 971, + 972, 969, 0, 0, 970, 971, 972, 969, 0, 0, + 0, 0, 0, 0, 970, 971, 972, 969, 0, 0, + 970, 973, 970, 971, 972, 973, 970, 971, 972, 0, + 0, 973, 970, 971, 972, 0, 974, 0, 974, 973, + 974, 973, 970, 971, 972, 976, 974, 976, 0, 973, + 975, 0, 976, 973, 975, 0, 974, 976, 0, 973, + 975, 0, 0, 0, 974, 975, 974, 973, 974, 973, + 975, 0, 0, 976, 974, 976, 0, 0, 975, 977, + + 976, 977, 975, 0, 974, 976, 977, 978, 975, 0, + 0, 977, 978, 975, 978, 0, 0, 0, 975, 978, + 0, 979, 0, 979, 978, 0, 0, 977, 979, 977, + 0, 0, 0, 979, 977, 978, 980, 0, 980, 977, + 978, 0, 978, 980, 0, 0, 0, 978, 980, 979, + 0, 979, 978, 0, 0, 981, 979, 981, 982, 0, + 982, 979, 981, 981, 980, 982, 980, 981, 0, 0, + 982, 980, 983, 0, 983, 0, 980, 0, 0, 983, + 0, 0, 0, 981, 983, 981, 982, 0, 982, 0, + 981, 981, 0, 982, 0, 981, 0, 984, 982, 984, + + 983, 986, 983, 986, 984, 984, 985, 983, 986, 984, + 985, 986, 983, 986, 0, 0, 985, 0, 0, 0, + 0, 0, 0, 0, 0, 984, 985, 984, 987, 986, + 987, 986, 984, 984, 985, 987, 986, 984, 985, 986, + 987, 986, 0, 988, 985, 988, 0, 0, 0, 0, + 988, 0, 990, 0, 985, 988, 987, 989, 987, 989, + 990, 0, 990, 987, 989, 0, 0, 990, 987, 989, + 0, 988, 990, 988, 991, 0, 991, 992, 988, 992, + 990, 991, 0, 988, 992, 989, 991, 989, 990, 992, + 990, 0, 989, 0, 0, 990, 0, 989, 0, 0, + + 990, 994, 991, 994, 991, 992, 993, 992, 994, 991, + 993, 0, 992, 994, 991, 0, 993, 992, 0, 995, + 0, 0, 0, 0, 0, 0, 993, 0, 0, 994, + 995, 994, 995, 0, 993, 0, 994, 995, 993, 0, + 0, 994, 995, 996, 993, 996, 0, 995, 0, 0, + 996, 996, 0, 997, 993, 996, 0, 997, 995, 997, + 995, 0, 0, 0, 997, 995, 0, 0, 0, 997, + 995, 996, 0, 996, 0, 0, 0, 0, 996, 996, + 0, 997, 998, 996, 998, 997, 999, 997, 999, 998, + 998, 0, 997, 999, 998, 0, 0, 997, 999, 1000, + + 0, 1000, 0, 1001, 0, 1002, 1000, 1001, 0, 1002, + 998, 1000, 998, 1001, 999, 1002, 999, 998, 998, 0, + 1002, 999, 998, 1001, 0, 1002, 999, 1000, 0, 1000, + 0, 1001, 1006, 1002, 1000, 1001, 1006, 1002, 0, 1000, + 0, 1001, 1006, 1002, 1003, 1003, 1004, 0, 1002, 1003, + 1004, 1001, 1006, 1002, 0, 1003, 1004, 0, 0, 1004, + 1006, 0, 0, 0, 1006, 1003, 1004, 0, 0, 1019, + 1006, 1019, 1003, 1003, 1004, 1005, 1019, 1003, 1004, 1005, + 1006, 1019, 1007, 1003, 1004, 1005, 1007, 1004, 1005, 0, + 0, 0, 1007, 1003, 1004, 1005, 0, 1019, 0, 1019, + + 0, 1008, 1007, 1005, 1019, 1008, 0, 1005, 1009, 1019, + 1007, 1008, 1009, 1005, 1007, 1010, 1005, 0, 1009, 1010, + 1007, 1008, 0, 1005, 0, 1010, 0, 0, 1009, 1008, + 1007, 0, 0, 1008, 1011, 1010, 1009, 1012, 1011, 1008, + 1009, 1012, 1011, 1010, 0, 1012, 1009, 1010, 1011, 1008, + 0, 1012, 0, 1010, 0, 0, 1009, 0, 1011, 0, + 0, 1012, 1011, 1010, 0, 1012, 1011, 1013, 1013, 1012, + 1011, 0, 1013, 1012, 0, 0, 1011, 1014, 1013, 1012, + 0, 1014, 0, 0, 0, 0, 1011, 1014, 1013, 1012, + 0, 0, 1014, 0, 1015, 1013, 1013, 1014, 1015, 0, + + 1013, 0, 0, 1016, 1015, 1014, 1013, 1016, 0, 1014, + 0, 0, 0, 1016, 1015, 1014, 1013, 0, 0, 0, + 1014, 0, 1015, 1016, 0, 1014, 1015, 0, 1017, 1017, + 1018, 1016, 1015, 1017, 1018, 1016, 0, 0, 1018, 1017, + 0, 1016, 1015, 0, 1018, 0, 0, 0, 0, 1017, + 0, 1016, 0, 1020, 1018, 1020, 1017, 1017, 1018, 1020, + 1020, 1017, 1018, 0, 0, 1020, 1018, 1017, 1021, 0, + 1021, 0, 1018, 0, 0, 1021, 1021, 1017, 0, 1022, + 1021, 1020, 1018, 1020, 0, 0, 0, 1020, 1020, 0, + 1022, 0, 1022, 1020, 0, 0, 1021, 1022, 1021, 1023, + + 0, 0, 1022, 1021, 1021, 0, 0, 1022, 1021, 1024, + 1023, 1024, 1023, 0, 0, 0, 1024, 1023, 1022, 0, + 1022, 1024, 1023, 0, 1025, 1022, 1025, 1023, 0, 0, + 1022, 1025, 0, 0, 0, 0, 1025, 1024, 1023, 1024, + 1023, 0, 0, 1026, 1024, 1023, 0, 1026, 0, 1024, + 1023, 0, 1025, 1026, 1025, 1027, 1027, 1028, 1029, 1025, + 1027, 1028, 1029, 1026, 1025, 0, 1027, 1028, 1029, 0, + 0, 1026, 0, 0, 0, 1026, 1027, 1028, 1029, 0, + 1030, 1026, 1030, 1027, 1027, 1028, 1029, 1030, 1027, 1028, + 1029, 1026, 1030, 0, 1027, 1028, 1029, 0, 1031, 0, + + 0, 1032, 0, 0, 1027, 1028, 1029, 0, 1030, 1031, + 1030, 1031, 1032, 0, 1032, 1030, 1031, 0, 0, 1032, + 1030, 1031, 0, 1033, 1032, 1033, 1031, 0, 0, 1032, + 1033, 1034, 0, 1034, 0, 1033, 0, 1031, 1034, 1031, + 1032, 0, 1032, 1034, 1031, 0, 0, 1032, 0, 1031, + 1111, 1033, 1032, 1033, 1111, 1113, 0, 1113, 1033, 1034, + 1111, 1034, 1113, 1033, 1112, 0, 1034, 1113, 1112, 0, + 1111, 1034, 0, 0, 1112, 0, 0, 0, 1111, 1114, + 0, 1114, 1111, 1113, 1112, 1113, 1114, 1115, 1111, 1115, + 1113, 1114, 1112, 1116, 1115, 1113, 1112, 1116, 1111, 1115, + + 0, 0, 1112, 1116, 1118, 0, 1118, 1114, 0, 1114, + 0, 1118, 1112, 1116, 1114, 1115, 1118, 1115, 0, 1114, + 1117, 1116, 1115, 0, 1117, 1116, 1119, 1115, 1119, 0, + 1117, 1116, 1118, 1119, 1118, 1117, 0, 0, 1119, 1118, + 1117, 1116, 0, 1120, 1118, 1120, 0, 0, 1117, 0, + 1120, 0, 1117, 0, 1119, 1120, 1119, 1121, 1117, 1121, + 0, 1119, 0, 1117, 1121, 0, 1119, 0, 1117, 1121, + 0, 1120, 1122, 1120, 1122, 0, 0, 1124, 1120, 1122, + 1122, 0, 0, 1120, 1122, 1121, 1124, 1121, 1124, 1123, + 1123, 1123, 1121, 1124, 0, 0, 1123, 1121, 1124, 0, + + 1122, 1123, 1122, 0, 0, 1124, 0, 1122, 1122, 0, + 0, 0, 1122, 1125, 1124, 1125, 1124, 1123, 1123, 1123, + 1125, 1124, 0, 0, 1123, 1125, 1124, 0, 1126, 1123, + 1126, 0, 1127, 0, 1127, 1126, 1126, 1128, 0, 1127, + 1126, 1125, 0, 1125, 1127, 0, 0, 1128, 1125, 1128, + 0, 0, 0, 1125, 1128, 0, 1126, 0, 1126, 1128, + 1127, 0, 1127, 1126, 1126, 1128, 0, 1127, 1126, 1129, + 0, 1129, 1127, 0, 1130, 1128, 1129, 1128, 0, 0, + 0, 1129, 1128, 1130, 1131, 1130, 1131, 1128, 0, 0, + 1130, 1131, 0, 0, 0, 1130, 1131, 1129, 1132, 1129, + + 1132, 0, 1130, 0, 1129, 1132, 0, 0, 0, 1129, + 1132, 1130, 1131, 1130, 1131, 1133, 0, 1133, 1130, 1131, + 0, 0, 1133, 1130, 1131, 0, 1132, 1133, 1132, 1134, + 0, 1134, 0, 1132, 0, 0, 1134, 1137, 1132, 1137, + 0, 1134, 1135, 1133, 1137, 1133, 1135, 0, 0, 1137, + 1133, 0, 1135, 0, 0, 1133, 1136, 1134, 0, 1134, + 1136, 0, 1135, 0, 1134, 1137, 1136, 1137, 0, 1134, + 1135, 1138, 1137, 1138, 1135, 0, 1136, 1137, 1138, 1138, + 1135, 0, 1139, 1138, 1136, 0, 1139, 0, 1136, 0, + 1135, 1140, 1139, 1140, 1136, 0, 0, 0, 1140, 1138, + + 0, 1138, 1139, 1140, 1136, 0, 1138, 1138, 0, 0, + 1139, 1138, 0, 0, 1139, 1141, 1142, 1141, 1142, 1140, + 1139, 1140, 1141, 1142, 0, 0, 1140, 1141, 1142, 0, + 1139, 1140, 0, 0, 0, 1143, 0, 1143, 0, 0, + 0, 0, 1143, 1141, 1142, 1141, 1142, 1143, 0, 0, + 1141, 1142, 1144, 0, 1144, 1141, 1142, 0, 0, 1144, + 1145, 0, 1145, 1143, 1144, 1143, 1146, 1145, 1146, 0, + 1143, 0, 1145, 1146, 0, 1143, 0, 1147, 1146, 1147, + 1144, 0, 1144, 1147, 1147, 0, 0, 1144, 1145, 1147, + 1145, 0, 1144, 1148, 1146, 1145, 1146, 1148, 0, 0, + + 1145, 1146, 0, 1148, 0, 1147, 1146, 1147, 0, 0, + 1149, 1147, 1147, 1148, 1149, 0, 1150, 1147, 1149, 1151, + 1150, 1148, 0, 1151, 1149, 1148, 1150, 0, 1152, 1151, + 1152, 1148, 0, 0, 1149, 1152, 1150, 0, 1149, 1151, + 1152, 1148, 1149, 1153, 1150, 1153, 1149, 1151, 1150, 0, + 1153, 1151, 1149, 0, 1150, 1153, 1152, 1151, 1152, 0, + 0, 0, 1149, 1152, 1150, 0, 0, 1151, 1152, 0, + 1154, 1153, 1154, 1153, 1155, 0, 1155, 1154, 1153, 0, + 0, 1155, 1154, 1153, 0, 1157, 1155, 1157, 1156, 0, + 0, 0, 1157, 0, 0, 0, 0, 1157, 1154, 1156, + + 1154, 1156, 1155, 0, 1155, 1154, 1156, 0, 0, 1155, + 1154, 1156, 0, 1157, 1155, 1157, 1156, 0, 1159, 0, + 1157, 0, 1159, 0, 1158, 1157, 1158, 1156, 1159, 1156, + 0, 1158, 1158, 1160, 1156, 0, 1158, 1160, 1159, 1156, + 0, 0, 0, 1160, 0, 0, 1159, 1161, 0, 0, + 1159, 1161, 1158, 1160, 1158, 0, 1159, 1161, 1162, 1158, + 1158, 1160, 1162, 0, 1158, 1160, 1159, 1161, 1162, 0, + 1163, 1160, 1163, 0, 0, 1161, 0, 1163, 1162, 1161, + 0, 1160, 1163, 0, 0, 1161, 1162, 1164, 0, 1164, + 1162, 0, 1165, 1166, 1164, 1161, 1162, 0, 1163, 1164, + + 1163, 1165, 1166, 1165, 1166, 1163, 1162, 0, 1165, 1166, + 1163, 0, 0, 1165, 1166, 1164, 1167, 1164, 1167, 0, + 1165, 1166, 1164, 1167, 0, 0, 0, 1164, 1167, 1165, + 1166, 1165, 1166, 1168, 0, 1168, 1165, 1166, 0, 0, + 1168, 1165, 1166, 0, 1167, 1168, 1167, 1169, 1170, 1169, + 1170, 1167, 0, 0, 1169, 1170, 1167, 0, 0, 1169, + 1170, 1168, 1171, 1168, 1171, 0, 0, 0, 1168, 1171, + 0, 0, 0, 1168, 1171, 1169, 1170, 1169, 1170, 1172, + 0, 1172, 1169, 1170, 0, 1174, 1172, 1169, 1170, 0, + 1171, 1172, 1171, 1173, 0, 1173, 1174, 1171, 1174, 1175, + + 1173, 0, 1171, 1174, 0, 1173, 0, 1172, 1174, 1172, + 1175, 0, 1175, 1174, 1172, 0, 0, 1175, 0, 1172, + 0, 1173, 1175, 1173, 1174, 0, 1174, 1175, 1173, 0, + 1176, 1174, 0, 1173, 0, 1177, 1174, 1177, 1175, 1176, + 1175, 1176, 1177, 1177, 1178, 1175, 1176, 1177, 0, 0, + 1175, 1176, 1178, 0, 1178, 0, 0, 0, 1176, 1178, + 0, 0, 0, 1177, 1178, 1177, 1179, 1176, 1179, 1176, + 1177, 1177, 1178, 1179, 1176, 1177, 0, 0, 1179, 1176, + 1178, 1180, 1178, 1180, 0, 0, 0, 1178, 1180, 0, + 0, 0, 1178, 1180, 1179, 1181, 1179, 1181, 1182, 0, + + 1182, 1179, 1181, 0, 0, 1182, 1179, 1181, 0, 1180, + 1182, 1180, 1183, 0, 1183, 1184, 1180, 1184, 1183, 1183, + 0, 1180, 1184, 1181, 1183, 1181, 1182, 1184, 1182, 1232, + 1181, 1232, 1233, 1182, 1233, 1181, 1232, 0, 1182, 1233, + 1183, 1232, 1183, 1184, 1233, 1184, 1183, 1183, 0, 1234, + 1184, 1234, 1183, 0, 0, 1184, 1234, 1232, 0, 1232, + 1233, 1234, 1233, 1235, 1232, 1235, 0, 1233, 0, 1232, + 1235, 0, 1233, 0, 0, 1235, 1236, 1234, 0, 1234, + 1236, 0, 1239, 1239, 1234, 0, 1236, 0, 0, 1234, + 1237, 1235, 0, 1235, 1237, 1238, 1236, 0, 1235, 1238, + + 1237, 0, 0, 1235, 1236, 1238, 0, 0, 1236, 1239, + 1237, 0, 0, 1239, 1236, 1238, 1240, 0, 1237, 1239, + 1240, 0, 1237, 1238, 1236, 0, 1240, 1238, 1237, 1239, + 1242, 1241, 0, 1238, 1242, 1241, 1240, 1239, 1237, 1241, + 1242, 1239, 0, 1238, 1240, 1241, 0, 1239, 1240, 0, + 1242, 0, 0, 0, 1240, 1241, 1243, 1239, 1242, 1241, + 1243, 1244, 1242, 1241, 1240, 1244, 1243, 1241, 1242, 0, + 1245, 1244, 0, 1241, 1245, 0, 1243, 0, 1242, 0, + 1245, 1244, 0, 1241, 1243, 1245, 0, 1247, 1243, 1244, + 1245, 1247, 0, 1244, 1243, 0, 1248, 1247, 1245, 1244, + + 1248, 1246, 1245, 1246, 1243, 1246, 1248, 1247, 1245, 1244, + 1249, 1246, 0, 1245, 1249, 1247, 1248, 0, 1245, 1247, + 1249, 1246, 0, 0, 1248, 1247, 0, 0, 1248, 1246, + 1249, 1246, 0, 1246, 1248, 1247, 0, 0, 1249, 1246, + 0, 0, 1249, 1250, 1248, 1250, 0, 0, 1249, 1246, + 1250, 0, 1251, 0, 1251, 1250, 0, 0, 1249, 1251, + 1252, 0, 1252, 0, 1251, 1253, 0, 1252, 0, 0, + 0, 1250, 1252, 1250, 1253, 0, 1253, 1254, 1250, 1254, + 1251, 1253, 1251, 1250, 1254, 0, 1253, 1251, 1252, 1254, + 1252, 0, 1251, 1253, 1255, 1252, 1255, 0, 0, 0, + + 1252, 1255, 1253, 0, 1253, 1254, 1255, 1254, 1256, 1253, + 1256, 0, 1254, 0, 1253, 1256, 0, 1254, 0, 1257, + 1256, 1257, 1255, 0, 1255, 1257, 1257, 0, 0, 1255, + 0, 1257, 0, 0, 1255, 1258, 1256, 0, 1256, 1258, + 1259, 0, 0, 1256, 1259, 1258, 0, 1257, 1256, 1257, + 1259, 0, 0, 1257, 1257, 1258, 0, 0, 0, 1257, + 1259, 0, 1260, 1258, 1260, 0, 0, 1258, 1259, 1260, + 0, 0, 1259, 1258, 1260, 1261, 0, 1261, 1259, 1262, + 0, 1262, 1261, 1258, 0, 1263, 1262, 1261, 1259, 0, + 1260, 1262, 1260, 0, 1263, 0, 1263, 1260, 0, 0, + + 0, 1263, 1260, 1261, 0, 1261, 1263, 1262, 0, 1262, + 1261, 0, 0, 1263, 1262, 1261, 0, 0, 1264, 1262, + 1264, 0, 1263, 0, 1263, 1264, 1264, 0, 0, 1263, + 1264, 0, 1265, 1265, 1263, 1265, 0, 1266, 0, 1266, + 1265, 0, 0, 0, 1266, 1265, 1264, 0, 1264, 1266, + 1267, 0, 1267, 1264, 1264, 0, 0, 1267, 1264, 0, + 1265, 1265, 1267, 1265, 0, 1266, 0, 1266, 1265, 0, + 0, 0, 1266, 1265, 1268, 0, 1268, 1266, 1267, 0, + 1267, 1268, 1268, 0, 0, 1267, 1268, 1269, 0, 1269, + 1267, 1270, 0, 1270, 1269, 0, 0, 1270, 1270, 1269, + + 0, 0, 1268, 1270, 1268, 0, 1271, 1271, 1271, 1268, + 1268, 0, 0, 1271, 1268, 1269, 0, 1269, 1271, 1270, + 0, 1270, 1269, 0, 0, 1270, 1270, 1269, 0, 1273, + 1272, 1270, 1272, 1273, 1271, 1271, 1271, 1272, 1272, 1273, + 0, 1271, 1272, 1274, 1275, 0, 1271, 1274, 1275, 1273, + 0, 0, 0, 1274, 1275, 0, 0, 1273, 1272, 0, + 1272, 1273, 0, 1274, 1275, 1272, 1272, 1273, 0, 1276, + 1272, 1274, 1275, 1276, 1302, 1274, 1275, 1273, 1302, 1276, + 0, 1274, 1275, 1314, 1302, 1314, 0, 1302, 0, 1276, + 1314, 1274, 1275, 0, 1302, 1314, 0, 1276, 0, 1304, + + 0, 1276, 1302, 1304, 0, 0, 1302, 1276, 0, 1304, + 1305, 1314, 1302, 1314, 1305, 1302, 0, 1276, 1314, 1304, + 1305, 0, 1302, 1314, 1306, 1305, 0, 1304, 1306, 1307, + 1305, 1304, 0, 1307, 1306, 0, 0, 1304, 1305, 1307, + 0, 0, 1305, 0, 1306, 0, 0, 1304, 1305, 1307, + 1308, 0, 1306, 1305, 1308, 0, 1306, 1307, 1305, 0, + 1308, 1307, 1306, 0, 1309, 1310, 1309, 1307, 1309, 1310, + 1308, 0, 1306, 0, 1309, 1310, 0, 1307, 1308, 1311, + 1310, 0, 1308, 1311, 1309, 1310, 0, 0, 1308, 1311, + 0, 0, 1309, 1310, 1309, 0, 1309, 1310, 1308, 1311, + + 1312, 0, 1309, 1310, 1312, 1313, 0, 1311, 1310, 1313, + 1312, 1311, 1309, 1310, 1315, 1313, 0, 1311, 1313, 1315, + 1312, 1315, 0, 0, 0, 1313, 1315, 1311, 1312, 0, + 1316, 1315, 1312, 1313, 1316, 1317, 0, 1313, 1312, 1317, + 1316, 0, 1315, 1313, 0, 1317, 1313, 1315, 1312, 1315, + 1316, 0, 0, 1313, 1315, 1317, 1318, 0, 1316, 1315, + 1318, 1319, 1316, 1317, 0, 1319, 1318, 1317, 1316, 0, + 1320, 1319, 0, 1317, 1320, 1321, 1318, 0, 1316, 1321, + 1320, 1319, 0, 1317, 1318, 1321, 1321, 0, 1318, 1319, + 1320, 0, 0, 1319, 1318, 1321, 1322, 0, 1320, 1319, + + 1322, 1323, 1320, 1321, 1318, 1323, 1322, 1321, 1320, 1319, + 0, 1323, 0, 1321, 1321, 0, 1322, 0, 1320, 0, + 0, 1323, 0, 1321, 1322, 1324, 1324, 1342, 1322, 1323, + 1324, 1342, 0, 1323, 1322, 0, 1324, 1342, 0, 1323, + 1340, 1340, 0, 0, 1322, 0, 1324, 1342, 0, 1323, + 0, 0, 1343, 1324, 1324, 1342, 1343, 0, 1324, 1342, + 0, 1345, 1343, 1345, 1324, 1342, 1344, 1340, 1345, 0, + 1344, 1340, 1343, 1345, 1324, 1342, 1344, 1340, 0, 0, + 1343, 1346, 0, 1346, 1343, 0, 1344, 1340, 1346, 1345, + 1343, 1345, 0, 1346, 1344, 1340, 1345, 0, 1344, 1340, + + 1343, 1345, 0, 0, 1344, 1340, 1347, 0, 1347, 1346, + 1348, 1346, 1348, 1347, 1344, 1340, 1346, 1348, 1347, 0, + 0, 1346, 1348, 1349, 0, 1349, 0, 0, 0, 0, + 1349, 0, 0, 0, 1347, 1349, 1347, 1350, 1348, 1350, + 1348, 1347, 0, 0, 1350, 1348, 1347, 0, 0, 1350, + 1348, 1349, 0, 1349, 0, 0, 1351, 0, 1349, 0, + 1351, 0, 0, 1349, 0, 1350, 1351, 1350, 0, 1352, + 1363, 1364, 1350, 1352, 1363, 1364, 1351, 1350, 0, 1352, + 1363, 1364, 0, 0, 1351, 0, 0, 0, 1351, 1352, + 1363, 1364, 0, 0, 1351, 0, 1365, 1352, 1363, 1364, + + 1365, 1352, 1363, 1364, 1351, 0, 1365, 1352, 1363, 1364, + 0, 0, 0, 1366, 0, 1366, 1365, 1352, 1363, 1364, + 1366, 0, 0, 0, 1365, 1366, 0, 0, 1365, 0, + 1374, 0, 1374, 0, 1365, 0, 0, 1374, 0, 0, + 0, 1366, 1374, 1366, 1365, 0, 0, 0, 1366, 0, + 0, 0, 0, 1366, 0, 0, 0, 0, 1374, 0, + 1374, 0, 0, 0, 0, 1374, 0, 0, 0, 0, + 1374, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, + 1406, 1407, 0, 0, 1407, 1407, 1407, 1407, 1407, 1407, + 1407, 1408, 1408, 0, 1408, 1409, 1409, 1409, 1410, 0, + + 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1411, 1411, 1411, + 0, 1411, 1411, 1411, 1411, 1411, 1411, 1412, 0, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1413, 0, 1413, + 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1414, 0, 1414, + 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1415, 0, 1415, + 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1416, 0, 1416, + 1417, 0, 1417, 1418, 0, 1418, 1419, 0, 1419, 1420, + 0, 1420, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405 + } ; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "flex_lexer.l" +/** + * lexer + * + * + */ +/*************************** + ** Section 1: Definitions + ***************************/ +#line 12 "flex_lexer.l" + +#include "../sql/Expr.h" +#include "bison_parser.h" +#include +#include +#include + +#define TOKEN(name) { return SQL_##name; } + +static thread_local std::stringstream strbuf; + +#line 3181 "flex_lexer.cpp" + +/*************************** + ** Section 2: Rules + ***************************/ +/* Define the output files */ +/* Make reentrant */ +/* performance tweeks */ +/* other flags */ +/* %option nodefault */ + +/*************************** + ** Section 3: Rules + ***************************/ +#line 3195 "flex_lexer.cpp" + +#define INITIAL 0 +#define singlequotedstring 1 +#define COMMENT 2 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + yy_size_t yy_n_chars; + yy_size_t yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + + YYSTYPE * yylval_r; + + YYLTYPE * yylloc_r; + + }; /* end struct yyguts_t */ + +static int yy_init_globals ( yyscan_t yyscanner ); + + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define yylval yyg->yylval_r + + # define yylloc yyg->yylloc_r + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( yyscan_t yyscanner ); + +int yyget_debug ( yyscan_t yyscanner ); + +void yyset_debug ( int debug_flag , yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); + +FILE *yyget_in ( yyscan_t yyscanner ); + +void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); + +FILE *yyget_out ( yyscan_t yyscanner ); + +void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); + + yy_size_t yyget_leng ( yyscan_t yyscanner ); + +char *yyget_text ( yyscan_t yyscanner ); + +int yyget_lineno ( yyscan_t yyscanner ); + +void yyset_lineno ( int _line_number , yyscan_t yyscanner ); + +int yyget_column ( yyscan_t yyscanner ); + +void yyset_column ( int _column_no , yyscan_t yyscanner ); + +YYSTYPE * yyget_lval ( yyscan_t yyscanner ); + +void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); + + YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); + + void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( yyscan_t yyscanner ); +#else +extern int yywrap ( yyscan_t yyscanner ); +#endif +#endif + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput ( yyscan_t yyscanner ); +#else +static int input ( yyscan_t yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + yy_size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK /*LINTED*/break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yylval = yylval_param; + + yylloc = yylloc_param; + + if ( !yyg->yy_init ) + { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) + yyg->yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + } + + yy_load_buffer_state( yyscanner ); + } + + { +#line 57 "flex_lexer.l" + + +#line 3482 "flex_lexer.cpp" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yyg->yy_start; +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 1406 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + ++yy_cp; + } + while ( yy_current_state != 1405 ); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 59 "flex_lexer.l" +BEGIN(COMMENT); + YY_BREAK +case 2: +YY_RULE_SETUP +#line 60 "flex_lexer.l" +/* skipping comment content until a end of line is read */; + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +#line 61 "flex_lexer.l" +BEGIN(INITIAL); + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 63 "flex_lexer.l" +/* skip whitespace */; + YY_BREAK +case 5: +YY_RULE_SETUP +#line 65 "flex_lexer.l" +TOKEN(ADD) + YY_BREAK +case 6: +YY_RULE_SETUP +#line 66 "flex_lexer.l" +TOKEN(AFTER) + YY_BREAK +case 7: +YY_RULE_SETUP +#line 67 "flex_lexer.l" +TOKEN(ALL) + YY_BREAK +case 8: +YY_RULE_SETUP +#line 68 "flex_lexer.l" +TOKEN(ALTER) + YY_BREAK +case 9: +YY_RULE_SETUP +#line 69 "flex_lexer.l" +TOKEN(ANALYZE) + YY_BREAK +case 10: +YY_RULE_SETUP +#line 70 "flex_lexer.l" +TOKEN(AND) + YY_BREAK +case 11: +YY_RULE_SETUP +#line 71 "flex_lexer.l" +TOKEN(ARRAY) + YY_BREAK +case 12: +YY_RULE_SETUP +#line 72 "flex_lexer.l" +TOKEN(AS) + YY_BREAK +case 13: +YY_RULE_SETUP +#line 73 "flex_lexer.l" +TOKEN(ASC) + YY_BREAK +case 14: +YY_RULE_SETUP +#line 74 "flex_lexer.l" +TOKEN(BEFORE) + YY_BREAK +case 15: +YY_RULE_SETUP +#line 75 "flex_lexer.l" +TOKEN(BEGIN) + YY_BREAK +case 16: +YY_RULE_SETUP +#line 76 "flex_lexer.l" +TOKEN(BETWEEN) + YY_BREAK +case 17: +YY_RULE_SETUP +#line 77 "flex_lexer.l" +TOKEN(BIGINT) + YY_BREAK +case 18: +YY_RULE_SETUP +#line 78 "flex_lexer.l" +TOKEN(BOOLEAN) + YY_BREAK +case 19: +YY_RULE_SETUP +#line 79 "flex_lexer.l" +TOKEN(BY) + YY_BREAK +case 20: +YY_RULE_SETUP +#line 80 "flex_lexer.l" +TOKEN(CALL) + YY_BREAK +case 21: +YY_RULE_SETUP +#line 81 "flex_lexer.l" +TOKEN(CASCADE) + YY_BREAK +case 22: +YY_RULE_SETUP +#line 82 "flex_lexer.l" +TOKEN(CASE) + YY_BREAK +case 23: +YY_RULE_SETUP +#line 83 "flex_lexer.l" +TOKEN(CAST) + YY_BREAK +case 24: +YY_RULE_SETUP +#line 84 "flex_lexer.l" +TOKEN(CHAR) + YY_BREAK +case 25: +YY_RULE_SETUP +#line 85 "flex_lexer.l" +TOKEN(COLUMN) + YY_BREAK +case 26: +YY_RULE_SETUP +#line 86 "flex_lexer.l" +TOKEN(COLUMNS) + YY_BREAK +case 27: +YY_RULE_SETUP +#line 87 "flex_lexer.l" +TOKEN(COMMIT) + YY_BREAK +case 28: +YY_RULE_SETUP +#line 88 "flex_lexer.l" +TOKEN(CONTROL) + YY_BREAK +case 29: +YY_RULE_SETUP +#line 89 "flex_lexer.l" +TOKEN(COPY) + YY_BREAK +case 30: +YY_RULE_SETUP +#line 90 "flex_lexer.l" +TOKEN(CREATE) + YY_BREAK +case 31: +YY_RULE_SETUP +#line 91 "flex_lexer.l" +TOKEN(CROSS) + YY_BREAK +case 32: +YY_RULE_SETUP +#line 92 "flex_lexer.l" +TOKEN(DATE) + YY_BREAK +case 33: +YY_RULE_SETUP +#line 93 "flex_lexer.l" +TOKEN(DATETIME) + YY_BREAK +case 34: +YY_RULE_SETUP +#line 94 "flex_lexer.l" +TOKEN(DAY) + YY_BREAK +case 35: +YY_RULE_SETUP +#line 95 "flex_lexer.l" +TOKEN(DAYS) + YY_BREAK +case 36: +YY_RULE_SETUP +#line 96 "flex_lexer.l" +TOKEN(DEALLOCATE) + YY_BREAK +case 37: +YY_RULE_SETUP +#line 97 "flex_lexer.l" +TOKEN(DECIMAL) + YY_BREAK +case 38: +YY_RULE_SETUP +#line 98 "flex_lexer.l" +TOKEN(DEFAULT) + YY_BREAK +case 39: +YY_RULE_SETUP +#line 99 "flex_lexer.l" +TOKEN(DELETE) + YY_BREAK +case 40: +YY_RULE_SETUP +#line 100 "flex_lexer.l" +TOKEN(DELTA) + YY_BREAK +case 41: +YY_RULE_SETUP +#line 101 "flex_lexer.l" +TOKEN(DESC) + YY_BREAK +case 42: +YY_RULE_SETUP +#line 102 "flex_lexer.l" +TOKEN(DESCRIBE) + YY_BREAK +case 43: +YY_RULE_SETUP +#line 103 "flex_lexer.l" +TOKEN(DIRECT) + YY_BREAK +case 44: +YY_RULE_SETUP +#line 104 "flex_lexer.l" +TOKEN(DISTINCT) + YY_BREAK +case 45: +YY_RULE_SETUP +#line 105 "flex_lexer.l" +TOKEN(DIV) + YY_BREAK +case 46: +YY_RULE_SETUP +#line 106 "flex_lexer.l" +TOKEN(DOUBLE) + YY_BREAK +case 47: +YY_RULE_SETUP +#line 107 "flex_lexer.l" +TOKEN(DROP) + YY_BREAK +case 48: +YY_RULE_SETUP +#line 108 "flex_lexer.l" +TOKEN(ELSE) + YY_BREAK +case 49: +YY_RULE_SETUP +#line 109 "flex_lexer.l" +TOKEN(ENCODING) + YY_BREAK +case 50: +YY_RULE_SETUP +#line 110 "flex_lexer.l" +TOKEN(END) + YY_BREAK +case 51: +YY_RULE_SETUP +#line 111 "flex_lexer.l" +TOKEN(ESCAPE) + YY_BREAK +case 52: +YY_RULE_SETUP +#line 112 "flex_lexer.l" +TOKEN(EXCEPT) + YY_BREAK +case 53: +YY_RULE_SETUP +#line 113 "flex_lexer.l" +TOKEN(EXECUTE) + YY_BREAK +case 54: +YY_RULE_SETUP +#line 114 "flex_lexer.l" +TOKEN(EXISTS) + YY_BREAK +case 55: +YY_RULE_SETUP +#line 115 "flex_lexer.l" +TOKEN(EXPLAIN) + YY_BREAK +case 56: +YY_RULE_SETUP +#line 116 "flex_lexer.l" +TOKEN(EXTRACT) + YY_BREAK +case 57: +YY_RULE_SETUP +#line 117 "flex_lexer.l" +TOKEN(FALSE) + YY_BREAK +case 58: +YY_RULE_SETUP +#line 118 "flex_lexer.l" +TOKEN(FILE) + YY_BREAK +case 59: +YY_RULE_SETUP +#line 119 "flex_lexer.l" +TOKEN(FLOAT) + YY_BREAK +case 60: +YY_RULE_SETUP +#line 120 "flex_lexer.l" +TOKEN(FOLLOWING) + YY_BREAK +case 61: +YY_RULE_SETUP +#line 121 "flex_lexer.l" +TOKEN(FOR) + YY_BREAK +case 62: +YY_RULE_SETUP +#line 122 "flex_lexer.l" +TOKEN(FOREIGN) + YY_BREAK +case 63: +YY_RULE_SETUP +#line 123 "flex_lexer.l" +TOKEN(FORMAT) + YY_BREAK +case 64: +YY_RULE_SETUP +#line 124 "flex_lexer.l" +TOKEN(FROM) + YY_BREAK +case 65: +YY_RULE_SETUP +#line 125 "flex_lexer.l" +TOKEN(FULL) + YY_BREAK +case 66: +YY_RULE_SETUP +#line 126 "flex_lexer.l" +TOKEN(GLOBAL) + YY_BREAK +case 67: +YY_RULE_SETUP +#line 127 "flex_lexer.l" +TOKEN(GROUP) + YY_BREAK +case 68: +YY_RULE_SETUP +#line 128 "flex_lexer.l" +TOKEN(GROUPS) + YY_BREAK +case 69: +YY_RULE_SETUP +#line 129 "flex_lexer.l" +TOKEN(HASH) + YY_BREAK +case 70: +YY_RULE_SETUP +#line 130 "flex_lexer.l" +TOKEN(HAVING) + YY_BREAK +case 71: +YY_RULE_SETUP +#line 131 "flex_lexer.l" +TOKEN(HINT) + YY_BREAK +case 72: +YY_RULE_SETUP +#line 132 "flex_lexer.l" +TOKEN(HOUR) + YY_BREAK +case 73: +YY_RULE_SETUP +#line 133 "flex_lexer.l" +TOKEN(HOURS) + YY_BREAK +case 74: +YY_RULE_SETUP +#line 134 "flex_lexer.l" +TOKEN(IF) + YY_BREAK +case 75: +YY_RULE_SETUP +#line 135 "flex_lexer.l" +TOKEN(ILIKE) + YY_BREAK +case 76: +YY_RULE_SETUP +#line 136 "flex_lexer.l" +TOKEN(IMPORT) + YY_BREAK +case 77: +YY_RULE_SETUP +#line 137 "flex_lexer.l" +TOKEN(IN) + YY_BREAK +case 78: +YY_RULE_SETUP +#line 138 "flex_lexer.l" +TOKEN(INDEX) + YY_BREAK +case 79: +YY_RULE_SETUP +#line 139 "flex_lexer.l" +TOKEN(INNER) + YY_BREAK +case 80: +YY_RULE_SETUP +#line 140 "flex_lexer.l" +TOKEN(INSERT) + YY_BREAK +case 81: +YY_RULE_SETUP +#line 141 "flex_lexer.l" +TOKEN(INT) + YY_BREAK +case 82: +YY_RULE_SETUP +#line 142 "flex_lexer.l" +TOKEN(INTEGER) + YY_BREAK +case 83: +YY_RULE_SETUP +#line 143 "flex_lexer.l" +TOKEN(INTERSECT) + YY_BREAK +case 84: +YY_RULE_SETUP +#line 144 "flex_lexer.l" +TOKEN(INTERVAL) + YY_BREAK +case 85: +YY_RULE_SETUP +#line 145 "flex_lexer.l" +TOKEN(INTO) + YY_BREAK +case 86: +YY_RULE_SETUP +#line 146 "flex_lexer.l" +TOKEN(IS) + YY_BREAK +case 87: +YY_RULE_SETUP +#line 147 "flex_lexer.l" +TOKEN(ISNULL) + YY_BREAK +case 88: +YY_RULE_SETUP +#line 148 "flex_lexer.l" +TOKEN(JOIN) + YY_BREAK +case 89: +YY_RULE_SETUP +#line 149 "flex_lexer.l" +TOKEN(KEY) + YY_BREAK +case 90: +YY_RULE_SETUP +#line 150 "flex_lexer.l" +TOKEN(LEFT) + YY_BREAK +case 91: +YY_RULE_SETUP +#line 151 "flex_lexer.l" +TOKEN(LIKE) + YY_BREAK +case 92: +YY_RULE_SETUP +#line 152 "flex_lexer.l" +TOKEN(LIMIT) + YY_BREAK +case 93: +YY_RULE_SETUP +#line 153 "flex_lexer.l" +TOKEN(LOAD) + YY_BREAK +case 94: +YY_RULE_SETUP +#line 154 "flex_lexer.l" +TOKEN(LOCAL) + YY_BREAK +case 95: +YY_RULE_SETUP +#line 155 "flex_lexer.l" +TOKEN(LOCKED) + YY_BREAK +case 96: +YY_RULE_SETUP +#line 156 "flex_lexer.l" +TOKEN(LONG) + YY_BREAK +case 97: +YY_RULE_SETUP +#line 157 "flex_lexer.l" +TOKEN(MERGE) + YY_BREAK +case 98: +YY_RULE_SETUP +#line 158 "flex_lexer.l" +TOKEN(MINUS) + YY_BREAK +case 99: +YY_RULE_SETUP +#line 159 "flex_lexer.l" +TOKEN(MINUTE) + YY_BREAK +case 100: +YY_RULE_SETUP +#line 160 "flex_lexer.l" +TOKEN(MINUTES) + YY_BREAK +case 101: +YY_RULE_SETUP +#line 161 "flex_lexer.l" +TOKEN(MOD) + YY_BREAK +case 102: +YY_RULE_SETUP +#line 162 "flex_lexer.l" +TOKEN(MONTH) + YY_BREAK +case 103: +YY_RULE_SETUP +#line 163 "flex_lexer.l" +TOKEN(MONTHS) + YY_BREAK +case 104: +YY_RULE_SETUP +#line 164 "flex_lexer.l" +TOKEN(NATURAL) + YY_BREAK +case 105: +YY_RULE_SETUP +#line 165 "flex_lexer.l" +TOKEN(NO) + YY_BREAK +case 106: +YY_RULE_SETUP +#line 166 "flex_lexer.l" +TOKEN(NOT) + YY_BREAK +case 107: +YY_RULE_SETUP +#line 167 "flex_lexer.l" +TOKEN(NOWAIT) + YY_BREAK +case 108: +YY_RULE_SETUP +#line 168 "flex_lexer.l" +TOKEN(NULL) + YY_BREAK +case 109: +YY_RULE_SETUP +#line 169 "flex_lexer.l" +TOKEN(NVARCHAR) + YY_BREAK +case 110: +YY_RULE_SETUP +#line 170 "flex_lexer.l" +TOKEN(OF) + YY_BREAK +case 111: +YY_RULE_SETUP +#line 171 "flex_lexer.l" +TOKEN(OFF) + YY_BREAK +case 112: +YY_RULE_SETUP +#line 172 "flex_lexer.l" +TOKEN(OFFSET) + YY_BREAK +case 113: +YY_RULE_SETUP +#line 173 "flex_lexer.l" +TOKEN(ON) + YY_BREAK +case 114: +YY_RULE_SETUP +#line 174 "flex_lexer.l" +TOKEN(OR) + YY_BREAK +case 115: +YY_RULE_SETUP +#line 175 "flex_lexer.l" +TOKEN(ORDER) + YY_BREAK +case 116: +YY_RULE_SETUP +#line 176 "flex_lexer.l" +TOKEN(OUTER) + YY_BREAK +case 117: +YY_RULE_SETUP +#line 177 "flex_lexer.l" +TOKEN(OVER) + YY_BREAK +case 118: +YY_RULE_SETUP +#line 178 "flex_lexer.l" +TOKEN(PARAMETERS) + YY_BREAK +case 119: +YY_RULE_SETUP +#line 179 "flex_lexer.l" +TOKEN(PARTITION) + YY_BREAK +case 120: +YY_RULE_SETUP +#line 180 "flex_lexer.l" +TOKEN(PLAN) + YY_BREAK +case 121: +YY_RULE_SETUP +#line 181 "flex_lexer.l" +TOKEN(PRECEDING) + YY_BREAK +case 122: +YY_RULE_SETUP +#line 182 "flex_lexer.l" +TOKEN(PREPARE) + YY_BREAK +case 123: +YY_RULE_SETUP +#line 183 "flex_lexer.l" +TOKEN(PRIMARY) + YY_BREAK +case 124: +YY_RULE_SETUP +#line 184 "flex_lexer.l" +TOKEN(RANGE) + YY_BREAK +case 125: +YY_RULE_SETUP +#line 185 "flex_lexer.l" +TOKEN(REAL) + YY_BREAK +case 126: +YY_RULE_SETUP +#line 186 "flex_lexer.l" +TOKEN(REFERENCES) + YY_BREAK +case 127: +YY_RULE_SETUP +#line 187 "flex_lexer.l" +TOKEN(RENAME) + YY_BREAK +case 128: +YY_RULE_SETUP +#line 188 "flex_lexer.l" +TOKEN(RESTRICT) + YY_BREAK +case 129: +YY_RULE_SETUP +#line 189 "flex_lexer.l" +TOKEN(RIGHT) + YY_BREAK +case 130: +YY_RULE_SETUP +#line 190 "flex_lexer.l" +TOKEN(ROLLBACK) + YY_BREAK +case 131: +YY_RULE_SETUP +#line 191 "flex_lexer.l" +TOKEN(ROWS) + YY_BREAK +case 132: +YY_RULE_SETUP +#line 192 "flex_lexer.l" +TOKEN(SCHEMA) + YY_BREAK +case 133: +YY_RULE_SETUP +#line 193 "flex_lexer.l" +TOKEN(SCHEMAS) + YY_BREAK +case 134: +YY_RULE_SETUP +#line 194 "flex_lexer.l" +TOKEN(SECOND) + YY_BREAK +case 135: +YY_RULE_SETUP +#line 195 "flex_lexer.l" +TOKEN(SECONDS) + YY_BREAK +case 136: +YY_RULE_SETUP +#line 196 "flex_lexer.l" +TOKEN(SELECT) + YY_BREAK +case 137: +YY_RULE_SETUP +#line 197 "flex_lexer.l" +TOKEN(SET) + YY_BREAK +case 138: +YY_RULE_SETUP +#line 198 "flex_lexer.l" +TOKEN(SHARE) + YY_BREAK +case 139: +YY_RULE_SETUP +#line 199 "flex_lexer.l" +TOKEN(SHOW) + YY_BREAK +case 140: +YY_RULE_SETUP +#line 200 "flex_lexer.l" +TOKEN(SKIP) + YY_BREAK +case 141: +YY_RULE_SETUP +#line 201 "flex_lexer.l" +TOKEN(SMALLINT) + YY_BREAK +case 142: +YY_RULE_SETUP +#line 202 "flex_lexer.l" +TOKEN(SORTED) + YY_BREAK +case 143: +YY_RULE_SETUP +#line 203 "flex_lexer.l" +TOKEN(SPATIAL) + YY_BREAK +case 144: +YY_RULE_SETUP +#line 204 "flex_lexer.l" +TOKEN(TABLE) + YY_BREAK +case 145: +YY_RULE_SETUP +#line 205 "flex_lexer.l" +TOKEN(TABLES) + YY_BREAK +case 146: +YY_RULE_SETUP +#line 206 "flex_lexer.l" +TOKEN(TEMPORARY) + YY_BREAK +case 147: +YY_RULE_SETUP +#line 207 "flex_lexer.l" +TOKEN(TEXT) + YY_BREAK +case 148: +YY_RULE_SETUP +#line 208 "flex_lexer.l" +TOKEN(THEN) + YY_BREAK +case 149: +YY_RULE_SETUP +#line 209 "flex_lexer.l" +TOKEN(TIME) + YY_BREAK +case 150: +YY_RULE_SETUP +#line 210 "flex_lexer.l" +TOKEN(TIMESTAMP) + YY_BREAK +case 151: +YY_RULE_SETUP +#line 211 "flex_lexer.l" +TOKEN(TO) + YY_BREAK +case 152: +YY_RULE_SETUP +#line 212 "flex_lexer.l" +TOKEN(TOP) + YY_BREAK +case 153: +YY_RULE_SETUP +#line 213 "flex_lexer.l" +TOKEN(TRANSACTION) + YY_BREAK +case 154: +YY_RULE_SETUP +#line 214 "flex_lexer.l" +TOKEN(TRUE) + YY_BREAK +case 155: +YY_RULE_SETUP +#line 215 "flex_lexer.l" +TOKEN(TRUNCATE) + YY_BREAK +case 156: +YY_RULE_SETUP +#line 216 "flex_lexer.l" +TOKEN(UNBOUNDED) + YY_BREAK +case 157: +YY_RULE_SETUP +#line 217 "flex_lexer.l" +TOKEN(UNION) + YY_BREAK +case 158: +YY_RULE_SETUP +#line 218 "flex_lexer.l" +TOKEN(UNIQUE) + YY_BREAK +case 159: +YY_RULE_SETUP +#line 219 "flex_lexer.l" +TOKEN(UNLOAD) + YY_BREAK +case 160: +YY_RULE_SETUP +#line 220 "flex_lexer.l" +TOKEN(UPDATE) + YY_BREAK +case 161: +YY_RULE_SETUP +#line 221 "flex_lexer.l" +TOKEN(USING) + YY_BREAK +case 162: +YY_RULE_SETUP +#line 222 "flex_lexer.l" +TOKEN(VALUES) + YY_BREAK +case 163: +YY_RULE_SETUP +#line 223 "flex_lexer.l" +TOKEN(VARCHAR) + YY_BREAK +case 164: +YY_RULE_SETUP +#line 224 "flex_lexer.l" +TOKEN(VIEW) + YY_BREAK +case 165: +YY_RULE_SETUP +#line 225 "flex_lexer.l" +TOKEN(VIRTUAL) + YY_BREAK +case 166: +YY_RULE_SETUP +#line 226 "flex_lexer.l" +TOKEN(WHEN) + YY_BREAK +case 167: +YY_RULE_SETUP +#line 227 "flex_lexer.l" +TOKEN(WHERE) + YY_BREAK +case 168: +YY_RULE_SETUP +#line 228 "flex_lexer.l" +TOKEN(WITH) + YY_BREAK +case 169: +YY_RULE_SETUP +#line 229 "flex_lexer.l" +TOKEN(YEAR) + YY_BREAK +case 170: +YY_RULE_SETUP +#line 230 "flex_lexer.l" +TOKEN(YEARS) + YY_BREAK +case 171: +/* rule 171 can match eol */ +YY_RULE_SETUP +#line 232 "flex_lexer.l" +TOKEN(CURRENT_ROW) + YY_BREAK +case 172: +/* rule 172 can match eol */ +YY_RULE_SETUP +#line 233 "flex_lexer.l" +TOKEN(CHARACTER_VARYING) + YY_BREAK +/* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ +case 173: +YY_RULE_SETUP +#line 236 "flex_lexer.l" +TOKEN(EQUALS) + YY_BREAK +case 174: +YY_RULE_SETUP +#line 237 "flex_lexer.l" +TOKEN(NULLSAFEEQUALS) + YY_BREAK +case 175: +YY_RULE_SETUP +#line 238 "flex_lexer.l" +TOKEN(NOTEQUALS) + YY_BREAK +case 176: +YY_RULE_SETUP +#line 239 "flex_lexer.l" +TOKEN(NOTEQUALS) + YY_BREAK +case 177: +YY_RULE_SETUP +#line 240 "flex_lexer.l" +TOKEN(LESSEQ) + YY_BREAK +case 178: +YY_RULE_SETUP +#line 241 "flex_lexer.l" +TOKEN(GREATEREQ) + YY_BREAK +case 179: +YY_RULE_SETUP +#line 242 "flex_lexer.l" +TOKEN(LOGICALAND) + YY_BREAK +case 180: +YY_RULE_SETUP +#line 243 "flex_lexer.l" +TOKEN(LOGICALOR) + YY_BREAK +case 181: +YY_RULE_SETUP +#line 244 "flex_lexer.l" +TOKEN(BITSHIFTLEFT) + YY_BREAK +case 182: +YY_RULE_SETUP +#line 245 "flex_lexer.l" +TOKEN(BITSHIFTRIGHT) + YY_BREAK +case 183: +YY_RULE_SETUP +#line 247 "flex_lexer.l" +{ return yytext[0]; } + YY_BREAK +case 184: +#line 250 "flex_lexer.l" +case 185: +#line 251 "flex_lexer.l" +case 186: +YY_RULE_SETUP +#line 251 "flex_lexer.l" +{ + yylval->fval = atof(yytext); + return SQL_FLOATVAL; +} + YY_BREAK +/* + * Regularly, negative literals are treated as . This does not work for LLONG_MIN, as it has no + * positive equivalent. We thus match for LLONG_MIN specifically. This is not an issue for floats, where + * numeric_limits::lowest() == -numeric_limits::max(); + */ +case 187: +YY_RULE_SETUP +#line 261 "flex_lexer.l" +{ + yylval->ival = LLONG_MIN; + return SQL_INTVAL; +} + YY_BREAK +case 188: +YY_RULE_SETUP +#line 266 "flex_lexer.l" +{ + errno = 0; + yylval->ival = strtoll(yytext, nullptr, 0); + if (errno) { + yylval->sval = strdup(yytext); + return SQL_BIGINTVAL; + } + return SQL_INTVAL; +} + YY_BREAK +case 189: +YY_RULE_SETUP +#line 276 "flex_lexer.l" +{ + // Crop the leading and trailing quote char + yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); + return SQL_IDENTIFIER; +} + YY_BREAK +case 190: +YY_RULE_SETUP +#line 282 "flex_lexer.l" +{ + // Crop the leading and trailing quote char + yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); + return SQL_IDENTIFIER; +} + YY_BREAK +case 191: +YY_RULE_SETUP +#line 288 "flex_lexer.l" +{ + yylval->sval = strdup(yytext); + return SQL_IDENTIFIER; +} + YY_BREAK +case 192: +YY_RULE_SETUP +#line 293 "flex_lexer.l" +{ BEGIN singlequotedstring; strbuf.clear(); strbuf.str(""); } // Clear strbuf manually, see #170 + YY_BREAK +case 193: +YY_RULE_SETUP +#line 294 "flex_lexer.l" +{ strbuf << '\''; } + YY_BREAK +case 194: +/* rule 194 can match eol */ +YY_RULE_SETUP +#line 295 "flex_lexer.l" +{ strbuf << yytext; } + YY_BREAK +case 195: +YY_RULE_SETUP +#line 296 "flex_lexer.l" +{ BEGIN 0; yylval->sval = strdup(strbuf.str().c_str()); return SQL_STRING; } + YY_BREAK +case YY_STATE_EOF(singlequotedstring): +#line 297 "flex_lexer.l" +{ fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); return 0; } + YY_BREAK +case 196: +YY_RULE_SETUP +#line 299 "flex_lexer.l" +{ fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); return 0; } + YY_BREAK +case 197: +YY_RULE_SETUP +#line 301 "flex_lexer.l" +ECHO; + YY_BREAK +#line 4554 "flex_lexer.cpp" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMENT): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( yywrap( yyscanner ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = yyg->yytext_ptr; + int number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else + { + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + yy_size_t new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin , yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ + yy_state_type yy_current_state; + char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yyg->yy_start; + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 1406 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) +{ + int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + char *yy_cp = yyg->yy_c_buf_p; + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 1406 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_is_jam = (yy_current_state == 1405); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_UNPUT + +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (yyscan_t yyscanner) +#else + static int input (yyscan_t yyscanner) +#endif + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else + { /* need more input */ + yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr; + ++yyg->yy_c_buf_p; + + switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin , yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( yyscanner ) ) + return 0; + + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(yyscanner); +#else + return input(yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + } + + yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); + yy_load_buffer_state( yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file , yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ + void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree( (void *) b->yy_ch_buf , yyscanner ); + + yyfree( (void *) b , yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_flush_buffer( b , yyscanner); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ + void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param yyscanner The scanner object. + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param yyscanner The scanner object. + */ +void yypop_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) + --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (yyscan_t yyscanner) +{ + yy_size_t num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (!yyg->yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b , yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n , yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n , yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yy_size_t yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +yy_size_t yyget_leng (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param _line_number line number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int _line_number , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + + yylineno = _line_number; +} + +/** Set the current column. + * @param _column_no column number + * @param yyscanner The scanner object. + */ +void yyset_column (int _column_no , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + YY_FATAL_ERROR( "yyset_column called with no buffer" ); + + yycolumn = _column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * @param yyscanner The scanner object. + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str ; +} + +int yyget_debug (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; +} + +void yyset_debug (int _bdebug , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = _bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +YYSTYPE * yyget_lval (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yylval; +} + +void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yylval = yylval_param; +} + +YYLTYPE *yyget_lloc (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yylloc; +} + +void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yylloc = yylloc_param; +} + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ +int yylex_init(yyscan_t* ptr_yy_globals) +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ +int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) +{ + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack , yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + yyfree( yyg->yy_start_stack , yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner , yyscanner ); + yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s , yyscan_t yyscanner) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 301 "flex_lexer.l" + +/*************************** + ** Section 3: User code + ***************************/ + +int yyerror(const char *msg) { + fprintf(stderr, "[SQL-Lexer-Error] %s\n",msg); return 0; +} + diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.h b/extern/hyrise_sql_parser/src/parser/flex_lexer.h new file mode 100644 index 0000000000..6901db577e --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/flex_lexer.h @@ -0,0 +1,739 @@ +#ifndef hsql_HEADER_H +#define hsql_HEADER_H 1 +#define hsql_IN_HEADER 1 + +#line 5 "flex_lexer.h" + +#line 7 "flex_lexer.h" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +#ifdef yy_create_buffer +#define hsql__create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer hsql__create_buffer +#endif + +#ifdef yy_delete_buffer +#define hsql__delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer hsql__delete_buffer +#endif + +#ifdef yy_scan_buffer +#define hsql__scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer hsql__scan_buffer +#endif + +#ifdef yy_scan_string +#define hsql__scan_string_ALREADY_DEFINED +#else +#define yy_scan_string hsql__scan_string +#endif + +#ifdef yy_scan_bytes +#define hsql__scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes hsql__scan_bytes +#endif + +#ifdef yy_init_buffer +#define hsql__init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer hsql__init_buffer +#endif + +#ifdef yy_flush_buffer +#define hsql__flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer hsql__flush_buffer +#endif + +#ifdef yy_load_buffer_state +#define hsql__load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state hsql__load_buffer_state +#endif + +#ifdef yy_switch_to_buffer +#define hsql__switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer hsql__switch_to_buffer +#endif + +#ifdef yypush_buffer_state +#define hsql_push_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state hsql_push_buffer_state +#endif + +#ifdef yypop_buffer_state +#define hsql_pop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state hsql_pop_buffer_state +#endif + +#ifdef yyensure_buffer_stack +#define hsql_ensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack hsql_ensure_buffer_stack +#endif + +#ifdef yylex +#define hsql_lex_ALREADY_DEFINED +#else +#define yylex hsql_lex +#endif + +#ifdef yyrestart +#define hsql_restart_ALREADY_DEFINED +#else +#define yyrestart hsql_restart +#endif + +#ifdef yylex_init +#define hsql_lex_init_ALREADY_DEFINED +#else +#define yylex_init hsql_lex_init +#endif + +#ifdef yylex_init_extra +#define hsql_lex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra hsql_lex_init_extra +#endif + +#ifdef yylex_destroy +#define hsql_lex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy hsql_lex_destroy +#endif + +#ifdef yyget_debug +#define hsql_get_debug_ALREADY_DEFINED +#else +#define yyget_debug hsql_get_debug +#endif + +#ifdef yyset_debug +#define hsql_set_debug_ALREADY_DEFINED +#else +#define yyset_debug hsql_set_debug +#endif + +#ifdef yyget_extra +#define hsql_get_extra_ALREADY_DEFINED +#else +#define yyget_extra hsql_get_extra +#endif + +#ifdef yyset_extra +#define hsql_set_extra_ALREADY_DEFINED +#else +#define yyset_extra hsql_set_extra +#endif + +#ifdef yyget_in +#define hsql_get_in_ALREADY_DEFINED +#else +#define yyget_in hsql_get_in +#endif + +#ifdef yyset_in +#define hsql_set_in_ALREADY_DEFINED +#else +#define yyset_in hsql_set_in +#endif + +#ifdef yyget_out +#define hsql_get_out_ALREADY_DEFINED +#else +#define yyget_out hsql_get_out +#endif + +#ifdef yyset_out +#define hsql_set_out_ALREADY_DEFINED +#else +#define yyset_out hsql_set_out +#endif + +#ifdef yyget_leng +#define hsql_get_leng_ALREADY_DEFINED +#else +#define yyget_leng hsql_get_leng +#endif + +#ifdef yyget_text +#define hsql_get_text_ALREADY_DEFINED +#else +#define yyget_text hsql_get_text +#endif + +#ifdef yyget_lineno +#define hsql_get_lineno_ALREADY_DEFINED +#else +#define yyget_lineno hsql_get_lineno +#endif + +#ifdef yyset_lineno +#define hsql_set_lineno_ALREADY_DEFINED +#else +#define yyset_lineno hsql_set_lineno +#endif + +#ifdef yyget_column +#define hsql_get_column_ALREADY_DEFINED +#else +#define yyget_column hsql_get_column +#endif + +#ifdef yyset_column +#define hsql_set_column_ALREADY_DEFINED +#else +#define yyset_column hsql_set_column +#endif + +#ifdef yywrap +#define hsql_wrap_ALREADY_DEFINED +#else +#define yywrap hsql_wrap +#endif + +#ifdef yyget_lval +#define hsql_get_lval_ALREADY_DEFINED +#else +#define yyget_lval hsql_get_lval +#endif + +#ifdef yyset_lval +#define hsql_set_lval_ALREADY_DEFINED +#else +#define yyset_lval hsql_set_lval +#endif + +#ifdef yyget_lloc +#define hsql_get_lloc_ALREADY_DEFINED +#else +#define yyget_lloc hsql_get_lloc +#endif + +#ifdef yyset_lloc +#define hsql_set_lloc_ALREADY_DEFINED +#else +#define yyset_lloc hsql_set_lloc +#endif + +#ifdef yyalloc +#define hsql_alloc_ALREADY_DEFINED +#else +#define yyalloc hsql_alloc +#endif + +#ifdef yyrealloc +#define hsql_realloc_ALREADY_DEFINED +#else +#define yyrealloc hsql_realloc +#endif + +#ifdef yyfree +#define hsql_free_ALREADY_DEFINED +#else +#define yyfree hsql_free +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +typedef uint64_t flex_uint64_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* begin standard C++ headers. */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + yy_size_t yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +void yyrestart ( FILE *input_file , yyscan_t yyscanner ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); +void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); +void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); +void yypop_buffer_state ( yyscan_t yyscanner ); + +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); + +void *yyalloc ( yy_size_t , yyscan_t yyscanner ); +void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); +void yyfree ( void * , yyscan_t yyscanner ); + +/* Begin user sect3 */ + +#define hsql_wrap(yyscanner) (/*CONSTCOND*/1) +#define YY_SKIP_YYWRAP + +#define yytext_ptr yytext_r + +#ifdef YY_HEADER_EXPORT_START_CONDITIONS +#define INITIAL 0 +#define singlequotedstring 1 +#define COMMENT 2 + +#endif + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( yyscan_t yyscanner ); + +int yyget_debug ( yyscan_t yyscanner ); + +void yyset_debug ( int debug_flag , yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); + +FILE *yyget_in ( yyscan_t yyscanner ); + +void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); + +FILE *yyget_out ( yyscan_t yyscanner ); + +void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); + + yy_size_t yyget_leng ( yyscan_t yyscanner ); + +char *yyget_text ( yyscan_t yyscanner ); + +int yyget_lineno ( yyscan_t yyscanner ); + +void yyset_lineno ( int _line_number , yyscan_t yyscanner ); + +int yyget_column ( yyscan_t yyscanner ); + +void yyset_column ( int _column_no , yyscan_t yyscanner ); + +YYSTYPE * yyget_lval ( yyscan_t yyscanner ); + +void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); + + YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); + + void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( yyscan_t yyscanner ); +#else +extern int yywrap ( yyscan_t yyscanner ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ + (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); + +#define YY_DECL int yylex \ + (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +#ifndef hsql__create_buffer_ALREADY_DEFINED +#undef yy_create_buffer +#endif +#ifndef hsql__delete_buffer_ALREADY_DEFINED +#undef yy_delete_buffer +#endif +#ifndef hsql__scan_buffer_ALREADY_DEFINED +#undef yy_scan_buffer +#endif +#ifndef hsql__scan_string_ALREADY_DEFINED +#undef yy_scan_string +#endif +#ifndef hsql__scan_bytes_ALREADY_DEFINED +#undef yy_scan_bytes +#endif +#ifndef hsql__init_buffer_ALREADY_DEFINED +#undef yy_init_buffer +#endif +#ifndef hsql__flush_buffer_ALREADY_DEFINED +#undef yy_flush_buffer +#endif +#ifndef hsql__load_buffer_state_ALREADY_DEFINED +#undef yy_load_buffer_state +#endif +#ifndef hsql__switch_to_buffer_ALREADY_DEFINED +#undef yy_switch_to_buffer +#endif +#ifndef hsql_push_buffer_state_ALREADY_DEFINED +#undef yypush_buffer_state +#endif +#ifndef hsql_pop_buffer_state_ALREADY_DEFINED +#undef yypop_buffer_state +#endif +#ifndef hsql_ensure_buffer_stack_ALREADY_DEFINED +#undef yyensure_buffer_stack +#endif +#ifndef hsql_lex_ALREADY_DEFINED +#undef yylex +#endif +#ifndef hsql_restart_ALREADY_DEFINED +#undef yyrestart +#endif +#ifndef hsql_lex_init_ALREADY_DEFINED +#undef yylex_init +#endif +#ifndef hsql_lex_init_extra_ALREADY_DEFINED +#undef yylex_init_extra +#endif +#ifndef hsql_lex_destroy_ALREADY_DEFINED +#undef yylex_destroy +#endif +#ifndef hsql_get_debug_ALREADY_DEFINED +#undef yyget_debug +#endif +#ifndef hsql_set_debug_ALREADY_DEFINED +#undef yyset_debug +#endif +#ifndef hsql_get_extra_ALREADY_DEFINED +#undef yyget_extra +#endif +#ifndef hsql_set_extra_ALREADY_DEFINED +#undef yyset_extra +#endif +#ifndef hsql_get_in_ALREADY_DEFINED +#undef yyget_in +#endif +#ifndef hsql_set_in_ALREADY_DEFINED +#undef yyset_in +#endif +#ifndef hsql_get_out_ALREADY_DEFINED +#undef yyget_out +#endif +#ifndef hsql_set_out_ALREADY_DEFINED +#undef yyset_out +#endif +#ifndef hsql_get_leng_ALREADY_DEFINED +#undef yyget_leng +#endif +#ifndef hsql_get_text_ALREADY_DEFINED +#undef yyget_text +#endif +#ifndef hsql_get_lineno_ALREADY_DEFINED +#undef yyget_lineno +#endif +#ifndef hsql_set_lineno_ALREADY_DEFINED +#undef yyset_lineno +#endif +#ifndef hsql_get_column_ALREADY_DEFINED +#undef yyget_column +#endif +#ifndef hsql_set_column_ALREADY_DEFINED +#undef yyset_column +#endif +#ifndef hsql_wrap_ALREADY_DEFINED +#undef yywrap +#endif +#ifndef hsql_get_lval_ALREADY_DEFINED +#undef yyget_lval +#endif +#ifndef hsql_set_lval_ALREADY_DEFINED +#undef yyset_lval +#endif +#ifndef hsql_get_lloc_ALREADY_DEFINED +#undef yyget_lloc +#endif +#ifndef hsql_set_lloc_ALREADY_DEFINED +#undef yyset_lloc +#endif +#ifndef hsql_alloc_ALREADY_DEFINED +#undef yyalloc +#endif +#ifndef hsql_realloc_ALREADY_DEFINED +#undef yyrealloc +#endif +#ifndef hsql_free_ALREADY_DEFINED +#undef yyfree +#endif +#ifndef hsql_text_ALREADY_DEFINED +#undef yytext +#endif +#ifndef hsql_leng_ALREADY_DEFINED +#undef yyleng +#endif +#ifndef hsql_in_ALREADY_DEFINED +#undef yyin +#endif +#ifndef hsql_out_ALREADY_DEFINED +#undef yyout +#endif +#ifndef hsql__flex_debug_ALREADY_DEFINED +#undef yy_flex_debug +#endif +#ifndef hsql_lineno_ALREADY_DEFINED +#undef yylineno +#endif +#ifndef hsql_tables_fload_ALREADY_DEFINED +#undef yytables_fload +#endif +#ifndef hsql_tables_destroy_ALREADY_DEFINED +#undef yytables_destroy +#endif +#ifndef hsql_TABLES_NAME_ALREADY_DEFINED +#undef yyTABLES_NAME +#endif + +#line 301 "flex_lexer.l" + + +#line 737 "flex_lexer.h" +#undef hsql_IN_HEADER +#endif /* hsql_HEADER_H */ diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.l b/extern/hyrise_sql_parser/src/parser/flex_lexer.l new file mode 100644 index 0000000000..5552b261de --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/flex_lexer.l @@ -0,0 +1,308 @@ +/** + * lexer + * + * + */ + + +/*************************** + ** Section 1: Definitions + ***************************/ +%{ + +#include "../sql/Expr.h" +#include "bison_parser.h" +#include +#include +#include + +#define TOKEN(name) { return SQL_##name; } + +static thread_local std::stringstream strbuf; + +%} +%x singlequotedstring + +/*************************** + ** Section 2: Rules + ***************************/ + +/* Define the output files */ +%option header-file="flex_lexer.h" +%option outfile="flex_lexer.cpp" + +/* Make reentrant */ +%option reentrant +%option bison-bridge + +/* performance tweeks */ +%option never-interactive +%option batch + +/* other flags */ +%option noyywrap +%option nounput +%option warn +%option case-insensitive +%option prefix="hsql_" +%option bison-locations +/* %option nodefault */ + + +%s COMMENT + +/*************************** + ** Section 3: Rules + ***************************/ +%% + +-- BEGIN(COMMENT); +[^\n]* /* skipping comment content until a end of line is read */; +\n BEGIN(INITIAL); + +[ \t\n]+ /* skip whitespace */; + +ADD TOKEN(ADD) +AFTER TOKEN(AFTER) +ALL TOKEN(ALL) +ALTER TOKEN(ALTER) +ANALYZE TOKEN(ANALYZE) +AND TOKEN(AND) +ARRAY TOKEN(ARRAY) +AS TOKEN(AS) +ASC TOKEN(ASC) +BEFORE TOKEN(BEFORE) +BEGIN TOKEN(BEGIN) +BETWEEN TOKEN(BETWEEN) +BIGINT TOKEN(BIGINT) +BOOLEAN TOKEN(BOOLEAN) +BY TOKEN(BY) +CALL TOKEN(CALL) +CASCADE TOKEN(CASCADE) +CASE TOKEN(CASE) +CAST TOKEN(CAST) +CHAR TOKEN(CHAR) +COLUMN TOKEN(COLUMN) +COLUMNS TOKEN(COLUMNS) +COMMIT TOKEN(COMMIT) +CONTROL TOKEN(CONTROL) +COPY TOKEN(COPY) +CREATE TOKEN(CREATE) +CROSS TOKEN(CROSS) +DATE TOKEN(DATE) +DATETIME TOKEN(DATETIME) +DAY TOKEN(DAY) +DAYS TOKEN(DAYS) +DEALLOCATE TOKEN(DEALLOCATE) +DECIMAL TOKEN(DECIMAL) +DEFAULT TOKEN(DEFAULT) +DELETE TOKEN(DELETE) +DELTA TOKEN(DELTA) +DESC TOKEN(DESC) +DESCRIBE TOKEN(DESCRIBE) +DIRECT TOKEN(DIRECT) +DISTINCT TOKEN(DISTINCT) +DIV TOKEN(DIV) +DOUBLE TOKEN(DOUBLE) +DROP TOKEN(DROP) +ELSE TOKEN(ELSE) +ENCODING TOKEN(ENCODING) +END TOKEN(END) +ESCAPE TOKEN(ESCAPE) +EXCEPT TOKEN(EXCEPT) +EXECUTE TOKEN(EXECUTE) +EXISTS TOKEN(EXISTS) +EXPLAIN TOKEN(EXPLAIN) +EXTRACT TOKEN(EXTRACT) +FALSE TOKEN(FALSE) +FILE TOKEN(FILE) +FLOAT TOKEN(FLOAT) +FOLLOWING TOKEN(FOLLOWING) +FOR TOKEN(FOR) +FOREIGN TOKEN(FOREIGN) +FORMAT TOKEN(FORMAT) +FROM TOKEN(FROM) +FULL TOKEN(FULL) +GLOBAL TOKEN(GLOBAL) +GROUP TOKEN(GROUP) +GROUPS TOKEN(GROUPS) +HASH TOKEN(HASH) +HAVING TOKEN(HAVING) +HINT TOKEN(HINT) +HOUR TOKEN(HOUR) +HOURS TOKEN(HOURS) +IF TOKEN(IF) +ILIKE TOKEN(ILIKE) +IMPORT TOKEN(IMPORT) +IN TOKEN(IN) +INDEX TOKEN(INDEX) +INNER TOKEN(INNER) +INSERT TOKEN(INSERT) +INT TOKEN(INT) +INTEGER TOKEN(INTEGER) +INTERSECT TOKEN(INTERSECT) +INTERVAL TOKEN(INTERVAL) +INTO TOKEN(INTO) +IS TOKEN(IS) +ISNULL TOKEN(ISNULL) +JOIN TOKEN(JOIN) +KEY TOKEN(KEY) +LEFT TOKEN(LEFT) +LIKE TOKEN(LIKE) +LIMIT TOKEN(LIMIT) +LOAD TOKEN(LOAD) +LOCAL TOKEN(LOCAL) +LOCKED TOKEN(LOCKED) +LONG TOKEN(LONG) +MERGE TOKEN(MERGE) +MINUS TOKEN(MINUS) +MINUTE TOKEN(MINUTE) +MINUTES TOKEN(MINUTES) +MOD TOKEN(MOD) +MONTH TOKEN(MONTH) +MONTHS TOKEN(MONTHS) +NATURAL TOKEN(NATURAL) +NO TOKEN(NO) +NOT TOKEN(NOT) +NOWAIT TOKEN(NOWAIT) +NULL TOKEN(NULL) +NVARCHAR TOKEN(NVARCHAR) +OF TOKEN(OF) +OFF TOKEN(OFF) +OFFSET TOKEN(OFFSET) +ON TOKEN(ON) +OR TOKEN(OR) +ORDER TOKEN(ORDER) +OUTER TOKEN(OUTER) +OVER TOKEN(OVER) +PARAMETERS TOKEN(PARAMETERS) +PARTITION TOKEN(PARTITION) +PLAN TOKEN(PLAN) +PRECEDING TOKEN(PRECEDING) +PREPARE TOKEN(PREPARE) +PRIMARY TOKEN(PRIMARY) +RANGE TOKEN(RANGE) +REAL TOKEN(REAL) +REFERENCES TOKEN(REFERENCES) +RENAME TOKEN(RENAME) +RESTRICT TOKEN(RESTRICT) +RIGHT TOKEN(RIGHT) +ROLLBACK TOKEN(ROLLBACK) +ROWS TOKEN(ROWS) +SCHEMA TOKEN(SCHEMA) +SCHEMAS TOKEN(SCHEMAS) +SECOND TOKEN(SECOND) +SECONDS TOKEN(SECONDS) +SELECT TOKEN(SELECT) +SET TOKEN(SET) +SHARE TOKEN(SHARE) +SHOW TOKEN(SHOW) +SKIP TOKEN(SKIP) +SMALLINT TOKEN(SMALLINT) +SORTED TOKEN(SORTED) +SPATIAL TOKEN(SPATIAL) +TABLE TOKEN(TABLE) +TABLES TOKEN(TABLES) +TEMPORARY TOKEN(TEMPORARY) +TEXT TOKEN(TEXT) +THEN TOKEN(THEN) +TIME TOKEN(TIME) +TIMESTAMP TOKEN(TIMESTAMP) +TO TOKEN(TO) +TOP TOKEN(TOP) +TRANSACTION TOKEN(TRANSACTION) +TRUE TOKEN(TRUE) +TRUNCATE TOKEN(TRUNCATE) +UNBOUNDED TOKEN(UNBOUNDED) +UNION TOKEN(UNION) +UNIQUE TOKEN(UNIQUE) +UNLOAD TOKEN(UNLOAD) +UPDATE TOKEN(UPDATE) +USING TOKEN(USING) +VALUES TOKEN(VALUES) +VARCHAR TOKEN(VARCHAR) +VIEW TOKEN(VIEW) +VIRTUAL TOKEN(VIRTUAL) +WHEN TOKEN(WHEN) +WHERE TOKEN(WHERE) +WITH TOKEN(WITH) +YEAR TOKEN(YEAR) +YEARS TOKEN(YEARS) + +CURRENT[ \t\n]+ROW TOKEN(CURRENT_ROW) +CHARACTER[ \t\n]+VARYING TOKEN(CHARACTER_VARYING) + + /* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ +"==" TOKEN(EQUALS) +"<=>" TOKEN(NULLSAFEEQUALS) +"!=" TOKEN(NOTEQUALS) +"<>" TOKEN(NOTEQUALS) +"<=" TOKEN(LESSEQ) +">=" TOKEN(GREATEREQ) +"&&" TOKEN(LOGICALAND) +"||" TOKEN(LOGICALOR) +"<<" TOKEN(BITSHIFTLEFT) +">>" TOKEN(BITSHIFTRIGHT) + +[-+*/(){},.;<>=^%:?[\]|&] { return yytext[0]; } + +[0-9]+"."[0-9]*([eE][-+]?[0-9]+)? | +"."[0-9]+([eE][-+]?[0-9]+)? | +[0-9]+[eE][-+]?[0-9]+ { + yylval->fval = atof(yytext); + return SQL_FLOATVAL; +} + + /* + * Regularly, negative literals are treated as . This does not work for LLONG_MIN, as it has no + * positive equivalent. We thus match for LLONG_MIN specifically. This is not an issue for floats, where + * numeric_limits::lowest() == -numeric_limits::max(); + */ +-9223372036854775808 { + yylval->ival = LLONG_MIN; + return SQL_INTVAL; +} + +[0-9]+ { + errno = 0; + yylval->ival = strtoll(yytext, nullptr, 0); + if (errno) { + yylval->sval = strdup(yytext); + return SQL_BIGINTVAL; + } + return SQL_INTVAL; +} + +\"[^\"\n]+\" { + // Crop the leading and trailing quote char + yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); + return SQL_IDENTIFIER; +} + +`[^`\n]+` { + // Crop the leading and trailing quote char + yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); + return SQL_IDENTIFIER; +} + +[A-Za-z][A-Za-z0-9_]* { + yylval->sval = strdup(yytext); + return SQL_IDENTIFIER; +} + +\' { BEGIN singlequotedstring; strbuf.clear(); strbuf.str(""); } // Clear strbuf manually, see #170 +\'\' { strbuf << '\''; } +[^']* { strbuf << yytext; } +\' { BEGIN 0; yylval->sval = strdup(strbuf.str().c_str()); return SQL_STRING; } +<> { fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); return 0; } + +. { fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); return 0; } + +%% +/*************************** + ** Section 3: User code + ***************************/ + +int yyerror(const char *msg) { + fprintf(stderr, "[SQL-Lexer-Error] %s\n",msg); return 0; +} diff --git a/extern/hyrise_sql_parser/src/parser/keywordlist_generator.py b/extern/hyrise_sql_parser/src/parser/keywordlist_generator.py new file mode 100644 index 0000000000..c4e3fcbf13 --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/keywordlist_generator.py @@ -0,0 +1,46 @@ +from __future__ import print_function +import math + + +with open("sql_keywords.txt", 'r') as fh: + keywords = [line.strip() for line in fh.readlines() if not line.strip().startswith("//") and len(line.strip()) > 0] + + keywords = sorted(set(keywords)) # Sort by name + keywords = sorted(keywords, key=lambda x: len(x), reverse=True) # Sort by length + + ################# + # Flex + + max_len = len(max(keywords, key=lambda x: len(x))) + 1 + max_len = 4 * int(math.ceil(max_len / 4.0)) + + for keyword in keywords: + len_diff = (max_len) - len(keyword) + num_tabs = int(math.floor(len_diff / 4.0)) + + if len_diff % 4 != 0: num_tabs += 1 + + tabs = ''.join(['\t' for _ in range(num_tabs)]) + print("%s%sTOKEN(%s)" % (keyword, tabs, keyword)) + + # + ################# + + + ################# + # Bison + line = "%token" + max_len = 60 + + print("/* SQL Keywords */") + for keyword in keywords: + + if len(line + " " + keyword) > max_len: + print(line) + line = "%token " + keyword + else: + line = line + " " + keyword + print(line) + + # + ################# diff --git a/extern/hyrise_sql_parser/src/parser/parser_typedef.h b/extern/hyrise_sql_parser/src/parser/parser_typedef.h new file mode 100644 index 0000000000..61afef4a20 --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/parser_typedef.h @@ -0,0 +1,33 @@ +#ifndef __PARSER_TYPEDEF_H__ +#define __PARSER_TYPEDEF_H__ + +#include + +#ifndef YYtypeDEF_YY_SCANNER_T +#define YYtypeDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +#define YYSTYPE HSQL_STYPE +#define YYLTYPE HSQL_LTYPE + +struct HSQL_CUST_LTYPE { + int first_line; + int first_column; + int last_line; + int last_column; + + int total_column; + + // Length of the string in the SQL query string + int string_length; + + // Parameters. + // int param_id; + std::vector param_list; +}; + +#define HSQL_LTYPE HSQL_CUST_LTYPE +#define HSQL_LTYPE_IS_DECLARED 1 + +#endif diff --git a/extern/hyrise_sql_parser/src/parser/sql_keywords.txt b/extern/hyrise_sql_parser/src/parser/sql_keywords.txt new file mode 100644 index 0000000000..ba4bfa19fb --- /dev/null +++ b/extern/hyrise_sql_parser/src/parser/sql_keywords.txt @@ -0,0 +1,163 @@ +// Possible source for more tokens https://www.sqlite.org/lang_keywords.html + +////////////////////////// +// Select Statement +SELECT +TOP +FROM +WHERE +GROUP +BY +HAVING +ORDER +ASC +DESC +LIMIT +DISTINCT +OFFSET +UNION +ALL +EXCEPT +MINUS +INTERSECT + +// Join clause +JOIN +ON +INNER +OUTER +LEFT +RIGHT +FULL +CROSS +USING +NATURAL +// Select Statement +////////////////////// +// Data Definition +CREATE +TABLE +SCHEMA +INDEX +VIEW +IF +NOT +EXISTS +GLOBAL +LOCAL +TEMPORARY +UNIQUE +VIRTUAL + +INDEX +UNIQUE +HASH +SPATIAL +PRIMARY +KEY +ON + +DROP +TABLE +SCHEMA +RESTRICT +CASCADE + +ALTER +ADD +COLUMN +BEFORE +AFTER +// Data Definition +//////////////////////// +// Data Manipulation +INSERT +VALUES +DIRECT +SORTED + +COPY +FORMAT + +IMPORT +FILE +CONTROL + +UPDATE +SET + +DELETE + +TRUNCATE + +MERGE +DELTA +OF + +LOAD +UNLOAD + +DELETE + +// Prepared Statements +DEALLOCATE +PREPARE +EXECUTE + +/////////////////////////////// +// other statements +RENAME +EXPLAIN +PLAN +ANALYZE + +SHOW +SCHEMAS +TABLES +COLUMNS + +// misc. +COLUMN +INTO +AS +SET +DEFAULT +CALL +FOR +TO +ARRAY + + +// Expressions +NOT +AND +OR +NULL +LIKE +IN +IS +ISNULL +BETWEEN +ESCAPE +CASE +WHEN +THEN +ELSE +END + +// With +WITH +HINT +PARAMETERS +ON +OFF + +// Data types +DATE +TIME +TIMESTAMP +INTEGER +INT +DOUBLE +NVARCHAR +TEXT diff --git a/extern/hyrise_sql_parser/src/sql/AlterStatement.h b/extern/hyrise_sql_parser/src/sql/AlterStatement.h new file mode 100644 index 0000000000..096ed7cf52 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/AlterStatement.h @@ -0,0 +1,40 @@ +#ifndef SQLPARSER_ALTER_STATEMENT_H +#define SQLPARSER_ALTER_STATEMENT_H + +#include "SQLStatement.h" + +// Note: Implementations of constructors and destructors can be found in statements.cpp. +namespace hsql { + +enum ActionType { + DropColumn, +}; + +struct AlterAction { + AlterAction(ActionType type); + ActionType type; + virtual ~AlterAction(); +}; + +struct DropColumnAction : AlterAction { + DropColumnAction(char* column_name); + char* columnName; + bool ifExists; + + ~DropColumnAction() override; +}; + +// Represents SQL Alter Table statements. +// Example "ALTER TABLE students DROP COLUMN name;" +struct AlterStatement : SQLStatement { + AlterStatement(char* name, AlterAction* action); + ~AlterStatement() override; + + char* schema; + bool ifTableExists; + char* name; + AlterAction* action; +}; +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/ColumnType.h b/extern/hyrise_sql_parser/src/sql/ColumnType.h new file mode 100644 index 0000000000..127f84b5bc --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/ColumnType.h @@ -0,0 +1,43 @@ +#ifndef SQLPARSER_COLUMN_TYPE_H +#define SQLPARSER_COLUMN_TYPE_H + +#include +#include + +namespace hsql { +enum class DataType { + UNKNOWN, + BIGINT, + BOOLEAN, + CHAR, + DATE, + DATETIME, + DECIMAL, + DOUBLE, + FLOAT, + INT, + LONG, + REAL, + SMALLINT, + TEXT, + TIME, + VARCHAR, +}; + +// Represents the type of a column, e.g., FLOAT or VARCHAR(10) +struct ColumnType { + ColumnType() = default; + ColumnType(DataType data_type, int64_t length = 0, int64_t precision = 0, int64_t scale = 0); + DataType data_type; + int64_t length; // Used for, e.g., VARCHAR(10) + int64_t precision; // Used for, e.g., DECIMAL (6, 4) or TIME (5) + int64_t scale; // Used for DECIMAL (6, 4) +}; + +bool operator==(const ColumnType& lhs, const ColumnType& rhs); +bool operator!=(const ColumnType& lhs, const ColumnType& rhs); +std::ostream& operator<<(std::ostream&, const ColumnType&); + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/CreateStatement.cpp b/extern/hyrise_sql_parser/src/sql/CreateStatement.cpp new file mode 100644 index 0000000000..c6340838dc --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/CreateStatement.cpp @@ -0,0 +1,152 @@ +#include "CreateStatement.h" +#include "SelectStatement.h" + +namespace hsql { + +std::ostream& operator<<(std::ostream& os, const ConstraintType constraint_type) { + switch (constraint_type) { + case ConstraintType::Null: + os << "NULL"; + break; + case ConstraintType::NotNull: + os << "NOT NULL"; + break; + case ConstraintType::ForeignKey: + os << "FOREIGN KEY"; + break; + case ConstraintType::PrimaryKey: + os << "PRIMARY KEY"; + break; + case ConstraintType::Unique: + os << "UNIQUE"; + break; + } + return os; +} + +// Constraints +TableConstraint::TableConstraint(ConstraintType type, std::vector* columnNames) + : type(type), columnNames(columnNames) {} + +TableConstraint::~TableConstraint() { + for (auto* column : *columnNames) { + free(column); + } + delete columnNames; +} + +// Foreign key constraint +ReferencesSpecification::ReferencesSpecification(char* schema, char* table, std::vector* columns) + : schema{schema}, table{table}, columns{columns} {}; + +ReferencesSpecification::~ReferencesSpecification() { + free(schema); + free(table); + if (columns) { + for (auto* column : *columns) { + free(column); + } + delete columns; + } +} + +ForeignKeyConstraint::ForeignKeyConstraint(std::vector* columnNames, ReferencesSpecification* references) + : TableConstraint(ConstraintType::ForeignKey, columnNames), references{references} {} + +ForeignKeyConstraint::~ForeignKeyConstraint() { delete references; } + +ColumnConstraints::ColumnConstraints() + : constraints{new std::unordered_set()}, references{new std::vector} {} + +// ColumnDefinition +ColumnDefinition::ColumnDefinition(char* name, ColumnType type, std::unordered_set* column_constraints, + std::vector* references) + : column_constraints(column_constraints), name(name), type(type), nullable(true), references(references) {} + +ColumnDefinition::~ColumnDefinition() { + free(name); + delete column_constraints; + if (references) { + for (auto* ref : *references) { + delete ref; + } + } + delete references; +} + +bool ColumnDefinition::trySetNullableExplicit() { + if (column_constraints->count(ConstraintType::NotNull) || column_constraints->count(ConstraintType::PrimaryKey)) { + if (column_constraints->count(ConstraintType::Null)) { + return false; + } + nullable = false; + } + + return true; +} + +// CreateStatemnet +CreateStatement::CreateStatement(CreateType type) + : SQLStatement(kStmtCreate), + type(type), + ifNotExists(false), + filePath(nullptr), + schema(nullptr), + tableName(nullptr), + indexName(nullptr), + indexColumns(nullptr), + columns(nullptr), + tableConstraints(nullptr), + viewColumns(nullptr), + select(nullptr) {} + +CreateStatement::~CreateStatement() { + free(filePath); + free(schema); + free(tableName); + free(indexName); + delete select; + + if (columns) { + for (auto* def : *columns) { + delete def; + } + delete columns; + } + + if (tableConstraints) { + for (auto* def : *tableConstraints) { + delete def; + } + delete tableConstraints; + } + + if (indexColumns) { + for (char* column : *indexColumns) { + free(column); + } + delete indexColumns; + } + + if (viewColumns) { + for (char* column : *viewColumns) { + free(column); + } + delete viewColumns; + } +} + +void CreateStatement::setColumnDefsAndConstraints(std::vector* tableElements) { + columns = new std::vector(); + tableConstraints = new std::vector(); + + for (auto tableElem : *tableElements) { + if (auto* colDef = dynamic_cast(tableElem)) { + columns->emplace_back(colDef); + } else if (auto* tableConstraint = dynamic_cast(tableElem)) { + tableConstraints->emplace_back(tableConstraint); + } + } +} + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/CreateStatement.h b/extern/hyrise_sql_parser/src/sql/CreateStatement.h new file mode 100644 index 0000000000..aaad0c24f5 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/CreateStatement.h @@ -0,0 +1,103 @@ +#ifndef SQLPARSER_CREATE_STATEMENT_H +#define SQLPARSER_CREATE_STATEMENT_H + +#include "ColumnType.h" +#include "SQLStatement.h" + +#include +#include + +namespace hsql { +struct SelectStatement; + +enum struct ConstraintType { ForeignKey, NotNull, Null, PrimaryKey, Unique }; +std::ostream& operator<<(std::ostream& os, const ConstraintType constraint_type); + +// Superclass for both TableConstraint and ColumnDefinition. +struct TableElement { + virtual ~TableElement() = default; +}; + +// Represents definition of a table constraint. +struct TableConstraint : TableElement { + TableConstraint(ConstraintType keyType, std::vector* columnNames); + + ~TableConstraint() override; + + ConstraintType type; + std::vector* columnNames; +}; + +// Table and columns referenced by foreign key constraint on table or column level. +struct ReferencesSpecification { + ReferencesSpecification(char* schema, char* table, std::vector* columns); + ~ReferencesSpecification(); + + char* schema; + char* table; + std::vector* columns; +}; + +// Foreign key constraint on table level (when specified as table element). +struct ForeignKeyConstraint : TableConstraint { + ForeignKeyConstraint(std::vector* columnNames, ReferencesSpecification* references); + ~ForeignKeyConstraint() override; + + ReferencesSpecification* references; +}; + +// Represents definition of a table column +struct ColumnDefinition : TableElement { + ColumnDefinition(char* name, ColumnType type, std::unordered_set* column_constraints, + std::vector* references); + ~ColumnDefinition() override; + + // By default, columns are nullable. However, we track if a column is explicitly requested to be nullable to + // notice conflicts with PRIMARY KEY table constraints. + bool trySetNullableExplicit(); + + std::unordered_set* column_constraints; + char* name; + ColumnType type; + bool nullable; + std::vector* references; +}; + +struct ColumnConstraints { + explicit ColumnConstraints(); + + std::unordered_set* constraints; + std::vector* references; +}; + +enum CreateType { + kCreateTable, + kCreateTableFromTbl, // Hyrise file format + kCreateView, + kCreateIndex +}; + +// Represents SQL Create statements. +// Example: "CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE)" +struct CreateStatement : SQLStatement { + CreateStatement(CreateType type); + ~CreateStatement() override; + + void setColumnDefsAndConstraints(std::vector* tableElements); + + CreateType type; + bool ifNotExists; // default: false + char* filePath; // default: nullptr + char* schema; // default: nullptr + char* tableName; // default: nullptr + char* indexName; // default: nullptr + std::vector* indexColumns; // default: nullptr + std::vector* columns; // default: nullptr + std::vector* tableConstraints; // default: nullptr + std::vector* viewColumns; + SelectStatement* select; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/DeleteStatement.h b/extern/hyrise_sql_parser/src/sql/DeleteStatement.h new file mode 100644 index 0000000000..dfa00fd824 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/DeleteStatement.h @@ -0,0 +1,23 @@ +#ifndef SQLPARSER_DELETE_STATEMENT_H +#define SQLPARSER_DELETE_STATEMENT_H + +#include "SQLStatement.h" + +// Note: Implementations of constructors and destructors can be found in statements.cpp. +namespace hsql { + +// Represents SQL Delete statements. +// Example: "DELETE FROM students WHERE grade > 3.0" +// Note: if (expr == nullptr) => delete all rows (truncate) +struct DeleteStatement : SQLStatement { + DeleteStatement(); + ~DeleteStatement() override; + + char* schema; + char* tableName; + Expr* expr; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/DropStatement.h b/extern/hyrise_sql_parser/src/sql/DropStatement.h new file mode 100644 index 0000000000..bdb4db7bf8 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/DropStatement.h @@ -0,0 +1,25 @@ +#ifndef SQLPARSER_DROP_STATEMENT_H +#define SQLPARSER_DROP_STATEMENT_H + +#include "SQLStatement.h" + +// Note: Implementations of constructors and destructors can be found in statements.cpp. +namespace hsql { + +enum DropType { kDropTable, kDropSchema, kDropIndex, kDropView, kDropPreparedStatement }; + +// Represents SQL Delete statements. +// Example "DROP TABLE students;" +struct DropStatement : SQLStatement { + DropStatement(DropType type); + ~DropStatement() override; + + DropType type; + bool ifExists; + char* schema; + char* name; + char* indexName; +}; + +} // namespace hsql +#endif diff --git a/extern/hyrise_sql_parser/src/sql/ExecuteStatement.h b/extern/hyrise_sql_parser/src/sql/ExecuteStatement.h new file mode 100644 index 0000000000..ea039307d7 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/ExecuteStatement.h @@ -0,0 +1,20 @@ +#ifndef SQLPARSER_EXECUTE_STATEMENT_H +#define SQLPARSER_EXECUTE_STATEMENT_H + +#include "SQLStatement.h" + +namespace hsql { + +// Represents SQL Execute statements. +// Example: "EXECUTE ins_prep(100, "test", 2.3);" +struct ExecuteStatement : SQLStatement { + ExecuteStatement(); + ~ExecuteStatement() override; + + char* name; + std::vector* parameters; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/ExportStatement.h b/extern/hyrise_sql_parser/src/sql/ExportStatement.h new file mode 100644 index 0000000000..bd7ef3ac2d --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/ExportStatement.h @@ -0,0 +1,26 @@ +#ifndef SQLPARSER_EXPORT_STATEMENT_H +#define SQLPARSER_EXPORT_STATEMENT_H + +#include "ImportExportOptions.h" +#include "SQLStatement.h" +#include "SelectStatement.h" + +namespace hsql { +// Represents SQL Export statements. +struct ExportStatement : SQLStatement { + ExportStatement(ImportType type); + ~ExportStatement() override; + + // ImportType is used for compatibility reasons + ImportType type; + char* filePath; + char* schema; + char* tableName; + SelectStatement* select; + char* encoding; + CsvOptions* csv_options; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/Expr.cpp b/extern/hyrise_sql_parser/src/sql/Expr.cpp new file mode 100644 index 0000000000..131ed837e4 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/Expr.cpp @@ -0,0 +1,339 @@ +#include "Expr.h" + +#include +#include +#include + +#include "SelectStatement.h" + +namespace hsql { + +FrameBound::FrameBound(int64_t offset, FrameBoundType type, bool unbounded) + : offset{offset}, type{type}, unbounded{unbounded} {} + +FrameDescription::FrameDescription(FrameType type, FrameBound* start, FrameBound* end) + : type{type}, start{start}, end{end} {} + +FrameDescription::~FrameDescription() { + delete start; + delete end; +} + +WindowDescription::WindowDescription(std::vector* partitionList, std::vector* orderList, + FrameDescription* frameDescription) + : partitionList{partitionList}, orderList{orderList}, frameDescription{frameDescription} {} + +WindowDescription::~WindowDescription() { + if (partitionList) { + for (Expr* e : *partitionList) { + delete e; + } + delete partitionList; + } + + if (orderList) { + for (OrderDescription* orderDescription : *orderList) { + delete orderDescription; + } + delete orderList; + } + + delete frameDescription; +} + +Expr::Expr(ExprType type) + : type(type), + expr(nullptr), + expr2(nullptr), + exprList(nullptr), + select(nullptr), + name(nullptr), + table(nullptr), + schema(nullptr), + alias(nullptr), + fval(0), + ival(0), + ival2(0), + datetimeField(kDatetimeNone), + columnType(DataType::UNKNOWN, 0), + isBoolLiteral(false), + opType(kOpNone), + distinct(false), + windowDescription(nullptr) {} + +Expr::~Expr() { + delete expr; + delete expr2; + delete select; + delete windowDescription; + + free(name); + free(table); + free(schema); + free(alias); + + if (exprList) { + for (Expr* e : *exprList) { + delete e; + } + delete exprList; + } +} + +Expr* Expr::make(ExprType type) { + Expr* e = new Expr(type); + return e; +} + +Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) { + Expr* e = new Expr(kExprOperator); + e->opType = op; + e->expr = expr; + e->expr2 = nullptr; + return e; +} + +Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) { + Expr* e = new Expr(kExprOperator); + e->opType = op; + e->expr = expr1; + e->expr2 = expr2; + return e; +} + +Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) { + Expr* e = new Expr(kExprOperator); + e->expr = expr; + e->opType = kOpBetween; + e->exprList = new std::vector(); + e->exprList->push_back(left); + e->exprList->push_back(right); + return e; +} + +Expr* Expr::makeCaseList(Expr* caseListElement) { + Expr* e = new Expr(kExprOperator); + // Case list expressions are temporary and will be integrated into the case + // expressions exprList - thus assign operator type kOpNone + e->opType = kOpNone; + e->exprList = new std::vector(); + e->exprList->push_back(caseListElement); + return e; +} + +Expr* Expr::makeCaseListElement(Expr* when, Expr* then) { + Expr* e = new Expr(kExprOperator); + e->opType = kOpCaseListElement; + e->expr = when; + e->expr2 = then; + return e; +} + +Expr* Expr::caseListAppend(Expr* caseList, Expr* caseListElement) { + caseList->exprList->push_back(caseListElement); + return caseList; +} + +Expr* Expr::makeCase(Expr* expr, Expr* caseList, Expr* elseExpr) { + Expr* e = new Expr(kExprOperator); + e->opType = kOpCase; + e->expr = expr; + e->expr2 = elseExpr; + e->exprList = caseList->exprList; + caseList->exprList = nullptr; + delete caseList; + return e; +} + +Expr* Expr::makeLiteral(int64_t val) { + Expr* e = new Expr(kExprLiteralInt); + e->ival = val; + return e; +} + +Expr* Expr::makeLiteralIntString(char* val) { + Expr* e = new Expr(kExprLiteralIntString); + e->name = val; + return e; +} + +Expr* Expr::makeLiteral(double value) { + Expr* e = new Expr(kExprLiteralFloat); + e->fval = value; + return e; +} + +Expr* Expr::makeLiteral(char* string) { + Expr* e = new Expr(kExprLiteralString); + e->name = string; + return e; +} + +Expr* Expr::makeLiteral(bool val) { + Expr* e = new Expr(kExprLiteralInt); + e->ival = (int)val; + e->isBoolLiteral = true; + return e; +} + +Expr* Expr::makeNullLiteral() { + Expr* e = new Expr(kExprLiteralNull); + return e; +} + +Expr* Expr::makeDateLiteral(char* string) { + Expr* e = new Expr(kExprLiteralDate); + e->name = string; + return e; +} + +Expr* Expr::makeIntervalLiteral(int64_t duration, DatetimeField unit) { + Expr* e = new Expr(kExprLiteralInterval); + e->ival = duration; + e->datetimeField = unit; + return e; +} + +Expr* Expr::makeColumnRef(char* name) { + Expr* e = new Expr(kExprColumnRef); + e->name = name; + return e; +} + +Expr* Expr::makeColumnRef(char* table, char* name) { + Expr* e = new Expr(kExprColumnRef); + e->name = name; + e->table = table; + return e; +} + +Expr* Expr::makeColumnRef(char* schema, char* table, char* name) { + Expr* e = new Expr(kExprColumnRef); + e->name = name; + e->table = table; + e->schema = schema; + return e; +} + +Expr* Expr::makeStar(void) { + Expr* e = new Expr(kExprStar); + return e; +} + +Expr* Expr::makeStar(char* table) { + Expr* e = new Expr(kExprStar); + e->table = table; + return e; +} + +Expr* Expr::makeFunctionRef(char* func_name, std::vector* exprList, bool distinct, WindowDescription* window) { + Expr* e = new Expr(kExprFunctionRef); + e->name = func_name; + e->exprList = exprList; + e->distinct = distinct; + e->windowDescription = window; + return e; +} + +Expr* Expr::makeFunctionRef(char* func_name, char* schema, std::vector* exprList, bool distinct, WindowDescription* window) { + Expr* e = new Expr(kExprFunctionRef); + e->name = func_name; + e->schema = schema; + e->exprList = exprList; + e->distinct = distinct; + e->windowDescription = window; + return e; +} + +Expr* Expr::makeArray(std::vector* exprList) { + Expr* e = new Expr(kExprArray); + e->exprList = exprList; + return e; +} + +Expr* Expr::makeArrayIndex(Expr* expr, int64_t index) { + Expr* e = new Expr(kExprArrayIndex); + e->expr = expr; + e->ival = index; + return e; +} + +Expr* Expr::makeParameter(int id) { + Expr* e = new Expr(kExprParameter); + e->ival = id; + return e; +} + +Expr* Expr::makeSelect(SelectStatement* select) { + Expr* e = new Expr(kExprSelect); + e->select = select; + return e; +} + +Expr* Expr::makeExists(SelectStatement* select) { + Expr* e = new Expr(kExprOperator); + e->opType = kOpExists; + e->select = select; + return e; +} + +Expr* Expr::makeInOperator(Expr* expr, std::vector* exprList) { + Expr* e = new Expr(kExprOperator); + e->opType = kOpIn; + e->expr = expr; + e->exprList = exprList; + + return e; +} + +Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) { + Expr* e = new Expr(kExprOperator); + e->opType = kOpIn; + e->expr = expr; + e->select = select; + + return e; +} + +Expr* Expr::makeExtract(DatetimeField datetimeField, Expr* expr) { + Expr* e = new Expr(kExprExtract); + e->datetimeField = datetimeField; + e->expr = expr; + return e; +} + +Expr* Expr::makeCast(Expr* expr, ColumnType columnType) { + Expr* e = new Expr(kExprCast); + e->columnType = columnType; + e->expr = expr; + return e; +} + +bool Expr::isType(ExprType exprType) const { return exprType == type; } + +bool Expr::isLiteral() const { + return isType(kExprLiteralInt) || isType(kExprLiteralIntString) || isType(kExprLiteralFloat) || + isType(kExprLiteralString) || isType(kExprParameter) || isType(kExprLiteralNull) || + isType(kExprLiteralDate) || isType(kExprLiteralInterval); +} + +bool Expr::hasAlias() const { return alias != nullptr; } + +bool Expr::hasTable() const { return table != nullptr; } + +const char* Expr::getName() const { + if (alias) + return alias; + else + return name; +} + +char* substr(const char* source, int from, int to) { + int len = to - from; + char* copy = (char*)malloc(len + 1); + ; + strncpy(copy, source + from, len); + copy[len] = '\0'; + return copy; +} +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/Expr.h b/extern/hyrise_sql_parser/src/sql/Expr.h new file mode 100644 index 0000000000..e1b8d96112 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/Expr.h @@ -0,0 +1,253 @@ +#ifndef SQLPARSER_EXPR_H +#define SQLPARSER_EXPR_H + +#include +#include +#include +#include "ColumnType.h" + +namespace hsql { +struct SelectStatement; +struct OrderDescription; + +// Helper function used by the lexer. +// TODO: move to more appropriate place. +char* substr(const char* source, int from, int to); + +enum ExprType { + kExprLiteralFloat, + kExprLiteralString, + kExprLiteralInt, + kExprLiteralIntString, + kExprLiteralNull, + kExprLiteralDate, + kExprLiteralInterval, + kExprStar, + kExprParameter, + kExprColumnRef, + kExprFunctionRef, + kExprOperator, + kExprSelect, + kExprHint, + kExprArray, + kExprArrayIndex, + kExprExtract, + kExprCast +}; + +// Operator types. These are important for expressions of type kExprOperator. +enum OperatorType { + kOpNone, + + // Ternary operator + kOpBetween, + + // n-nary special case + kOpCase, + kOpCaseListElement, // `WHEN expr THEN expr` + + // Binary operators. + kOpPlus, + kOpMinus, + kOpAsterisk, + kOpSlash, + kOpPercentage, + kOpMod, + kOpDiv, + kOpCaret, + kOpBitAnd, + kOpBitOr, + kOpBitXor, + kOpBitShiftLeft, + kOpBitShiftRight, + + kOpEquals, + kOpNullSafeEquals, + kOpNotEquals, + kOpLess, + kOpLessEq, + kOpGreater, + kOpGreaterEq, + kOpLike, + kOpNotLike, + kOpILike, + kOpAnd, + kOpOr, + kOpIn, + kOpConcat, + + // Unary operators. + kOpNot, + kOpUnaryMinus, + kOpIsNull, + kOpExists +}; + +enum DatetimeField { + kDatetimeNone, + kDatetimeSecond, + kDatetimeMinute, + kDatetimeHour, + kDatetimeDay, + kDatetimeMonth, + kDatetimeYear, +}; + +// Description of the frame clause within a window expression. +enum FrameBoundType { kFollowing, kPreceding, kCurrentRow }; +struct FrameBound { + FrameBound(int64_t offset, FrameBoundType type, bool unbounded); + + int64_t offset; + FrameBoundType type; + bool unbounded; +}; + +enum FrameType { kRange, kRows, kGroups }; +struct FrameDescription { + FrameDescription(FrameType type, FrameBound* start, FrameBound* end); + virtual ~FrameDescription(); + + FrameType type; + FrameBound* start; + FrameBound* end; +}; + +typedef struct Expr Expr; + +// Description of additional fields for a window expression. +struct WindowDescription { + WindowDescription(std::vector* partitionList, std::vector* orderList, + FrameDescription* frameDescription); + virtual ~WindowDescription(); + + std::vector* partitionList; + std::vector* orderList; + FrameDescription* frameDescription; +}; + +// Represents SQL expressions (i.e. literals, operators, column_refs). +// TODO: When destructing a placeholder expression, we might need to alter the +// placeholder_list. +struct Expr { + Expr(ExprType type); + virtual ~Expr(); + + ExprType type; + + // TODO: Replace expressions by list. + Expr* expr; + Expr* expr2; + std::vector* exprList; + SelectStatement* select; + char* name; + char* table; + char* schema; + char* alias; + double fval; + int64_t ival; + int64_t ival2; + DatetimeField datetimeField; + ColumnType columnType; + bool isBoolLiteral; + + OperatorType opType; + bool distinct; + + WindowDescription* windowDescription; + + // Convenience accessor methods. + + bool isType(ExprType exprType) const; + + bool isLiteral() const; + + bool hasAlias() const; + + bool hasTable() const; + + const char* getName() const; + + // Static constructors. + + static Expr* make(ExprType type); + + static Expr* makeOpUnary(OperatorType op, Expr* expr); + + static Expr* makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2); + + static Expr* makeBetween(Expr* expr, Expr* left, Expr* right); + + static Expr* makeCaseList(Expr* caseListElement); + + static Expr* makeCaseListElement(Expr* when, Expr* then); + + static Expr* caseListAppend(Expr* caseList, Expr* caseListElement); + + static Expr* makeCase(Expr* expr, Expr* when, Expr* elseExpr); + + static Expr* makeLiteral(int64_t val); + + static Expr* makeLiteralIntString(char* val); + + static Expr* makeLiteral(double val); + + static Expr* makeLiteral(char* val); + + static Expr* makeLiteral(bool val); + + static Expr* makeNullLiteral(); + + static Expr* makeDateLiteral(char* val); + + static Expr* makeIntervalLiteral(int64_t duration, DatetimeField unit); + + static Expr* makeColumnRef(char* name); + + static Expr* makeColumnRef(char* table, char* name); + + static Expr* makeColumnRef(char* schema, char* table, char* name); + + static Expr* makeStar(void); + + static Expr* makeStar(char* table); + + static Expr* makeFunctionRef(char* func_name, std::vector* exprList, bool distinct, WindowDescription* window); + + static Expr* makeFunctionRef(char* func_name, char* schema, std::vector* exprList, bool distinct, WindowDescription* window); + + static Expr* makeArray(std::vector* exprList); + + static Expr* makeArrayIndex(Expr* expr, int64_t index); + + static Expr* makeParameter(int id); + + static Expr* makeSelect(SelectStatement* select); + + static Expr* makeExists(SelectStatement* select); + + static Expr* makeInOperator(Expr* expr, std::vector* exprList); + + static Expr* makeInOperator(Expr* expr, SelectStatement* select); + + static Expr* makeExtract(DatetimeField datetimeField1, Expr* expr); + + static Expr* makeCast(Expr* expr, ColumnType columnType); +}; + +// Zero initializes an Expr object and assigns it to a space in the heap +// For Hyrise we still had to put in the explicit NULL constructor +// http://www.ex-parrot.com/~chris/random/initialise.html +// Unused +#define ALLOC_EXPR(var, type) \ + Expr* var; \ + do { \ + Expr zero = {type}; \ + var = (Expr*)malloc(sizeof *var); \ + *var = zero; \ + } while (0); +#undef ALLOC_EXPR + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/ImportExportOptions.h b/extern/hyrise_sql_parser/src/sql/ImportExportOptions.h new file mode 100644 index 0000000000..cd0fa31ff2 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/ImportExportOptions.h @@ -0,0 +1,46 @@ +#ifndef SQLPARSER_IMPORT_EXPORT_OPTIONS_H +#define SQLPARSER_IMPORT_EXPORT_OPTIONS_H + +#include + +namespace hsql { + +// Name unchanged for compatibility. Historically, this was only used for import statements before we introduced export +// statements (`COPY ... TO`). We did not change the enum name to accomodate forks. In the grammar, however, we call the +// corresponding terminal symbol `file_type` and use it for both `ImportStatement` and `ExportStatement`. +enum ImportType { + kImportCSV, + kImportTbl, // Hyrise file format. + kImportBinary, + kImportAuto +}; + +enum CsvOptionType { + Delimiter, + Null, + Quote, +}; + +struct CsvOptions { + CsvOptions(); + ~CsvOptions(); + + char* delimiter; + char* null; + char* quote; + + bool accept_csv_option(std::pair* option); +}; + +struct ImportExportOptions { + ImportExportOptions(); + ~ImportExportOptions(); + + ImportType format; + char* encoding; + CsvOptions* csv_options; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/ImportStatement.h b/extern/hyrise_sql_parser/src/sql/ImportStatement.h new file mode 100644 index 0000000000..b3119decca --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/ImportStatement.h @@ -0,0 +1,25 @@ +#ifndef SQLPARSER_IMPORT_STATEMENT_H +#define SQLPARSER_IMPORT_STATEMENT_H + +#include "ImportExportOptions.h" +#include "SQLStatement.h" + +namespace hsql { + +// Represents SQL Import statements. +struct ImportStatement : SQLStatement { + ImportStatement(ImportType type); + ~ImportStatement() override; + + ImportType type; + char* filePath; + char* schema; + char* tableName; + Expr* whereClause; + char* encoding; + CsvOptions* csv_options; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/InsertStatement.h b/extern/hyrise_sql_parser/src/sql/InsertStatement.h new file mode 100644 index 0000000000..deb6fabf2b --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/InsertStatement.h @@ -0,0 +1,26 @@ +#ifndef SQLPARSER_INSERT_STATEMENT_H +#define SQLPARSER_INSERT_STATEMENT_H + +#include "SQLStatement.h" +#include "SelectStatement.h" + +namespace hsql { +enum InsertType { kInsertValues, kInsertSelect }; + +// Represents SQL Insert statements. +// Example: "INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3)" +struct InsertStatement : SQLStatement { + InsertStatement(InsertType type); + ~InsertStatement() override; + + InsertType type; + char* schema; + char* tableName; + std::vector* columns; + std::vector* values; + SelectStatement* select; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp b/extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp new file mode 100644 index 0000000000..ff662fb33c --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp @@ -0,0 +1,12 @@ + +#include "PrepareStatement.h" + +namespace hsql { +// PrepareStatement +PrepareStatement::PrepareStatement() : SQLStatement(kStmtPrepare), name(nullptr), query(nullptr) {} + +PrepareStatement::~PrepareStatement() { + free(name); + free(query); +} +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/PrepareStatement.h b/extern/hyrise_sql_parser/src/sql/PrepareStatement.h new file mode 100644 index 0000000000..24f388e98a --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/PrepareStatement.h @@ -0,0 +1,22 @@ +#ifndef SQLPARSER_PREPARE_STATEMENT_H +#define SQLPARSER_PREPARE_STATEMENT_H + +#include "SQLStatement.h" + +namespace hsql { + +// Represents SQL Prepare statements. +// Example: PREPARE test FROM 'SELECT * FROM test WHERE a = ?;' +struct PrepareStatement : SQLStatement { + PrepareStatement(); + ~PrepareStatement() override; + + char* name; + + // The query that is supposed to be prepared. + char* query; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/SQLStatement.cpp b/extern/hyrise_sql_parser/src/sql/SQLStatement.cpp new file mode 100644 index 0000000000..52ecbec4ab --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/SQLStatement.cpp @@ -0,0 +1,24 @@ + +#include "SQLStatement.h" + +namespace hsql { + +// SQLStatement +SQLStatement::SQLStatement(StatementType type) : hints(nullptr), type_(type) {} + +SQLStatement::~SQLStatement() { + if (hints) { + for (Expr* hint : *hints) { + delete hint; + } + } + delete hints; +} + +StatementType SQLStatement::type() const { return type_; } + +bool SQLStatement::isType(StatementType type) const { return (type_ == type); } + +bool SQLStatement::is(StatementType type) const { return isType(type); } + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/SQLStatement.h b/extern/hyrise_sql_parser/src/sql/SQLStatement.h new file mode 100644 index 0000000000..8c941ac1cd --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/SQLStatement.h @@ -0,0 +1,51 @@ +#ifndef SQLPARSER_SQLSTATEMENT_H +#define SQLPARSER_SQLSTATEMENT_H + +#include + +#include "Expr.h" + +namespace hsql { +enum StatementType { + kStmtError, // unused + kStmtSelect, + kStmtImport, + kStmtInsert, + kStmtUpdate, + kStmtDelete, + kStmtCreate, + kStmtDrop, + kStmtPrepare, + kStmtExecute, + kStmtExport, + kStmtRename, + kStmtAlter, + kStmtShow, + kStmtTransaction +}; + +// Base struct for every SQL statement +struct SQLStatement { + SQLStatement(StatementType type); + + virtual ~SQLStatement(); + + StatementType type() const; + + bool isType(StatementType type) const; + + // Shorthand for isType(type). + bool is(StatementType type) const; + + // Length of the string in the SQL query string + size_t stringLength; + + std::vector* hints; + + private: + StatementType type_; +}; + +} // namespace hsql + +#endif // SQLPARSER_SQLSTATEMENT_H diff --git a/extern/hyrise_sql_parser/src/sql/SelectStatement.h b/extern/hyrise_sql_parser/src/sql/SelectStatement.h new file mode 100644 index 0000000000..88c4669aa8 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/SelectStatement.h @@ -0,0 +1,116 @@ +#ifndef SQLPARSER_SELECT_STATEMENT_H +#define SQLPARSER_SELECT_STATEMENT_H + +#include "Expr.h" +#include "SQLStatement.h" +#include "Table.h" + +namespace hsql { +enum OrderType { kOrderAsc, kOrderDesc }; +enum NullOrdering { Undefined, First, Last }; + +enum SetType { kSetUnion, kSetIntersect, kSetExcept }; + +enum RowLockMode { ForUpdate, ForNoKeyUpdate, ForShare, ForKeyShare }; +enum RowLockWaitPolicy { NoWait, SkipLocked, None }; + +// Description of the order by clause within a select statement. +struct OrderDescription { + OrderDescription(OrderType type, Expr* expr, NullOrdering null_ordering); + virtual ~OrderDescription(); + + OrderType type; + Expr* expr; + NullOrdering null_ordering; +}; + +// Description of the limit clause within a select statement. +struct LimitDescription { + LimitDescription(Expr* limit, Expr* offset); + virtual ~LimitDescription(); + + Expr* limit; + Expr* offset; +}; + +// Description of the group-by clause within a select statement. +struct GroupByDescription { + GroupByDescription(); + virtual ~GroupByDescription(); + + std::vector* columns; + Expr* having; +}; + +struct WithDescription { + ~WithDescription(); + + char* alias; + SelectStatement* select; +}; + +struct SetOperation { + SetOperation(); + virtual ~SetOperation(); + + SetType setType; + bool isAll; + + SelectStatement* nestedSelectStatement; + std::vector* resultOrder; + LimitDescription* resultLimit; +}; + +struct LockingClause { + RowLockMode rowLockMode; + RowLockWaitPolicy rowLockWaitPolicy; + std::vector* tables; +}; + +// Representation of a full SQL select statement. +struct SelectStatement : SQLStatement { + SelectStatement(); + ~SelectStatement() override; + + TableRef* fromTable; + bool selectDistinct; + std::vector* selectList; + Expr* whereClause; + GroupByDescription* groupBy; + Expr* having; + + // Note that a SetOperation is always connected to a + // different SelectStatement. This statement can itself + // have SetOperation connections to other SelectStatements. + // To evaluate the operations in the correct order: + // Iterate over the setOperations vector: + // 1. Fully evaluate the nestedSelectStatement within the SetOperation + // 2. Connect the original statement with the + // evaluated nestedSelectStatement + // 3. Apply the resultOrder and the resultLimit + // 4. The result now functions as the the original statement + // for the next iteration + // + // Example: + // + // (SELECT * FROM students INTERSECT SELECT * FROM students_2) UNION SELECT * FROM students_3 ORDER BY grade ASC; + // + // 1. We evaluate `Select * FROM students` + // 2. Then we iterate over the setOperations vector + // 3. We evalute the nestedSelectStatement of the first entry, which is: `SELECT * FROM students_2` + // 4. We connect the result of 1. with the results of 3. using the setType, which is INTERSECT + // 5. We continue the iteration of the setOperations vector + // 6. We evaluate the new nestedSelectStatement which is: `SELECT * FROM students_3` + // 7. We apply a Union-Operation to connect the results of 4. and 6. + // 8. Finally, we apply the resultOrder of the last SetOperation (ORDER BY grade ASC) + std::vector* setOperations; + + std::vector* order; + std::vector* withDescriptions; + LimitDescription* limit; + std::vector* lockings; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/ShowStatement.h b/extern/hyrise_sql_parser/src/sql/ShowStatement.h new file mode 100644 index 0000000000..f67599f5b0 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/ShowStatement.h @@ -0,0 +1,23 @@ +#ifndef SQLPARSER_SHOW_STATEMENT_H +#define SQLPARSER_SHOW_STATEMENT_H + +#include "SQLStatement.h" + +// Note: Implementations of constructors and destructors can be found in statements.cpp. +namespace hsql { + +enum ShowType { kShowColumns, kShowTables }; + +// Represents SQL SHOW statements. +// Example "SHOW TABLES;" +struct ShowStatement : SQLStatement { + ShowStatement(ShowType type); + ~ShowStatement() override; + + ShowType type; + char* schema; + char* name; +}; + +} // namespace hsql +#endif diff --git a/extern/hyrise_sql_parser/src/sql/Table.h b/extern/hyrise_sql_parser/src/sql/Table.h new file mode 100644 index 0000000000..de49d89db1 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/Table.h @@ -0,0 +1,70 @@ +#ifndef SQLPARSER_TABLEREF_H +#define SQLPARSER_TABLEREF_H + +#include +#include +#include "Expr.h" + +namespace hsql { + +struct SelectStatement; +struct JoinDefinition; +struct TableRef; + +// Possible table reference types. +enum TableRefType { kTableName, kTableSelect, kTableJoin, kTableCrossProduct }; + +struct TableName { + char* schema; + char* name; +}; + +struct Alias { + Alias(char* name, std::vector* columns = nullptr); + ~Alias(); + + char* name; + std::vector* columns; +}; + +// Holds reference to tables. Can be either table names or a select statement. +struct TableRef { + TableRef(TableRefType type); + virtual ~TableRef(); + + TableRefType type; + + char* schema; + char* name; + Alias* alias; + + SelectStatement* select; + std::vector* list; + JoinDefinition* join; + + // Returns true if a schema is set. + bool hasSchema() const; + + // Returns the alias, if it is set. Otherwise the name. + const char* getName() const; +}; + +// Possible types of joins. +enum JoinType { kJoinInner, kJoinFull, kJoinLeft, kJoinRight, kJoinCross, kJoinNatural }; + +// Definition of a join construct. +struct JoinDefinition { + JoinDefinition(); + virtual ~JoinDefinition(); + + TableRef* left; + TableRef* right; + Expr* condition; + std::vector* namedColumns; + + JoinType type; + bool natural; +}; + +} // namespace hsql +#endif diff --git a/extern/hyrise_sql_parser/src/sql/TransactionStatement.h b/extern/hyrise_sql_parser/src/sql/TransactionStatement.h new file mode 100644 index 0000000000..174b990e57 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/TransactionStatement.h @@ -0,0 +1,21 @@ +#ifndef HYRISE_TRANSACTIONSTATEMENT_H +#define HYRISE_TRANSACTIONSTATEMENT_H + +#include "SQLStatement.h" + +namespace hsql { + +// Represents SQL Transaction statements. +// Example: BEGIN TRANSACTION; +enum TransactionCommand { kBeginTransaction, kCommitTransaction, kRollbackTransaction }; + +struct TransactionStatement : SQLStatement { + TransactionStatement(TransactionCommand command); + ~TransactionStatement() override; + + TransactionCommand command; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/UpdateStatement.h b/extern/hyrise_sql_parser/src/sql/UpdateStatement.h new file mode 100644 index 0000000000..6ea9d14f39 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/UpdateStatement.h @@ -0,0 +1,27 @@ +#ifndef SQLPARSER_UPDATE_STATEMENT_H +#define SQLPARSER_UPDATE_STATEMENT_H + +#include "SQLStatement.h" + +namespace hsql { + +// Represents "column = value" expressions. +struct UpdateClause { + char* column; + Expr* value; +}; + +// Represents SQL Update statements. +struct UpdateStatement : SQLStatement { + UpdateStatement(); + ~UpdateStatement() override; + + // TODO: switch to char* instead of TableRef + TableRef* table; + std::vector* updates; + Expr* where; +}; + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/src/sql/statements.cpp b/extern/hyrise_sql_parser/src/sql/statements.cpp new file mode 100644 index 0000000000..53c7337dfd --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/statements.cpp @@ -0,0 +1,442 @@ +#include "statements.h" + +#include + +#include "AlterStatement.h" +#include "ImportExportOptions.h" + +namespace hsql { + +ColumnType::ColumnType(DataType data_type, int64_t length, int64_t precision, int64_t scale) + : data_type(data_type), length(length), precision(precision), scale(scale) {} + +bool operator==(const ColumnType& lhs, const ColumnType& rhs) { + if (lhs.data_type != rhs.data_type) { + return false; + } + return lhs.length == rhs.length && lhs.precision == rhs.precision && lhs.scale == rhs.scale; +} + +bool operator!=(const ColumnType& lhs, const ColumnType& rhs) { return !(lhs == rhs); } + +std::ostream& operator<<(std::ostream& stream, const ColumnType& column_type) { + switch (column_type.data_type) { + case DataType::UNKNOWN: + stream << "UNKNOWN"; + break; + case DataType::INT: + stream << "INT"; + break; + case DataType::BIGINT: + stream << "BIGINT"; + break; + case DataType::LONG: + stream << "LONG"; + break; + case DataType::FLOAT: + stream << "FLOAT"; + break; + case DataType::DOUBLE: + stream << "DOUBLE"; + break; + case DataType::REAL: + stream << "REAL"; + break; + case DataType::CHAR: + stream << "CHAR(" << column_type.length << ")"; + break; + case DataType::VARCHAR: + stream << "VARCHAR(" << column_type.length << ")"; + break; + case DataType::DECIMAL: + stream << "DECIMAL"; + break; + case DataType::TEXT: + stream << "TEXT"; + break; + case DataType::DATETIME: + stream << "DATETIME"; + break; + case DataType::DATE: + stream << "DATE"; + break; + case DataType::TIME: + stream << "TIME"; + break; + case DataType::SMALLINT: + stream << "SMALLINT"; + break; + case DataType::BOOLEAN: + stream << "BOOLEAN"; + break; + } + return stream; +} + +// DeleteStatement +DeleteStatement::DeleteStatement() : SQLStatement(kStmtDelete), schema(nullptr), tableName(nullptr), expr(nullptr) {} + +DeleteStatement::~DeleteStatement() { + free(schema); + free(tableName); + delete expr; +} + +// DropStatement +DropStatement::DropStatement(DropType type) + : SQLStatement(kStmtDrop), type(type), schema(nullptr), name(nullptr), indexName(nullptr) {} + +DropStatement::~DropStatement() { + free(schema); + free(name); + free(indexName); +} + +// AlterStatement and supportive classes + +AlterAction::AlterAction(ActionType type) : type(type) {} + +AlterAction::~AlterAction() = default; + +DropColumnAction::DropColumnAction(char* column_name) + : AlterAction(ActionType::DropColumn), columnName(column_name), ifExists(false) {} + +DropColumnAction::~DropColumnAction() { free(columnName); } + +AlterStatement::AlterStatement(char* name, AlterAction* action) + : SQLStatement(kStmtAlter), schema(nullptr), ifTableExists(false), name(name), action(action) {} + +AlterStatement::~AlterStatement() { + free(schema); + free(name); + delete action; +} + +// TransactionStatement +TransactionStatement::TransactionStatement(TransactionCommand command) + : SQLStatement(kStmtTransaction), command(command) {} + +TransactionStatement::~TransactionStatement() {} + +// ExecuteStatement +ExecuteStatement::ExecuteStatement() : SQLStatement(kStmtExecute), name(nullptr), parameters(nullptr) {} + +ExecuteStatement::~ExecuteStatement() { + free(name); + + if (parameters) { + for (Expr* param : *parameters) { + delete param; + } + delete parameters; + } +} + +// ExportStatement +ExportStatement::ExportStatement(ImportType type) + : SQLStatement(kStmtExport), + type(type), + filePath(nullptr), + schema(nullptr), + tableName(nullptr), + select(nullptr), + encoding(nullptr), + csv_options(nullptr) {} + +ExportStatement::~ExportStatement() { + free(filePath); + free(schema); + free(tableName); + delete select; + free(encoding); + delete csv_options; +} + +CsvOptions::CsvOptions() : delimiter(nullptr), null(nullptr), quote(nullptr) {} +CsvOptions::~CsvOptions() { + free(delimiter); + free(null); + free(quote); +} + +bool CsvOptions::accept_csv_option(std::pair* option) { + switch (option->first) { + case CsvOptionType::Delimiter: + if (delimiter != nullptr) { + return false; + } + delimiter = option->second; + break; + case CsvOptionType::Null: + if (null != nullptr) { + return false; + } + null = option->second; + break; + case CsvOptionType::Quote: + if (quote != nullptr) { + return false; + } + quote = option->second; + break; + } + + return true; +} + +ImportExportOptions::ImportExportOptions() : format(kImportAuto), encoding(nullptr), csv_options(nullptr) {} + +ImportExportOptions::~ImportExportOptions() { + free(encoding); + delete csv_options; +} + +// ImportStatement +ImportStatement::ImportStatement(ImportType type) + : SQLStatement(kStmtImport), + type(type), + filePath(nullptr), + schema(nullptr), + tableName(nullptr), + whereClause(nullptr), + encoding(nullptr), + csv_options(nullptr) {} + +ImportStatement::~ImportStatement() { + free(filePath); + free(schema); + free(tableName); + delete whereClause; + free(encoding); + delete csv_options; +} + +// InsertStatement +InsertStatement::InsertStatement(InsertType type) + : SQLStatement(kStmtInsert), + type(type), + schema(nullptr), + tableName(nullptr), + columns(nullptr), + values(nullptr), + select(nullptr) {} + +InsertStatement::~InsertStatement() { + free(schema); + free(tableName); + delete select; + + if (columns) { + for (char* column : *columns) { + free(column); + } + delete columns; + } + + if (values) { + for (Expr* expr : *values) { + delete expr; + } + delete values; + } +} + +// ShowStatament +ShowStatement::ShowStatement(ShowType type) : SQLStatement(kStmtShow), type(type), schema(nullptr), name(nullptr) {} + +ShowStatement::~ShowStatement() { + free(schema); + free(name); +} + +// SelectStatement.h + +// OrderDescription +OrderDescription::OrderDescription(OrderType type, Expr* expr, NullOrdering null_ordering) + : type(type), expr(expr), null_ordering(null_ordering) {} + +OrderDescription::~OrderDescription() { delete expr; } + +// LimitDescription +LimitDescription::LimitDescription(Expr* limit, Expr* offset) : limit(limit), offset(offset) {} + +LimitDescription::~LimitDescription() { + delete limit; + delete offset; +} + +// GroypByDescription +GroupByDescription::GroupByDescription() : columns(nullptr), having(nullptr) {} + +GroupByDescription::~GroupByDescription() { + delete having; + + if (columns) { + for (Expr* expr : *columns) { + delete expr; + } + delete columns; + } +} + +WithDescription::~WithDescription() { + free(alias); + delete select; +} + +// SelectStatement +SelectStatement::SelectStatement() + : SQLStatement(kStmtSelect), + fromTable(nullptr), + selectDistinct(false), + selectList(nullptr), + whereClause(nullptr), + groupBy(nullptr), + having(nullptr), + setOperations(nullptr), + order(nullptr), + withDescriptions(nullptr), + limit(nullptr), + lockings(nullptr) {} + +SelectStatement::~SelectStatement() { + delete fromTable; + delete whereClause; + delete groupBy; + delete having; + delete limit; + + // Delete each element in the select list. + if (selectList) { + for (Expr* expr : *selectList) { + delete expr; + } + delete selectList; + } + + if (order) { + for (OrderDescription* desc : *order) { + delete desc; + } + delete order; + } + + if (withDescriptions) { + for (WithDescription* desc : *withDescriptions) { + delete desc; + } + delete withDescriptions; + } + + if (setOperations) { + for (SetOperation* setOperation : *setOperations) { + delete setOperation; + } + delete setOperations; + } + + if (lockings) { + for (LockingClause* lockingClause : *lockings) { + if (lockingClause->tables) { + for (char* dtable : *lockingClause->tables) { + free(dtable); + } + delete lockingClause->tables; + } + delete lockingClause; + } + delete lockings; + } +} + +// UpdateStatement +UpdateStatement::UpdateStatement() : SQLStatement(kStmtUpdate), table(nullptr), updates(nullptr), where(nullptr) {} + +UpdateStatement::~UpdateStatement() { + delete table; + delete where; + + if (updates) { + for (UpdateClause* update : *updates) { + free(update->column); + delete update->value; + delete update; + } + delete updates; + } +} + +// Alias +Alias::Alias(char* name, std::vector* columns) : name(name), columns(columns) {} + +Alias::~Alias() { + free(name); + if (columns) { + for (char* column : *columns) { + free(column); + } + delete columns; + } +} + +// TableRef +TableRef::TableRef(TableRefType type) + : type(type), schema(nullptr), name(nullptr), alias(nullptr), select(nullptr), list(nullptr), join(nullptr) {} + +TableRef::~TableRef() { + free(schema); + free(name); + + delete select; + delete join; + delete alias; + + if (list) { + for (TableRef* table : *list) { + delete table; + } + delete list; + } +} + +bool TableRef::hasSchema() const { return schema != nullptr; } + +const char* TableRef::getName() const { + if (alias) + return alias->name; + else + return name; +} + +// JoinDefinition +JoinDefinition::JoinDefinition() + : left(nullptr), right(nullptr), condition(nullptr), namedColumns(nullptr), type(kJoinInner), natural(false) {} + +JoinDefinition::~JoinDefinition() { + delete left; + delete right; + delete condition; + + if (namedColumns) { + for (auto* column : *namedColumns) { + free(column); + } + delete namedColumns; + } +} + +SetOperation::SetOperation() : nestedSelectStatement(nullptr), resultOrder(nullptr), resultLimit(nullptr) {} + +SetOperation::~SetOperation() { + delete nestedSelectStatement; + delete resultLimit; + + if (resultOrder) { + for (OrderDescription* desc : *resultOrder) { + delete desc; + } + delete resultOrder; + } +} + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/statements.h b/extern/hyrise_sql_parser/src/sql/statements.h new file mode 100644 index 0000000000..c9ee00ce40 --- /dev/null +++ b/extern/hyrise_sql_parser/src/sql/statements.h @@ -0,0 +1,18 @@ +#ifndef SQLPARSER_STATEMENTS_H +#define SQLPARSER_STATEMENTS_H + +#include "AlterStatement.h" +#include "CreateStatement.h" +#include "DeleteStatement.h" +#include "DropStatement.h" +#include "ExecuteStatement.h" +#include "ExportStatement.h" +#include "ImportStatement.h" +#include "InsertStatement.h" +#include "PrepareStatement.h" +#include "SelectStatement.h" +#include "ShowStatement.h" +#include "TransactionStatement.h" +#include "UpdateStatement.h" + +#endif // SQLPARSER_STATEMENTS_H diff --git a/extern/hyrise_sql_parser/src/util/sqlhelper.cpp b/extern/hyrise_sql_parser/src/util/sqlhelper.cpp new file mode 100644 index 0000000000..563538ba09 --- /dev/null +++ b/extern/hyrise_sql_parser/src/util/sqlhelper.cpp @@ -0,0 +1,509 @@ +#include "sqlhelper.h" + +#include +#include +#include +#include +#include + +namespace hsql { + +void printOperatorExpression(Expr* expr, uintmax_t num_indent); +void printAlias(Alias* alias, uintmax_t num_indent); + +std::ostream& operator<<(std::ostream& os, const OperatorType& op); +std::ostream& operator<<(std::ostream& os, const DatetimeField& datetime); +std::ostream& operator<<(std::ostream& os, const FrameBound& frame_bound); + +std::string indent(uintmax_t num_indent) { return std::string(num_indent, '\t'); } +void inprint(int64_t val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << " " << std::endl; } +void inprint(double val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << std::endl; } +void inprint(const char* val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << std::endl; } +void inprint(const char* val, const char* val2, uintmax_t num_indent) { + std::cout << indent(num_indent).c_str() << val << "->" << val2 << std::endl; +} +void inprintC(char val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << std::endl; } +void inprint(const OperatorType& op, uintmax_t num_indent) { std::cout << indent(num_indent) << op << std::endl; } +void inprint(const ColumnType& colType, uintmax_t num_indent) { + std::cout << indent(num_indent) << colType << std::endl; +} +void inprint(const DatetimeField& colType, uintmax_t num_indent) { + std::cout << indent(num_indent) << colType << std::endl; +} + +void printTableRefInfo(TableRef* table, uintmax_t num_indent) { + switch (table->type) { + case kTableName: + inprint(table->name, num_indent); + if (table->schema) { + inprint("Schema", num_indent + 1); + inprint(table->schema, num_indent + 2); + } + break; + case kTableSelect: + printSelectStatementInfo(table->select, num_indent); + break; + case kTableJoin: + inprint("Join Table", num_indent); + inprint("Left", num_indent + 1); + printTableRefInfo(table->join->left, num_indent + 2); + inprint("Right", num_indent + 1); + printTableRefInfo(table->join->right, num_indent + 2); + inprint("Join Condition", num_indent + 1); + printExpression(table->join->condition, num_indent + 2); + break; + case kTableCrossProduct: + for (TableRef* tbl : *table->list) printTableRefInfo(tbl, num_indent); + break; + } + + if (table->alias) { + printAlias(table->alias, num_indent); + } +} + +void printAlias(Alias* alias, uintmax_t num_indent) { + inprint("Alias", num_indent + 1); + inprint(alias->name, num_indent + 2); + + if (alias->columns) { + for (char* column : *(alias->columns)) { + inprint(column, num_indent + 3); + } + } +} + +void printOperatorExpression(Expr* expr, uintmax_t num_indent) { + if (expr == nullptr) { + inprint("null", num_indent); + return; + } + + inprint(expr->opType, num_indent); + + printExpression(expr->expr, num_indent + 1); + if (expr->expr2) { + printExpression(expr->expr2, num_indent + 1); + } else if (expr->exprList) { + for (Expr* e : *expr->exprList) printExpression(e, num_indent + 1); + } +} + +void printExpression(Expr* expr, uintmax_t num_indent) { + if (!expr) return; + switch (expr->type) { + case kExprStar: + inprint("*", num_indent); + break; + case kExprColumnRef: + inprint(expr->name, num_indent); + if (expr->table) { + inprint("Table:", num_indent + 1); + inprint(expr->table, num_indent + 2); + } + break; + // case kExprTableColumnRef: inprint(expr->table, expr->name, num_indent); break; + case kExprLiteralFloat: + inprint(expr->fval, num_indent); + break; + case kExprLiteralInt: + inprint(expr->ival, num_indent); + break; + case kExprLiteralIntString: + inprint(expr->name, num_indent); + break; + case kExprLiteralString: + inprint(expr->name, num_indent); + break; + case kExprLiteralDate: + inprint(expr->name, num_indent); + break; + case kExprLiteralNull: + inprint("NULL", num_indent); + break; + case kExprLiteralInterval: + inprint("INTERVAL", num_indent); + inprint(expr->ival, num_indent + 1); + inprint(expr->datetimeField, num_indent + 1); + break; + case kExprFunctionRef: + inprint(expr->name, num_indent); + for (Expr* e : *expr->exprList) { + printExpression(e, num_indent + 1); + } + + if (expr->windowDescription) { + printWindowDescription(expr->windowDescription, num_indent + 1); + } + break; + case kExprExtract: + inprint("EXTRACT", num_indent); + inprint(expr->datetimeField, num_indent + 1); + printExpression(expr->expr, num_indent + 1); + break; + case kExprCast: + inprint("CAST", num_indent); + inprint(expr->columnType, num_indent + 1); + printExpression(expr->expr, num_indent + 1); + break; + case kExprOperator: + printOperatorExpression(expr, num_indent); + break; + case kExprSelect: + printSelectStatementInfo(expr->select, num_indent); + break; + case kExprParameter: + inprint(expr->ival, num_indent); + break; + case kExprArray: + for (Expr* e : *expr->exprList) { + printExpression(e, num_indent + 1); + } + break; + case kExprArrayIndex: + printExpression(expr->expr, num_indent + 1); + inprint(expr->ival, num_indent); + break; + default: + std::cerr << "Unrecognized expression type " << expr->type << std::endl; + return; + } + if (expr->alias) { + inprint("Alias", num_indent + 1); + inprint(expr->alias, num_indent + 2); + } +} + +void printOrderBy(const std::vector* expr, uintmax_t num_indent) { + if (!expr) return; + for (const auto& order_description : *expr) { + printExpression(order_description->expr, num_indent); + if (order_description->type == kOrderAsc) { + inprint("ascending", num_indent); + } else { + inprint("descending", num_indent); + } + } +} + +void printWindowDescription(WindowDescription* window_description, uintmax_t num_indent) { + inprint("OVER", num_indent); + if (window_description->partitionList) { + inprint("PARTITION BY", num_indent + 1); + for (const auto e : *window_description->partitionList) { + printExpression(e, num_indent + 2); + } + } + + if (window_description->orderList) { + inprint("ORDER BY", num_indent + 1); + printOrderBy(window_description->orderList, num_indent + 2); + } + + std::stringstream stream; + switch (window_description->frameDescription->type) { + case kRows: + stream << "ROWS"; + break; + case kRange: + stream << "RANGE"; + break; + case kGroups: + stream << "GROUPS"; + break; + } + stream << " BETWEEN " << *window_description->frameDescription->start << " AND " + << *window_description->frameDescription->end; + inprint(stream.str().c_str(), num_indent + 1); +} + +void printSelectStatementInfo(const SelectStatement* stmt, uintmax_t num_indent) { + inprint("SelectStatement", num_indent); + inprint("Fields:", num_indent + 1); + for (Expr* expr : *stmt->selectList) printExpression(expr, num_indent + 2); + + if (stmt->fromTable) { + inprint("Sources:", num_indent + 1); + printTableRefInfo(stmt->fromTable, num_indent + 2); + } + + if (stmt->whereClause) { + inprint("Search Conditions:", num_indent + 1); + printExpression(stmt->whereClause, num_indent + 2); + } + + if (stmt->groupBy) { + inprint("GroupBy:", num_indent + 1); + for (Expr* expr : *stmt->groupBy->columns) printExpression(expr, num_indent + 2); + if (stmt->groupBy->having) { + inprint("Having:", num_indent + 1); + printExpression(stmt->groupBy->having, num_indent + 2); + } + } + if (!stmt->groupBy && stmt->having) { + inprint("Having:", num_indent + 1); + printExpression(stmt->having, num_indent + 2); + } + if (stmt->lockings) { + inprint("Lock Info:", num_indent + 1); + for (LockingClause* lockingClause : *stmt->lockings) { + inprint("Type", num_indent + 2); + if (lockingClause->rowLockMode == RowLockMode::ForUpdate) { + inprint("FOR UPDATE", num_indent + 3); + } else if (lockingClause->rowLockMode == RowLockMode::ForNoKeyUpdate) { + inprint("FOR NO KEY UPDATE", num_indent + 3); + } else if (lockingClause->rowLockMode == RowLockMode::ForShare) { + inprint("FOR SHARE", num_indent + 3); + } else if (lockingClause->rowLockMode == RowLockMode::ForKeyShare) { + inprint("FOR KEY SHARE", num_indent + 3); + } + if (lockingClause->tables) { + inprint("Target tables:", num_indent + 2); + for (char* dtable : *lockingClause->tables) { + inprint(dtable, num_indent + 3); + } + } + if (lockingClause->rowLockWaitPolicy != RowLockWaitPolicy::None) { + inprint("Waiting policy: ", num_indent + 2); + if (lockingClause->rowLockWaitPolicy == RowLockWaitPolicy::NoWait) + inprint("NOWAIT", num_indent + 3); + else + inprint("SKIP LOCKED", num_indent + 3); + } + } + } + + if (stmt->setOperations) { + for (SetOperation* setOperation : *stmt->setOperations) { + switch (setOperation->setType) { + case SetType::kSetIntersect: + inprint("Intersect:", num_indent + 1); + break; + case SetType::kSetUnion: + inprint("Union:", num_indent + 1); + break; + case SetType::kSetExcept: + inprint("Except:", num_indent + 1); + break; + } + + printSelectStatementInfo(setOperation->nestedSelectStatement, num_indent + 2); + + if (setOperation->resultOrder) { + inprint("SetResultOrderBy:", num_indent + 1); + printOrderBy(setOperation->resultOrder, num_indent + 2); + } + + if (setOperation->resultLimit) { + if (setOperation->resultLimit->limit) { + inprint("SetResultLimit:", num_indent + 1); + printExpression(setOperation->resultLimit->limit, num_indent + 2); + } + + if (setOperation->resultLimit->offset) { + inprint("SetResultOffset:", num_indent + 1); + printExpression(setOperation->resultLimit->offset, num_indent + 2); + } + } + } + } + + if (stmt->order) { + inprint("OrderBy:", num_indent + 1); + printOrderBy(stmt->order, num_indent + 2); + } + + if (stmt->limit && stmt->limit->limit) { + inprint("Limit:", num_indent + 1); + printExpression(stmt->limit->limit, num_indent + 2); + } + + if (stmt->limit && stmt->limit->offset) { + inprint("Offset:", num_indent + 1); + printExpression(stmt->limit->offset, num_indent + 2); + } +} + +void printImportStatementInfo(const ImportStatement* stmt, uintmax_t num_indent) { + inprint("ImportStatement", num_indent); + inprint(stmt->filePath, num_indent + 1); + switch (stmt->type) { + case ImportType::kImportCSV: + inprint("CSV", num_indent + 1); + break; + case ImportType::kImportTbl: + inprint("TBL", num_indent + 1); + break; + case ImportType::kImportBinary: + inprint("BINARY", num_indent + 1); + break; + case ImportType::kImportAuto: + inprint("AUTO", num_indent + 1); + break; + } + inprint(stmt->tableName, num_indent + 1); + if (stmt->whereClause) { + inprint("WHERE:", num_indent + 1); + printExpression(stmt->whereClause, num_indent + 2); + } +} + +void printExportStatementInfo(const ExportStatement* stmt, uintmax_t num_indent) { + inprint("ExportStatement", num_indent); + inprint(stmt->filePath, num_indent + 1); + switch (stmt->type) { + case ImportType::kImportCSV: + inprint("CSV", num_indent + 1); + break; + case ImportType::kImportTbl: + inprint("TBL", num_indent + 1); + break; + case ImportType::kImportBinary: + inprint("BINARY", num_indent + 1); + break; + case ImportType::kImportAuto: + inprint("AUTO", num_indent + 1); + break; + } + + if (stmt->tableName) { + inprint(stmt->tableName, num_indent + 1); + } else { + printSelectStatementInfo(stmt->select, num_indent + 1); + } +} + +void printCreateStatementInfo(const CreateStatement* stmt, uintmax_t num_indent) { + inprint("CreateStatement", num_indent); + inprint(stmt->tableName, num_indent + 1); + if (stmt->filePath) inprint(stmt->filePath, num_indent + 1); +} + +void printInsertStatementInfo(const InsertStatement* stmt, uintmax_t num_indent) { + inprint("InsertStatement", num_indent); + inprint(stmt->tableName, num_indent + 1); + if (stmt->columns) { + inprint("Columns", num_indent + 1); + for (char* col_name : *stmt->columns) { + inprint(col_name, num_indent + 2); + } + } + switch (stmt->type) { + case kInsertValues: + inprint("Values", num_indent + 1); + for (Expr* expr : *stmt->values) { + printExpression(expr, num_indent + 2); + } + break; + case kInsertSelect: + printSelectStatementInfo(stmt->select, num_indent + 1); + break; + } +} + +void printTransactionStatementInfo(const TransactionStatement* stmt, uintmax_t num_indent) { + inprint("TransactionStatement", num_indent); + switch (stmt->command) { + case kBeginTransaction: + inprint("BEGIN", num_indent + 1); + break; + case kCommitTransaction: + inprint("COMMIT", num_indent + 1); + break; + case kRollbackTransaction: + inprint("ROLLBACK", num_indent + 1); + break; + } +} + +void printStatementInfo(const SQLStatement* stmt) { + switch (stmt->type()) { + case kStmtSelect: + printSelectStatementInfo((const SelectStatement*)stmt, 0); + break; + case kStmtInsert: + printInsertStatementInfo((const InsertStatement*)stmt, 0); + break; + case kStmtCreate: + printCreateStatementInfo((const CreateStatement*)stmt, 0); + break; + case kStmtImport: + printImportStatementInfo((const ImportStatement*)stmt, 0); + break; + case kStmtExport: + printExportStatementInfo((const ExportStatement*)stmt, 0); + break; + case kStmtTransaction: + printTransactionStatementInfo((const TransactionStatement*)stmt, 0); + break; + default: + break; + } +} + +std::ostream& operator<<(std::ostream& os, const OperatorType& op) { + static const std::map operatorToToken = { + {kOpNone, "None"}, {kOpBetween, "BETWEEN"}, + {kOpCase, "CASE"}, {kOpCaseListElement, "CASE LIST ELEMENT"}, + {kOpPlus, "+"}, {kOpMinus, "-"}, + {kOpAsterisk, "*"}, {kOpSlash, "/"}, + {kOpPercentage, "%"}, {kOpCaret, "^"}, + {kOpMod, "MOD"}, {kOpDiv, "DIV"}, + {kOpBitAnd, "&"}, {kOpBitOr, "|"}, + {kOpBitXor, "^"}, {kOpBitShiftLeft, "<<"}, + {kOpBitShiftRight, ">>"}, + {kOpEquals, "="}, {kOpNotEquals, "!="}, + {kOpLess, "<"}, {kOpLessEq, "<="}, + {kOpGreater, ">"}, {kOpGreaterEq, ">="}, + {kOpLike, "LIKE"}, {kOpNotLike, "NOT LIKE"}, + {kOpILike, "ILIKE"}, {kOpAnd, "AND"}, + {kOpOr, "OR"}, {kOpIn, "IN"}, + {kOpConcat, "CONCAT"}, {kOpNot, "NOT"}, + {kOpUnaryMinus, "-"}, {kOpIsNull, "IS NULL"}, + {kOpExists, "EXISTS"}}; + + const auto found = operatorToToken.find(op); + if (found == operatorToToken.cend()) { + return os << static_cast(op); + } else { + return os << (*found).second; + } +} + +std::ostream& operator<<(std::ostream& os, const DatetimeField& datetime) { + static const std::map operatorToToken = { + {kDatetimeNone, "None"}, {kDatetimeSecond, "SECOND"}, {kDatetimeMinute, "MINUTE"}, {kDatetimeHour, "HOUR"}, + {kDatetimeDay, "DAY"}, {kDatetimeMonth, "MONTH"}, {kDatetimeYear, "YEAR"}}; + + const auto found = operatorToToken.find(datetime); + if (found == operatorToToken.cend()) { + return os << static_cast(datetime); + } else { + return os << (*found).second; + } +} + +std::ostream& operator<<(std::ostream& os, const FrameBound& frame_bound) { + if (frame_bound.type == kCurrentRow) { + os << "CURRENT ROW"; + return os; + } + + if (frame_bound.unbounded) { + os << "UNBOUNDED"; + } else { + os << frame_bound.offset; + } + + os << " "; + + if (frame_bound.type == kPreceding) { + os << "PRECEDING"; + } else { + os << "FOLLOWING"; + } + + return os; +} + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/util/sqlhelper.h b/extern/hyrise_sql_parser/src/util/sqlhelper.h new file mode 100644 index 0000000000..f48f43dbc1 --- /dev/null +++ b/extern/hyrise_sql_parser/src/util/sqlhelper.h @@ -0,0 +1,40 @@ +#ifndef SQLPARSER_SQLHELPER_H +#define SQLPARSER_SQLHELPER_H + +#include "../sql/statements.h" + +namespace hsql { + +// Prints a summary of the given SQLStatement. +void printStatementInfo(const SQLStatement* stmt); + +// Prints a summary of the given SelectStatement with the given indentation. +void printSelectStatementInfo(const SelectStatement* stmt, uintmax_t num_indent); + +// Prints a summary of the given ImportStatement with the given indentation. +void printImportStatementInfo(const ImportStatement* stmt, uintmax_t num_indent); + +// Prints a summary of the given CopyStatement with the given indentation. +void printExportStatementInfo(const ExportStatement* stmt, uintmax_t num_indent); + +// Prints a summary of the given InsertStatement with the given indentation. +void printInsertStatementInfo(const InsertStatement* stmt, uintmax_t num_indent); + +// Prints a summary of the given CreateStatement with the given indentation. +void printCreateStatementInfo(const CreateStatement* stmt, uintmax_t num_indent); + +// Prints a summary of the given TransactionStatement with the given indentation. +void printTransactionStatementInfo(const TransactionStatement* stmt, uintmax_t num_indent); + +// Prints a summary of the given Expression with the given indentation. +void printExpression(Expr* expr, uintmax_t num_indent); + +// Prints an ORDER BY clause +void printOrderBy(const std::vector* expr, uintmax_t num_indent); + +// Prints WindowDescription. +void printWindowDescription(WindowDescription* window_description, uintmax_t num_indent); + +} // namespace hsql + +#endif diff --git a/extern/hyrise_sql_parser/test/auto_query_file_test.cpp b/extern/hyrise_sql_parser/test/auto_query_file_test.cpp new file mode 100644 index 0000000000..627b0399ff --- /dev/null +++ b/extern/hyrise_sql_parser/test/auto_query_file_test.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include + +#include "SQLParser.h" +#include "thirdparty/microtest/microtest.h" + +// Read all lines from the given file path. Skips comment lines. +std::vector readlines(std::string path); + +// Read the queries from all files that were supplied to the test +// through the -f argument. For all queries it is checked whether they +// can be parsed successfully. +TEST(AutoQueryFileTest) { + const std::vector& args = mt::Runtime::args(); + + std::vector query_files; + + // Parse command line arguments to retrieve query files. + uint i = 1; + for (; i < args.size(); ++i) { + if (args[i] == "-f") { + query_files.push_back(args[++i]); + } + } + + // Read list of queries from all input files. + std::vector lines; + for (std::string path : query_files) { + std::vector tmp = readlines(path); + lines.insert(lines.end(), tmp.begin(), tmp.end()); + } + + // Execute queries. + size_t num_executed = 0; + size_t num_failed = 0; + for (std::string line : lines) { + bool expected_result = true; + std::string query = line; + + // If a line starts with '!' parsing is expected to fail. + if (query.at(0) == '!') { + expected_result = false; + query = query.substr(1); + } + + // Measuring the parsing time. + std::chrono::time_point start, end; + start = std::chrono::system_clock::now(); + + // Parse the query. + hsql::SQLParserResult result; + hsql::SQLParser::parse(query, &result); + + end = std::chrono::system_clock::now(); + std::chrono::duration elapsed_seconds = end - start; + double us = elapsed_seconds.count() * 1000 * 1000; + + if (expected_result == result.isValid()) { + printf("\033[0;32m{ ok} (%.1fus)\033[0m %s\n", us, line.c_str()); + } else { + printf("\033[0;31m{ failed}\033[0m\n"); + printf("\t\033[0;31m%s (L%d:%d)\n\033[0m", result.errorMsg(), result.errorLine(), result.errorColumn()); + printf("\t%s\n", line.c_str()); + ++num_failed; + } + ++num_executed; + } + + if (num_failed == 0) { + printf("\033[0;32m{ ok} \033[0mAll %lu grammar tests completed successfully!\n", num_executed); + } else { + fprintf(stderr, "\033[0;31m{ failed} \033[0mSome grammar tests failed! %lu out of %lu tests failed!\n", num_failed, + num_executed); + } + ASSERT_EQ(num_failed, 0); +} + +std::vector readlines(std::string path) { + std::ifstream infile(path); + std::vector lines; + std::string line; + while (std::getline(infile, line)) { + std::istringstream iss(line); + + // Skip comments. + if (line[0] == '#' || (line[0] == '-' && line[1] == '-')) { + continue; + } + + lines.push_back(line); + } + return lines; +} diff --git a/extern/hyrise_sql_parser/test/prepare_tests.cpp b/extern/hyrise_sql_parser/test/prepare_tests.cpp new file mode 100644 index 0000000000..1c067b0810 --- /dev/null +++ b/extern/hyrise_sql_parser/test/prepare_tests.cpp @@ -0,0 +1,84 @@ + +#include "SQLParser.h" +#include "sql_asserts.h" +#include "thirdparty/microtest/microtest.h" + +using hsql::kExprLiteralInt; +using hsql::kExprParameter; + +using hsql::kStmtDrop; +using hsql::kStmtExecute; +using hsql::kStmtInsert; +using hsql::kStmtPrepare; +using hsql::kStmtSelect; + +using hsql::kDropPreparedStatement; + +using hsql::DropStatement; +using hsql::ExecuteStatement; +using hsql::InsertStatement; +using hsql::PrepareStatement; +using hsql::SelectStatement; + +TEST(PrepareSingleStatementTest) { + TEST_PARSE_SINGLE_SQL("PREPARE test FROM 'SELECT * FROM students WHERE grade = ?';", kStmtPrepare, PrepareStatement, + result, prepare); + + ASSERT_STREQ(prepare->name, "test"); + ASSERT_STREQ(prepare->query, "SELECT * FROM students WHERE grade = ?"); + + TEST_PARSE_SINGLE_SQL(prepare->query, kStmtSelect, SelectStatement, result2, select); + + ASSERT_EQ(result2.parameters().size(), 1); + ASSERT(select->whereClause->expr2->isType(kExprParameter)); + ASSERT_EQ(select->whereClause->expr2->ival, 0); +} + +TEST(DeallocatePrepareStatementTest) { + TEST_PARSE_SINGLE_SQL("DEALLOCATE PREPARE test;", kStmtDrop, DropStatement, result, drop); + + ASSERT_EQ(drop->type, kDropPreparedStatement); + ASSERT_STREQ(drop->name, "test"); +} + +TEST(StatementWithParameters) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM test WHERE a = ? AND b = ?", kStmtSelect, SelectStatement, result, stmt); + + const hsql::Expr* eq1 = stmt->whereClause->expr; + const hsql::Expr* eq2 = stmt->whereClause->expr2; + + ASSERT_EQ(result.parameters().size(), 2); + + ASSERT_EQ(eq1->opType, hsql::kOpEquals); + ASSERT(eq1->expr->isType(hsql::kExprColumnRef)); + ASSERT(eq1->expr2->isType(kExprParameter)); + ASSERT_EQ(eq1->expr2->ival, 0); + ASSERT_EQ(result.parameters()[0], eq1->expr2); + + ASSERT_EQ(eq2->opType, hsql::kOpEquals); + ASSERT(eq2->expr->isType(hsql::kExprColumnRef)); + ASSERT(eq2->expr2->isType(kExprParameter)); + ASSERT_EQ(eq2->expr2->ival, 1); + ASSERT_EQ(result.parameters()[1], eq2->expr2); +} + +TEST(ExecuteStatementTest) { + TEST_PARSE_SINGLE_SQL("EXECUTE test(1, 2);", kStmtExecute, ExecuteStatement, result, stmt); + + ASSERT_STREQ(stmt->name, "test"); + ASSERT_EQ(stmt->parameters->size(), 2); +} + +TEST(ExecuteStatementTestNoParam) { + TEST_PARSE_SINGLE_SQL("EXECUTE test();", kStmtExecute, ExecuteStatement, result, stmt); + + ASSERT_STREQ(stmt->name, "test"); + ASSERT_EQ(stmt->parameters, 0); +} + +TEST(ExecuteStatementTestNoParamList) { + TEST_PARSE_SINGLE_SQL("EXECUTE test;", kStmtExecute, ExecuteStatement, result, stmt); + + ASSERT_STREQ(stmt->name, "test"); + ASSERT_EQ(stmt->parameters, 0); +} diff --git a/extern/hyrise_sql_parser/test/queries/queries-bad.sql b/extern/hyrise_sql_parser/test/queries/queries-bad.sql new file mode 100644 index 0000000000..119d932092 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/queries-bad.sql @@ -0,0 +1,112 @@ +# This file contains a list of strings that are NOT valid SQL queries. +# Each line contains a single SQL query. +# Each line starts with a '!' char to indicate that parsing should fail. +! +!1 +!gibberish; +!CREATE TABLE "table" FROM TBL FILE 'students.tbl';gibberish +!CREATE TABLE "table" FROM TBL FILE 'students.tbl';1 +!CREATE TABLE foo (a int, b int bar); +!CREATE TABLE foo (a int, b REFERENCES bar); +!CREATE TABLE foo (a int, b int, FOREIGN (b) REFERENCES bar); +!CREATE TABLE foo (a int, b int, KEY (b) REFERENCES bar); +!CREATE TABLE foo (a int, b int, FOREIGN KEY (b) bar); +!CREATE TABLE foo (a int, b int, FOREIGN KEY REFERENCES bar); +!CREATE TABLE foo (a int, b int, FOREIGN KEY b REFERENCES bar); +!CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES bar x); +!INSERT INTO test_table VALUESd (1, 2, 'test'); +!SELECT * FROM t WHERE a = ? AND b = ?;gibberish; +!SHOW COLUMNS; +!DESCRIBE; +!COPY; +!COPY students; +!COPY students FROM 'students_file' WITH (FORMAT XYZ); +!COPY students TO 'students_file' WITH (FORMAT XYZ); +!COPY students FROM 'students_file' WITH (); +!COPY students TO 'students_file' WITH (); +!COPY students TO 'students_file' WITH (FORMAT CSV ENCODING 'Dictionary'); +!COPY students TO 'students_file' WITH FORMAT CSV; +!COPY students TO 'students_file' WITH (FORMAT CSV, FORMAT BINARY); +!COPY students TO 'students_file' WITH (ENCODING 'Dictionary', ENCODING 'FSST'); +!COPY students FROM 'students_file' WITH (ENCODING Dictionary); +!select a + 2 as b(spam, eggs) from B; +!WITH a AS SELECT 1 SELECT 1; +!WITH a AS (SELECT ) SELECT 1; +!WITH a AS (WITH b AS (SELECT 1) SELECT 1) SELECT 1; # We do not support nested WITH clauses +!WITH a AS (SELECT ) b AS (SELECT ) SELECT 1; # Missing comma between WITH descriptions +!BEGIN TRANSACTION transName; # Transaction naming is currently not supported +!SELECT -9223372036854775809; # Out of int64_t range +!SELECT 9223372036854775808; # Out of int64_t range +!SELECT * FROM t WHERE a = DATE 'anystring'; +!SELECT * FROM t WHERE a = DATE '1996-12-310'; +!SELECT * FROM t WHERE a = DATE '1996-120-31'; +!SELECT * FROM t WHERE a = DATE '19960-12-31'; +!SELECT * FROM t WHERE a = DATE 'asdf-gh-jkl'; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 30; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 30 DAYS; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 30 'DAYS'; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 'DAYS'; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '1' ANYTHING; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '1 DAY' DAY; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '30 ANYTHING'; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '30' DAYS; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + x DAYS; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 'x' DAY; +!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '3.3 DAYS'; +# ON is not supported by postgres. We follow postgres here since the sql-92 standard does not specify index +# implementation details. +!DROP INDEX myindex ON mytable; +!SELECT * FROM test WHERE val = 2 FOR KEY UPDATE; +!SELECT * FROM test WHERE val = 2 FOR SHARE test1; +!SELECT * FROM test WHERE val = 2 FOR NO KEY SHARE; +!SELECT * FROM test WHERE val = 2 NOWAIT FOR UPDATE; +!CREATE TABLE a_table (a_column INT PRIMARY KEY NULL); +!CREATE TABLE a_table (a_column INT NULL PRIMARY KEY); +!CREATE TABLE a_table (a_column INT NOT NULL NULL); +!CREATE TABLE a_table (a_column INT NULL NOT NULL); +# WINDOW EXPRESSIONS +!SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3 ORDER BY test4 ROWS BETWEEN UNBOUNDED AND CURRENT ROW) FROM test; +!SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3 ORDER BY test4 ROWS BETWEEN -1 PRECEDING AND CURRENT ROW) FROM test; +!SELECT test1, rank() OVER (INVALID UNBOUNDED PRECEDING) FROM test; +!SELECT rank() OVER (INVALID) FROM test; +!SELECT rank OVER () FROM test; +!SELECT a = 1 OVER () FROM test; +!SELECT rank() OVER (ROWS UNBOUNDEDD PRECEDING) FROM test; +!SELECT rank() OVER (ROWS UNBOUNDED PRECEDINGG) FROM test; +!SELECT test1, rank() OVER (ROWS -1 PRECEDING) FROM test; +!SELECT test1, rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND -1 FOLLOWING) FROM test; +# Join USING +!SELECT * FROM foo INNER JOIN bar USING (); +!SELECT * FROM foo INNER JOIN bar USING (*); +# Both the SQL standard and Postgres allow column names only (no column references). +!SELECT * FROM foo INNER JOIN bar USING (foo.a); +!SELECT * FROM foo INNER JOIN bar USING (a b); +!SELECT * FROM foo INNER JOIN bar USING (a AS b); +!SELECT * FROM foo INNER JOIN bar USING (1); +# INSERT, EXECUTE, and HINTS only allow specific expressions. +!INSERT INTO foo VALUES (?); +!INSERT INTO foo VALUES (CAST(column_a AS INT)); +!INSERT INTO foo VALUES (AVG(another_column)); +!EXECUTE statement_a(?); +!EXECUTE statement_a(CAST(column_a AS INT)); +!EXECUTE statement_a(AVG(another_column)); +!SELECT * FROM foo WITH HINT (?); +!SELECT * FROM foo WITH HINT (CAST(column_a AS INT)); +!SELECT * FROM foo WITH HINT (AVG(another_column)); +# ORDER BY with NULL ordering. +!SELECT * FROM students ORDER BY name ASC NULL FIRST; +!SELECT * FROM students ORDER BY name ASC gibberish LAST; +!SELECT * FROM students ORDER BY name NULLS FIRS; +!SELECT * FROM students ORDER BY name NULLS; +!SELECT * FROM students ORDER BY name ASC NULLS; +!SELECT * FROM students ORDER BY name FIRST; +!SELECT * FROM students ORDER BY name ASC LAST; +!SELECT * FROM students ORDER BY name DESC NULLS gibberish; +# CSV options +!COPY students FROM 'file_path' WITH (FORMAT TBL, DELIMITER '|', NULL '', QUOTE '"'); +!COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', QUOTE '"', FORMAT TBL); +!COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', FORMAT TBL, QUOTE '"'); +!COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', QUOTE '"', NULL 'a'); +!COPY students FROM 'file_path' WITH (NULL '', QUOTE '"', DELIMITER '|', DELIMITER '/'); +!COPY students FROM 'file_path' WITH (QUOTE '"', NULL '', DELIMITER '/', QUOTE '_',); +!COPY students FROM 'file_path' WITH (FORMAT CSV, QUOTE '"', DELIMINIMITER '|'); diff --git a/extern/hyrise_sql_parser/test/queries/queries-good.sql b/extern/hyrise_sql_parser/test/queries/queries-good.sql new file mode 100644 index 0000000000..1a45ff6b56 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/queries-good.sql @@ -0,0 +1,122 @@ +# This file contains a list of strings that are NOT valid SQL queries. +# Each line contains a single SQL query. +# SELECT statement +SELECT * FROM orders; +SELECT a FROM foo WHERE a > 12 OR b > 3 AND NOT c LIMIT 10 +SELECT a FROM some_schema.foo WHERE a > 12 OR b > 3 AND NOT c LIMIT 10 +SELECT col1 AS myname, col2, 'test' FROM "table", foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1; +SELECT * from "table" JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5 +(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10); +SELECT * FROM "table" LIMIT 10 OFFSET 10; SELECT * FROM another; +SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY col1; +SELECT * FROM (SELECT * FROM t1); +SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1; +SELECT TOP 10 * FROM t1 ORDER BY col1, col2; +SELECT a, MAX(b), MAX(c, d), CUSTOM(q, UP(r)) AS f FROM t1; +SELECT * FROM t WHERE a BETWEEN 1 and c; +SELECT * FROM t WHERE a = ? AND b = ?; +SELECT City.name, Product.category, SUM(price) FROM fact INNER JOIN City ON fact.city_id = City.id INNER JOIN Product ON fact.product_id = Product.id GROUP BY City.name, Product.category; +SELECT SUBSTR(a, 3, 5) FROM t; +SELECT * FROM t WHERE a = DATE '1996-12-31'; +# JOIN +SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5 +SELECT * FROM t1 JOIN t2 ON c1 = c2; +SELECT a, SUM(b) FROM t2 GROUP BY a HAVING SUM(b) > 100; +# CREATE statement +CREATE TABLE "table" FROM TBL FILE 'students.tbl' +CREATE TABLE IF NOT EXISTS "table" FROM TBL FILE 'students.tbl' +CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE, credits BIGINT) +CREATE TABLE students (name TEXT, student_number INTEGER NOT NULL, city TEXT, grade DOUBLE PRIMARY KEY UNIQUE) +CREATE TABLE teachers (name VARCHAR(30), student_number LONG, city CHAR(10), grade FLOAT) +CREATE TABLE teachers (name VARCHAR(30), student_number LONG, PRIMARY KEY (name, student_number), city CHAR(10), grade FLOAT) +CREATE TABLE teachers (name CHARACTER VARYING(30)); +CREATE TABLE students_2 AS SELECT * FROM students +CREATE TABLE students_3 AS SELECT city, grade FROM students WHERE grade > 3.0 +CREATE TABLE students (date_of_birth DATE, matriculation_date DATETIME, graduation_date TIMESTAMP, graduated BOOLEAN); +CREATE TABLE foo (a int, b int REFERENCES bar REFERENCES baz); +CREATE TABLE foo (a int, b int REFERENCES bar (x) REFERENCES baz (y)); +CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES bar, FOREIGN KEY (b) REFERENCES baz); +CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES bar (x), FOREIGN KEY (b) REFERENCES baz (y)); +# Multiple statements +CREATE TABLE "table" FROM TBL FILE 'students.tbl'; SELECT * FROM "table"; +# INSERT +INSERT INTO test_table VALUES (1, 2, 'test'); +INSERT INTO test_table (id, value, name) VALUES (1, 2, 'test'); +INSERT INTO test_table SELECT * FROM students; +INSERT INTO some_schema.test_table SELECT * FROM another_schema.students; +# DELETE +DELETE FROM students WHERE grade > 3.0 +DELETE FROM students +TRUNCATE students +# UPDATE +UPDATE students SET grade = 1.3 WHERE name = 'Max Mustermann'; +UPDATE students SET grade = 1.3, name='Felix Fürstenberg' WHERE name = 'Max Mustermann'; +UPDATE students SET grade = 1.0; +UPDATE some_schema.students SET grade = 1.0; +# ALTER +ALTER TABLE mytable DROP COLUMN IF EXISTS mycolumn; +ALTER TABLE IF EXISTS mytable DROP COLUMN IF EXISTS mycolumn; +# DROP +DROP TABLE students; +DROP TABLE IF EXISTS students; +DROP VIEW IF EXISTS students; +DROP INDEX myindex; +DROP INDEX IF EXISTS myindex; +# PREPARE +PREPARE prep_inst FROM 'INSERT INTO test VALUES (?, ?, ?)'; +PREPARE prep2 FROM 'INSERT INTO test VALUES (?, 0, 0); INSERT INTO test VALUES (0, ?, 0); INSERT INTO test VALUES (0, 0, ?);'; +EXECUTE prep_another_inst(1, 2, 3, CAST(1 AS LONG), -2.5, INTERVAL '3 HOURS', -2 SECONDS, TRUE, NULL, DATE '2000-01-01'); +EXECUTE prep; +DEALLOCATE PREPARE prep; +# COPY +COPY students FROM 'student.tbl'; +COPY students FROM 'file_path' WITH (FORMAT TBL); +COPY students FROM 'file_path' WITH (FORMAT CSV); +COPY students FROM 'file_path' WITH (FORMAT BIN); +COPY students FROM 'file_path' WITH (FORMAT BINARY); +COPY students FROM 'file_path' WITH (FORMAT CSV, DELIMITER '|', NULL '', QUOTE '"'); +COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', FORMAT CSV, QUOTE '"'); +COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', QUOTE '"'); +COPY students FROM 'file_path' WITH (DELIMITER '|', FORMAT CSV); +COPY students FROM 'file_path' (FORMAT TBL); +COPY good_students FROM 'file_path' WHERE grade > (SELECT AVG(grade) from alumni); +COPY students TO 'student.tbl'; +COPY students TO 'file_path' WITH (ENCODING 'some_encoding', FORMAT TBL); +COPY students TO 'file_path' WITH (FORMAT CSV); +COPY students TO 'file_path' WITH (FORMAT BIN); +COPY students TO 'file_path' WITH (FORMAT BINARY); +COPY students TO 'file_path' (FORMAT BINARY, ENCODING 'FSST'); +COPY students TO 'file_path' WITH (ENCODING 'Dictionary'); +COPY (SELECT firstname, COUNT(*) FROM students GROUP BY firstname) TO 'student_names.csv'; +# HINTS +SELECT * FROM test WITH HINT(NO_CACHE); +SELECT * FROM test WITH HINT(NO_CACHE, NO_SAMPLING); +SELECT * FROM test WITH HINT(NO_CACHE, SAMPLE_RATE(0.1), OMW(1.0, 'test'), START_DATE(CAST('2000-01-01' AS DATE))); +SELECT * FROM test WITH HINT(TIME_DIFFERENCE(-3 HOURS), ALLOW_RESULT_CACHE(FALSE), DEFAULT_VALUE(NULL), TIMETRAVEL_TO(DATE '2000-01-01')); +SHOW TABLES; +SHOW COLUMNS students; +DESCRIBE students; +SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '30 DAYS'; +SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '10' DAY; +SELECT * FROM t WHERE a BETWEEN '2000-01-01' AND DATE '2000-01-01' - 1 MONTH; +SELECT (CAST('2002-5-01' as DATE) + INTERVAL '60 days'); +SELECT CAST(student.student_number as BIGINT) FROM student; +SELECT student.name AS character FROM student; +# ROW LOCKING +SELECT * FROM test WHERE id = 1 FOR UPDATE; +SELECT * FROM test WHERE id = 1 FOR SHARE; +SELECT * FROM test WHERE id = 1 FOR NO KEY UPDATE; +SELECT * FROM test WHERE id = 1 FOR KEY SHARE; +SELECT * FROM test WHERE id = 1 FOR UPDATE SKIP LOCKED; +SELECT * FROM test WHERE id = 1 FOR UPDATE NOWAIT; +SELECT * FROM test1, test2 WHERE test1.id = 10 FOR UPDATE OF test1; +SELECT * FROM test1, test2 WHERE test2.val = 2 FOR SHARE OF test1, test2; +SELECT * FROM test1, test2 WHERE test2.val = 2 FOR UPDATE OF test1 FOR SHARE OF test2; +# WINDOW EXPRESSIONS +SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3 ORDER BY test4 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) an_alias FROM test; +SELECT sum(test2)/sum(sum(test2)) OVER (PARTITION BY test1) FROM test GROUP BY test3; +SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3, test4 ORDER BY test5, test6 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) FROM test; +SELECT test1, rank() OVER (ORDER BY test2 DESC, test3 ASC) rnk FROM test; +SELECT rank() OVER () FROM test; +SELECT rank() OVER (PARTITION BY test1) FROM test; +SELECT rank() OVER (PARTITION BY test1 ORDER BY test2) FROM test; diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-01.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-01.sql new file mode 100644 index 0000000000..580b3b52cd --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-01.sql @@ -0,0 +1,9 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT L_RETURNFLAG, L_LINESTATUS, SUM(L_QUANTITY) AS SUM_QTY, + SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS SUM_DISC_PRICE, + SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)*(1+L_TAX)) AS SUM_CHARGE, AVG(L_QUANTITY) AS AVG_QTY, + AVG(L_EXTENDEDPRICE) AS AVG_PRICE, AVG(L_DISCOUNT) AS AVG_DISC, COUNT(*) AS COUNT_ORDER +FROM LINEITEM +WHERE L_SHIPDATE <= dateadd(dd, -90, cast('1998-12-01' as datetime)) +GROUP BY L_RETURNFLAG, L_LINESTATUS +ORDER BY L_RETURNFLAG,L_LINESTATUS \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-02.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-02.sql new file mode 100644 index 0000000000..c40be7376c --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-02.sql @@ -0,0 +1,10 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT TOP 100 S_ACCTBAL, S_NAME, N_NAME, P_PARTKEY, P_MFGR, S_ADDRESS, S_PHONE, S_COMMENT +FROM PART, SUPPLIER, PARTSUPP, NATION, REGION +WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY AND P_SIZE = 15 AND +P_TYPE LIKE '%%BRASS' AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND +R_NAME = 'EUROPE' AND +PS_SUPPLYCOST = (SELECT MIN(PS_SUPPLYCOST) FROM PARTSUPP, SUPPLIER, NATION, REGION + WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY + AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND R_NAME = 'EUROPE') +ORDER BY S_ACCTBAL DESC, N_NAME, S_NAME, P_PARTKEY \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-03.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-03.sql new file mode 100644 index 0000000000..5608c1420a --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-03.sql @@ -0,0 +1,7 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT TOP 10 L_ORDERKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE, O_ORDERDATE, O_SHIPPRIORITY +FROM CUSTOMER, ORDERS, LINEITEM +WHERE C_MKTSEGMENT = 'BUILDING' AND C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND +O_ORDERDATE < '1995-03-15' AND L_SHIPDATE > '1995-03-15' +GROUP BY L_ORDERKEY, O_ORDERDATE, O_SHIPPRIORITY +ORDER BY REVENUE DESC, O_ORDERDATE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-04.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-04.sql new file mode 100644 index 0000000000..3d420b381e --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-04.sql @@ -0,0 +1,6 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT FROM ORDERS +WHERE O_ORDERDATE >= '1993-07-01' AND O_ORDERDATE < dateadd(mm,3, cast('1993-07-01' as datetime)) +AND EXISTS (SELECT * FROM LINEITEM WHERE L_ORDERKEY = O_ORDERKEY AND L_COMMITDATE < L_RECEIPTDATE) +GROUP BY O_ORDERPRIORITY +ORDER BY O_ORDERPRIORITY \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-05.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-05.sql new file mode 100644 index 0000000000..95d292328b --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-05.sql @@ -0,0 +1,9 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT N_NAME, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE +FROM CUSTOMER, ORDERS, LINEITEM, SUPPLIER, NATION, REGION +WHERE C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND L_SUPPKEY = S_SUPPKEY +AND C_NATIONKEY = S_NATIONKEY AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY +AND R_NAME = 'ASIA' AND O_ORDERDATE >= '1994-01-01' +AND O_ORDERDATE < DATEADD(YY, 1, cast('1994-01-01' as datetime)) +GROUP BY N_NAME +ORDER BY REVENUE DESC \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-06.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-06.sql new file mode 100644 index 0000000000..394bba9f89 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-06.sql @@ -0,0 +1,5 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT SUM(L_EXTENDEDPRICE*L_DISCOUNT) AS REVENUE +FROM LINEITEM +WHERE L_SHIPDATE >= '1994-01-01' AND L_SHIPDATE < dateadd(yy, 1, cast('1994-01-01' as datetime)) +AND L_DISCOUNT BETWEEN .06 - 0.01 AND .06 + 0.01 AND L_QUANTITY < 24 \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-07.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-07.sql new file mode 100644 index 0000000000..449cc26094 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-07.sql @@ -0,0 +1,11 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT SUPP_NATION, CUST_NATION, L_YEAR, SUM(VOLUME) AS REVENUE +FROM ( SELECT N1.N_NAME AS SUPP_NATION, N2.N_NAME AS CUST_NATION, datepart(yy, L_SHIPDATE) AS L_YEAR, + L_EXTENDEDPRICE*(1-L_DISCOUNT) AS VOLUME + FROM SUPPLIER, LINEITEM, ORDERS, CUSTOMER, NATION N1, NATION N2 + WHERE S_SUPPKEY = L_SUPPKEY AND O_ORDERKEY = L_ORDERKEY AND C_CUSTKEY = O_CUSTKEY + AND S_NATIONKEY = N1.N_NATIONKEY AND C_NATIONKEY = N2.N_NATIONKEY AND ((N1.N_NAME = 'FRANCE' AND N2.N_NAME = 'GERMANY') OR + (N1.N_NAME = 'GERMANY' AND N2.N_NAME = 'FRANCE')) AND + L_SHIPDATE BETWEEN '1995-01-01' AND '1996-12-31' ) AS SHIPPING +GROUP BY SUPP_NATION, CUST_NATION, L_YEAR +ORDER BY SUPP_NATION, CUST_NATION, L_YEAR \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-08.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-08.sql new file mode 100644 index 0000000000..77f8c64a8c --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-08.sql @@ -0,0 +1,10 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT O_YEAR, SUM(CASE WHEN NATION = 'BRAZIL' THEN VOLUME ELSE 0 END)/SUM(VOLUME) AS MKT_SHARE +FROM (SELECT datepart(yy,O_ORDERDATE) AS O_YEAR, L_EXTENDEDPRICE*(1-L_DISCOUNT) AS VOLUME, N2.N_NAME AS NATION + FROM "PART", SUPPLIER, LINEITEM, ORDERS, CUSTOMER, NATION N1, NATION N2, REGION + WHERE P_PARTKEY = L_PARTKEY AND S_SUPPKEY = L_SUPPKEY AND L_ORDERKEY = O_ORDERKEY + AND O_CUSTKEY = C_CUSTKEY AND C_NATIONKEY = N1.N_NATIONKEY AND + N1.N_REGIONKEY = R_REGIONKEY AND R_NAME = 'AMERICA' AND S_NATIONKEY = N2.N_NATIONKEY + AND O_ORDERDATE BETWEEN '1995-01-01' AND '1996-12-31' AND P_TYPE= 'ECONOMY ANODIZED STEEL') AS ALL_NATIONS +GROUP BY O_YEAR +ORDER BY O_YEAR \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-09.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-09.sql new file mode 100644 index 0000000000..bb9fd6f3cf --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-09.sql @@ -0,0 +1,10 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT NATION, O_YEAR, SUM(AMOUNT) AS SUM_PROFIT +FROM (SELECT N_NAME AS NATION, datepart(yy, O_ORDERDATE) AS O_YEAR, + L_EXTENDEDPRICE*(1-L_DISCOUNT)-PS_SUPPLYCOST*L_QUANTITY AS AMOUNT + FROM "PART", SUPPLIER, LINEITEM, PARTSUPP, ORDERS, NATION + WHERE S_SUPPKEY = L_SUPPKEY AND PS_SUPPKEY= L_SUPPKEY AND PS_PARTKEY = L_PARTKEY AND + P_PARTKEY= L_PARTKEY AND O_ORDERKEY = L_ORDERKEY AND S_NATIONKEY = N_NATIONKEY AND + P_NAME LIKE '%%green%%') AS PROFIT +GROUP BY NATION, O_YEAR +ORDER BY NATION, O_YEAR DESC \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-10.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-10.sql new file mode 100644 index 0000000000..7229b24eb2 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-10.sql @@ -0,0 +1,9 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +SELECT TOP 20 C_CUSTKEY, C_NAME, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE, C_ACCTBAL, +N_NAME, C_ADDRESS, C_PHONE, C_COMMENT +FROM CUSTOMER, ORDERS, LINEITEM, NATION +WHERE C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND O_ORDERDATE>= '1993-10-01' AND +O_ORDERDATE < dateadd(mm, 3, cast('1993-10-01' as datetime)) AND +L_RETURNFLAG = 'R' AND C_NATIONKEY = N_NATIONKEY +GROUP BY C_CUSTKEY, C_NAME, C_ACCTBAL, C_PHONE, N_NAME, C_ADDRESS, C_COMMENT +ORDER BY REVENUE DESC \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-11.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-11.sql new file mode 100644 index 0000000000..41954bb456 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-11.sql @@ -0,0 +1,10 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +-- TPC_H Query 11 - Important Stock Identification +SELECT PS_PARTKEY, SUM(PS_SUPPLYCOST*PS_AVAILQTY) AS VALUE +FROM PARTSUPP, SUPPLIER, NATION +WHERE PS_SUPPKEY = S_SUPPKEY AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'GERMANY' +GROUP BY PS_PARTKEY +HAVING SUM(PS_SUPPLYCOST*PS_AVAILQTY) > (SELECT SUM(PS_SUPPLYCOST*PS_AVAILQTY) * 0.0001000000 + FROM PARTSUPP, SUPPLIER, NATION + WHERE PS_SUPPKEY = S_SUPPKEY AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'GERMANY') +ORDER BY VALUE DESC; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-12.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-12.sql new file mode 100644 index 0000000000..59a91b0567 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-12.sql @@ -0,0 +1,10 @@ +-- TPC_H Query 12 - Shipping Modes and Order Priority +SELECT L_SHIPMODE, +SUM(CASE WHEN O_ORDERPRIORITY = '1-URGENT' OR O_ORDERPRIORITY = '2-HIGH' THEN 1 ELSE 0 END) AS HIGH_LINE_COUNT, +SUM(CASE WHEN O_ORDERPRIORITY <> '1-URGENT' AND O_ORDERPRIORITY <> '2-HIGH' THEN 1 ELSE 0 END ) AS LOW_LINE_COUNT +FROM ORDERS, LINEITEM +WHERE O_ORDERKEY = L_ORDERKEY AND L_SHIPMODE IN ('MAIL','SHIP') +AND L_COMMITDATE < L_RECEIPTDATE AND L_SHIPDATE < L_COMMITDATE AND L_RECEIPTDATE >= '1994-01-01' +AND L_RECEIPTDATE < dateadd(mm, 1, cast('1995-09-01' as datetime)) +GROUP BY L_SHIPMODE +ORDER BY L_SHIPMODE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-13.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-13.sql new file mode 100644 index 0000000000..a48f691b20 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-13.sql @@ -0,0 +1,8 @@ +-- TPC_H Query 13 - Customer Distribution +SELECT C_COUNT, COUNT(*) AS CUSTDIST +FROM (SELECT C_CUSTKEY, COUNT(O_ORDERKEY) + FROM CUSTOMER left outer join ORDERS on C_CUSTKEY = O_CUSTKEY + AND O_COMMENT not like '%%special%%requests%%' + GROUP BY C_CUSTKEY) AS C_ORDERS (C_CUSTKEY, C_COUNT) +GROUP BY C_COUNT +ORDER BY CUSTDIST DESC, C_COUNT DESC; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-14.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-14.sql new file mode 100644 index 0000000000..72cf9c32cb --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-14.sql @@ -0,0 +1,5 @@ +-- TPC_H Query 14 - Promotion Effect +SELECT 100.00* SUM(CASE WHEN P_TYPE LIKE 'PROMO%%' THEN L_EXTENDEDPRICE*(1-L_DISCOUNT) +ELSE 0 END) / SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS PROMO_REVENUE +FROM LINEITEM, PART +WHERE L_PARTKEY = P_PARTKEY AND L_SHIPDATE >= '1995-09-01' AND L_SHIPDATE < dateadd(mm, 1, '1995-09-01'); \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-15.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-15.sql new file mode 100644 index 0000000000..5593df1859 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-15.sql @@ -0,0 +1,15 @@ +-- TPC_H Query 15.1 - Create View for Top Supplier Query +CREATE VIEW REVENUE0 (SUPPLIER_NO, TOTAL_REVENUE) AS +SELECT L_SUPPKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) FROM LINEITEM +WHERE L_SHIPDATE >= '1996-01-01' AND L_SHIPDATE < dateadd(mm, 3, cast('1996-01-01' as datetime)) +GROUP BY L_SUPPKEY; + + +-- TPC_H Query 15.2 - Top Supplier +SELECT S_SUPPKEY, S_NAME, S_ADDRESS, S_PHONE, TOTAL_REVENUE +FROM SUPPLIER, REVENUE0 +WHERE S_SUPPKEY = SUPPLIER_NO AND TOTAL_REVENUE = (SELECT MAX(TOTAL_REVENUE) FROM REVENUE0) +ORDER BY S_SUPPKEY; + +-- TPC_H Query 15.3 - Drop View +DROP VIEW REVENUE0; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-16.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-16.sql new file mode 100644 index 0000000000..7bf0bbc1dc --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-16.sql @@ -0,0 +1,9 @@ +-- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html +-- TPC_H Query 16 - Parts/Supplier Relationship +SELECT P_BRAND, P_TYPE, P_SIZE, COUNT(DISTINCT PS_SUPPKEY) AS SUPPLIER_CNT +FROM PARTSUPP, "PART" +WHERE P_PARTKEY = PS_PARTKEY AND P_BRAND <> 'Brand#45' AND P_TYPE NOT LIKE 'MEDIUM POLISHED%%' +AND P_SIZE IN (49, 14, 23, 45, 19, 3, 36, 9) AND PS_SUPPKEY NOT IN (SELECT S_SUPPKEY FROM SUPPLIER + WHERE S_COMMENT LIKE '%%Customer%%Complaints%%') +GROUP BY P_BRAND, P_TYPE, P_SIZE +ORDER BY SUPPLIER_CNT DESC, P_BRAND, P_TYPE, P_SIZE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-17.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-17.sql new file mode 100644 index 0000000000..e6d50ac1ef --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-17.sql @@ -0,0 +1,4 @@ +-- TPC_H Query 17 - Small-Quantity-Order Revenue +SELECT SUM(L_EXTENDEDPRICE)/7.0 AS AVG_YEARLY FROM LINEITEM, "PART" +WHERE P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#23' AND P_CONTAINER = 'MED BOX' +AND L_QUANTITY < (SELECT 0.2*AVG(L_QUANTITY) FROM LINEITEM WHERE L_PARTKEY = P_PARTKEY); \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-18.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-18.sql new file mode 100644 index 0000000000..57e9a34fb4 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-18.sql @@ -0,0 +1,7 @@ +-- TPC_H Query 18 - Large Volume Customer +SELECT TOP 100 C_NAME, C_CUSTKEY, O_ORDERKEY, O_ORDERDATE, O_TOTALPRICE, SUM(L_QUANTITY) +FROM CUSTOMER, ORDERS, LINEITEM +WHERE O_ORDERKEY IN (SELECT L_ORDERKEY FROM LINEITEM GROUP BY L_ORDERKEY HAVING + SUM(L_QUANTITY) > 300) AND C_CUSTKEY = O_CUSTKEY AND O_ORDERKEY = L_ORDERKEY +GROUP BY C_NAME, C_CUSTKEY, O_ORDERKEY, O_ORDERDATE, O_TOTALPRICE +ORDER BY O_TOTALPRICE DESC, O_ORDERDATE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-19.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-19.sql new file mode 100644 index 0000000000..8000b96910 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-19.sql @@ -0,0 +1,9 @@ +-- TPC_H Query 19 - Discounted Revenue +SELECT SUM(L_EXTENDEDPRICE* (1 - L_DISCOUNT)) AS REVENUE +FROM LINEITEM, "PART" +WHERE (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#12' AND P_CONTAINER IN ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') AND L_QUANTITY >= 1 AND L_QUANTITY <= 1 + 10 AND P_SIZE BETWEEN 1 AND 5 +AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON') +OR (P_PARTKEY = L_PARTKEY AND P_BRAND ='Brand#23' AND P_CONTAINER IN ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') AND L_QUANTITY >=10 AND L_QUANTITY <=10 + 10 AND P_SIZE BETWEEN 1 AND 10 +AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON') +OR (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#34' AND P_CONTAINER IN ( 'LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') AND L_QUANTITY >=20 AND L_QUANTITY <= 20 + 10 AND P_SIZE BETWEEN 1 AND 15 +AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON'); \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-20.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-20.sql new file mode 100644 index 0000000000..9803a254a3 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-20.sql @@ -0,0 +1,8 @@ +-- TPC_H Query 20 - Potential Part Promotion +SELECT S_NAME, S_ADDRESS FROM SUPPLIER, NATION +WHERE S_SUPPKEY IN (SELECT PS_SUPPKEY FROM PARTSUPP + WHERE PS_PARTKEY in (SELECT P_PARTKEY FROM "PART" WHERE P_NAME like 'forest%%') AND + PS_AVAILQTY > (SELECT 0.5*sum(L_QUANTITY) FROM LINEITEM WHERE L_PARTKEY = PS_PARTKEY AND + L_SUPPKEY = PS_SUPPKEY AND L_SHIPDATE >= '1994-01-01' AND + L_SHIPDATE < dateadd(yy,1,'1994-01-01'))) AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'CANADA' +ORDER BY S_NAME; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-21.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-21.sql new file mode 100644 index 0000000000..27be0c6d09 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-21.sql @@ -0,0 +1,11 @@ +-- TPC_H Query 21 - Suppliers Who Kept Orders Waiting +SELECT TOP 100 S_NAME, COUNT(*) AS NUMWAIT +FROM SUPPLIER, LINEITEM L1, ORDERS, NATION WHERE S_SUPPKEY = L1.L_SUPPKEY AND +O_ORDERKEY = L1.L_ORDERKEY AND O_ORDERSTATUS = 'F' AND L1.L_RECEIPTDATE> L1.L_COMMITDATE +AND EXISTS (SELECT * FROM LINEITEM L2 WHERE L2.L_ORDERKEY = L1.L_ORDERKEY + AND L2.L_SUPPKEY <> L1.L_SUPPKEY) AND +NOT EXISTS (SELECT * FROM LINEITEM L3 WHERE L3.L_ORDERKEY = L1.L_ORDERKEY AND + L3.L_SUPPKEY <> L1.L_SUPPKEY AND L3.L_RECEIPTDATE > L3.L_COMMITDATE) AND +S_NATIONKEY = N_NATIONKEY AND N_NAME = 'SAUDI ARABIA' +GROUP BY S_NAME +ORDER BY NUMWAIT DESC, S_NAME; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-22.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-22.sql new file mode 100644 index 0000000000..4d1d11e383 --- /dev/null +++ b/extern/hyrise_sql_parser/test/queries/tpc-h-22.sql @@ -0,0 +1,9 @@ +-- TPC_H Query 22 - Global Sales Opportunity */ +SELECT CNTRYCODE, COUNT(*) AS NUMCUST, SUM(C_ACCTBAL) AS TOTACCTBAL +FROM (SELECT SUBSTRING(C_PHONE,1,2) AS CNTRYCODE, C_ACCTBAL + FROM CUSTOMER WHERE SUBSTRING(C_PHONE,1,2) IN ('13', '31', '23', '29', '30', '18', '17') AND + C_ACCTBAL > (SELECT AVG(C_ACCTBAL) FROM CUSTOMER WHERE C_ACCTBAL > 0.00 AND + SUBSTRING(C_PHONE,1,2) IN ('13', '31', '23', '29', '30', '18', '17')) AND + NOT EXISTS ( SELECT * FROM ORDERS WHERE O_CUSTKEY = C_CUSTKEY)) AS CUSTSALE +GROUP BY CNTRYCODE +ORDER BY CNTRYCODE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/select_tests.cpp b/extern/hyrise_sql_parser/test/select_tests.cpp new file mode 100644 index 0000000000..a2d69d8a24 --- /dev/null +++ b/extern/hyrise_sql_parser/test/select_tests.cpp @@ -0,0 +1,1322 @@ +#include +#include + +#include "SQLParser.h" +#include "sql_asserts.h" +#include "thirdparty/microtest/microtest.h" + +namespace hsql { + +TEST(SelectTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_NULL(stmt->whereClause); + ASSERT_NULL(stmt->groupBy); +} + +TEST(SelectExprTest) { + TEST_PARSE_SINGLE_SQL("SELECT a, MAX(b), CUSTOM(c, F(un)) FROM students;", kStmtSelect, SelectStatement, result, + stmt); + + ASSERT_NULL(stmt->whereClause); + ASSERT_NULL(stmt->groupBy); + + ASSERT_EQ(stmt->selectList->size(), 3); + + ASSERT(stmt->selectList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->selectList->at(0)->getName(), "a"); + + ASSERT(stmt->selectList->at(1)->isType(kExprFunctionRef)); + ASSERT_STREQ(stmt->selectList->at(1)->getName(), "MAX"); + ASSERT_NOTNULL(stmt->selectList->at(1)->exprList); + ASSERT_EQ(stmt->selectList->at(1)->exprList->size(), 1); + ASSERT(stmt->selectList->at(1)->exprList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->selectList->at(1)->exprList->at(0)->getName(), "b"); + + ASSERT(stmt->selectList->at(2)->isType(kExprFunctionRef)); + ASSERT_STREQ(stmt->selectList->at(2)->getName(), "CUSTOM"); + ASSERT_NOTNULL(stmt->selectList->at(2)->exprList); + ASSERT_EQ(stmt->selectList->at(2)->exprList->size(), 2); + ASSERT(stmt->selectList->at(2)->exprList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(0)->getName(), "c"); + + ASSERT(stmt->selectList->at(2)->exprList->at(1)->isType(kExprFunctionRef)); + ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->getName(), "F"); + ASSERT_EQ(stmt->selectList->at(2)->exprList->at(1)->exprList->size(), 1); + ASSERT(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->getName(), "un"); +} + +TEST(SelectUnaryMinusTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT 10 - 20, 10 + -20, 10 +-20, 10+-20, 9223372036854775807, -9223372036854775808, 10-5.2, 10+-5.2", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_EQ(stmt->selectList->size(), 8); + + ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(0)->opType, kOpMinus); + ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(0)->expr->ival, 10); + ASSERT_EQ(stmt->selectList->at(0)->expr2->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(0)->expr2->ival, 20); + + ASSERT_EQ(stmt->selectList->at(1)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(1)->opType, kOpPlus); + ASSERT_EQ(stmt->selectList->at(1)->expr->ival, 10); + ASSERT_EQ(stmt->selectList->at(1)->expr2->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(1)->expr2->opType, kOpUnaryMinus); + ASSERT_EQ(stmt->selectList->at(1)->expr2->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(1)->expr2->expr->ival, 20); + + ASSERT_EQ(stmt->selectList->at(2)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(2)->opType, kOpPlus); + ASSERT_EQ(stmt->selectList->at(2)->expr->ival, 10); + ASSERT_EQ(stmt->selectList->at(2)->expr2->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(2)->expr2->opType, kOpUnaryMinus); + ASSERT_EQ(stmt->selectList->at(2)->expr2->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(2)->expr2->expr->ival, 20); + + ASSERT_EQ(stmt->selectList->at(3)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(3)->opType, kOpPlus); + ASSERT_EQ(stmt->selectList->at(3)->expr->ival, 10); + ASSERT_EQ(stmt->selectList->at(3)->expr2->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(3)->expr2->opType, kOpUnaryMinus); + ASSERT_EQ(stmt->selectList->at(3)->expr2->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(3)->expr2->expr->ival, 20); + + ASSERT_EQ(stmt->selectList->at(4)->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(4)->ival, LLONG_MAX); + + ASSERT_EQ(stmt->selectList->at(5)->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(5)->ival, LLONG_MIN); + + ASSERT_EQ(stmt->selectList->at(6)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(6)->opType, kOpMinus); + ASSERT_EQ(stmt->selectList->at(6)->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(6)->expr->ival, 10); + ASSERT_EQ(stmt->selectList->at(6)->expr2->type, kExprLiteralFloat); + ASSERT_EQ(stmt->selectList->at(6)->expr2->fval, 5.2); + + ASSERT_EQ(stmt->selectList->at(7)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(7)->opType, kOpPlus); + ASSERT_EQ(stmt->selectList->at(7)->expr->ival, 10); + ASSERT_EQ(stmt->selectList->at(7)->expr2->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(7)->expr2->opType, kOpUnaryMinus); + ASSERT_EQ(stmt->selectList->at(7)->expr2->expr->type, kExprLiteralFloat); + ASSERT_EQ(stmt->selectList->at(7)->expr2->expr->fval, 5.2); +} + +TEST(SelectSubstrTest) { + TEST_PARSE_SINGLE_SQL("SELECT SUBSTR(a, 3, 5) FROM students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_NULL(stmt->whereClause); + ASSERT_NULL(stmt->groupBy); + + ASSERT_EQ(stmt->selectList->size(), 1); + + ASSERT(stmt->selectList->at(0)->isType(kExprFunctionRef)); + ASSERT_STREQ(stmt->selectList->at(0)->getName(), "SUBSTR"); + + ASSERT_NOTNULL(stmt->selectList->at(0)->exprList); + ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 3); + + ASSERT(stmt->selectList->at(0)->exprList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->selectList->at(0)->exprList->at(0)->getName(), "a"); + + ASSERT(stmt->selectList->at(0)->exprList->at(1)->isType(kExprLiteralInt)); + ASSERT_EQ(stmt->selectList->at(0)->exprList->at(1)->ival, 3); + + ASSERT(stmt->selectList->at(0)->exprList->at(2)->isType(kExprLiteralInt)); + ASSERT_EQ(stmt->selectList->at(0)->exprList->at(2)->ival, 5); +} + +TEST(SelectHavingTest) { + TEST_PARSE_SINGLE_SQL("SELECT city, AVG(grade) AS avg_grade FROM students GROUP BY city HAVING AVG(grade) < -2.0", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_FALSE(stmt->selectDistinct); + ASSERT_NULL(stmt->having); + + GroupByDescription* group = stmt->groupBy; + ASSERT_NOTNULL(group); + ASSERT_EQ(group->columns->size(), 1); + ASSERT_EQ(group->having->opType, kOpLess); + ASSERT(group->having->expr->isType(kExprFunctionRef)); + ASSERT(group->having->expr2->isType(kExprOperator)); + ASSERT_EQ(group->having->expr2->opType, kOpUnaryMinus); + ASSERT_EQ(group->having->expr2->expr->fval, 2.0); +} + +TEST(SelectStandaloneHavingTest) { + TEST_PARSE_SINGLE_SQL("SELECT COUNT(*) FROM students HAVING COUNT(*) > 1", kStmtSelect, SelectStatement, result, + stmt); + + ASSERT_NULL(stmt->groupBy); + ASSERT_NOTNULL(stmt->having); + ASSERT_EQ(stmt->having->opType, kOpGreater); + ASSERT(stmt->having->expr->isType(kExprFunctionRef)); + ASSERT_STREQ(stmt->having->expr->getName(), "COUNT"); + ASSERT_NOTNULL(stmt->having->expr->exprList); + ASSERT_EQ(stmt->having->expr->exprList->size(), 1); + ASSERT(stmt->having->expr->exprList->at(0)->isType(kExprStar)); + ASSERT(stmt->having->expr2->isType(kExprLiteralInt)); + ASSERT_EQ(stmt->having->expr2->ival, 1); +} + +TEST(SelectDistinctTest) { + TEST_PARSE_SINGLE_SQL("SELECT DISTINCT grade, city FROM students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT(stmt->selectDistinct); + ASSERT_NULL(stmt->whereClause); +} + +TEST(SelectSchemaTest) { + TEST_PARSE_SINGLE_SQL("SELECT grade FROM some_schema.students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT(stmt->fromTable); + ASSERT_EQ(std::string(stmt->fromTable->schema), "some_schema"); +} + +TEST(SelectReservedIdentifierTest) { + TEST_PARSE_SINGLE_SQL("SELECT offset, mjdRef, drift FROM LeapSeconds where offset = 10", kStmtSelect, + SelectStatement, result, stmt); + + ASSERT_EQ(stmt->selectList->size(), 3); + ASSERT(stmt->selectList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->selectList->at(0)->getName(), "offset"); + ASSERT(stmt->whereClause); + ASSERT(stmt->whereClause->isType(kExprOperator)); + ASSERT_EQ(stmt->whereClause->opType, kOpEquals); + ASSERT(stmt->whereClause->expr->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->whereClause->expr->getName(), "offset"); +} + +TEST(SelectGroupDistinctTest) { + TEST_PARSE_SINGLE_SQL("SELECT city, COUNT(name), COUNT(DISTINCT grade) FROM students GROUP BY city;", kStmtSelect, + SelectStatement, result, stmt); + + ASSERT_FALSE(stmt->selectDistinct); + ASSERT_EQ(stmt->selectList->size(), 3); + ASSERT(!stmt->selectList->at(1)->distinct); + ASSERT(stmt->selectList->at(2)->distinct); +} + +TEST(OrderByTest) { + TEST_PARSE_SINGLE_SQL("SELECT grade, city FROM students ORDER BY grade, city DESC NULLS FIRST, name NULLS LAST;", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_NULL(stmt->whereClause); + ASSERT_NOTNULL(stmt->order); + + ASSERT_EQ(stmt->order->size(), 3); + ASSERT_EQ(stmt->order->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->order->at(0)->expr->name, "grade"); + ASSERT_EQ(stmt->order->at(0)->null_ordering, NullOrdering::Undefined); + + ASSERT_EQ(stmt->order->at(1)->type, kOrderDesc); + ASSERT_STREQ(stmt->order->at(1)->expr->name, "city"); + ASSERT_EQ(stmt->order->at(1)->null_ordering, NullOrdering::First); + + ASSERT_EQ(stmt->order->at(2)->type, kOrderAsc); + ASSERT_STREQ(stmt->order->at(2)->expr->name, "name"); + ASSERT_EQ(stmt->order->at(2)->null_ordering, NullOrdering::Last); +} + +TEST(SelectBetweenTest) { + TEST_PARSE_SINGLE_SQL("SELECT grade, city FROM students WHERE grade BETWEEN 1 and c;", kStmtSelect, SelectStatement, + result, stmt); + + Expr* where = stmt->whereClause; + ASSERT_NOTNULL(where); + ASSERT(where->isType(kExprOperator)); + ASSERT_EQ(where->opType, kOpBetween); + + ASSERT_STREQ(where->expr->getName(), "grade"); + ASSERT(where->expr->isType(kExprColumnRef)); + + ASSERT_EQ(where->exprList->size(), 2); + ASSERT(where->exprList->at(0)->isType(kExprLiteralInt)); + ASSERT_EQ(where->exprList->at(0)->ival, 1); + ASSERT(where->exprList->at(1)->isType(kExprColumnRef)); + ASSERT_STREQ(where->exprList->at(1)->getName(), "c"); +} + +TEST(SelectConditionalSelectTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM t WHERE a = (SELECT MIN(v) FROM tt) AND EXISTS (SELECT * FROM test WHERE x < a);", kStmtSelect, + SelectStatement, result, stmt); + + Expr* where = stmt->whereClause; + ASSERT_NOTNULL(where); + ASSERT(where->isType(kExprOperator)); + ASSERT_EQ(where->opType, kOpAnd); + + // a = (SELECT ...) + Expr* cond1 = where->expr; + ASSERT_NOTNULL(cond1); + ASSERT_NOTNULL(cond1->expr); + ASSERT_EQ(cond1->opType, kOpEquals); + ASSERT_STREQ(cond1->expr->getName(), "a"); + ASSERT(cond1->expr->isType(kExprColumnRef)); + + ASSERT_NOTNULL(cond1->expr2); + ASSERT(cond1->expr2->isType(kExprSelect)); + + SelectStatement* select2 = cond1->expr2->select; + ASSERT_NOTNULL(select2); + ASSERT_STREQ(select2->fromTable->getName(), "tt"); + + // EXISTS (SELECT ...) + Expr* cond2 = where->expr2; + ASSERT_EQ(cond2->opType, kOpExists); + ASSERT_NOTNULL(cond2->select); + + SelectStatement* ex_select = cond2->select; + ASSERT_STREQ(ex_select->fromTable->getName(), "test"); +} + +TEST(SelectCaseWhen) { + TEST_PARSE_SINGLE_SQL("SELECT MAX(CASE WHEN a = 'foo' THEN x ELSE 0 END) FROM test;", kStmtSelect, SelectStatement, + result, stmt); + + ASSERT_EQ(stmt->selectList->size(), 1); + Expr* func = stmt->selectList->at(0); + + ASSERT_NOTNULL(func); + ASSERT(func->isType(kExprFunctionRef)); + ASSERT_EQ(func->exprList->size(), 1); + + Expr* caseExpr = func->exprList->at(0); + ASSERT_NOTNULL(caseExpr); + ASSERT(caseExpr->isType(kExprOperator)); + ASSERT_EQ(caseExpr->opType, kOpCase); + ASSERT_NULL(caseExpr->expr); + ASSERT_NOTNULL(caseExpr->exprList); + ASSERT_NOTNULL(caseExpr->expr2); + ASSERT_EQ(caseExpr->exprList->size(), 1); + ASSERT(caseExpr->expr2->isType(kExprLiteralInt)); + + Expr* whenExpr = caseExpr->exprList->at(0); + ASSERT(whenExpr->expr->isType(kExprOperator)); + ASSERT_EQ(whenExpr->expr->opType, kOpEquals); + ASSERT(whenExpr->expr->expr->isType(kExprColumnRef)); + ASSERT(whenExpr->expr->expr2->isType(kExprLiteralString)); +} + +TEST(SelectCaseWhenWhen) { + TEST_PARSE_SINGLE_SQL("SELECT CASE WHEN x = 1 THEN 1 WHEN 1.25 < x THEN 2 END FROM test;", kStmtSelect, + SelectStatement, result, stmt); + + ASSERT_EQ(stmt->selectList->size(), 1); + Expr* caseExpr = stmt->selectList->at(0); + ASSERT_NOTNULL(caseExpr); + ASSERT(caseExpr->isType(kExprOperator)); + ASSERT_EQ(caseExpr->opType, kOpCase); + // CASE [expr] [exprList] [expr2] + // [expr] [expr] + // [expr] [expr2] [expr] [expr2] + // CASE (null) WHEN X = 1 THEN 1 WHEN 1.25 < x THEN 2 (null) + ASSERT_NULL(caseExpr->expr); + ASSERT_NOTNULL(caseExpr->exprList); + ASSERT_NULL(caseExpr->expr2); + ASSERT_EQ(caseExpr->exprList->size(), 2); + + Expr* whenExpr = caseExpr->exprList->at(0); + ASSERT_EQ(whenExpr->expr->opType, kOpEquals); + ASSERT(whenExpr->expr->expr->isType(kExprColumnRef)); + ASSERT(whenExpr->expr->expr2->isType(kExprLiteralInt)); + + Expr* whenExpr2 = caseExpr->exprList->at(1); + ASSERT_EQ(whenExpr2->expr->opType, kOpLess); + ASSERT(whenExpr2->expr->expr->isType(kExprLiteralFloat)); + ASSERT(whenExpr2->expr->expr2->isType(kExprColumnRef)); +} + +TEST(SelectCaseValueWhenWhenElse) { + TEST_PARSE_SINGLE_SQL("SELECT CASE x WHEN 1 THEN 0 WHEN 2 THEN 3 WHEN 8 THEN 7 ELSE 4 END FROM test;", kStmtSelect, + SelectStatement, result, stmt); + + ASSERT_EQ(stmt->selectList->size(), 1); + Expr* caseExpr = stmt->selectList->at(0); + ASSERT_NOTNULL(caseExpr); + ASSERT(caseExpr->isType(kExprOperator)); + ASSERT_EQ(caseExpr->opType, kOpCase); + ASSERT_NOTNULL(caseExpr->expr); + ASSERT_NOTNULL(caseExpr->exprList); + ASSERT_NOTNULL(caseExpr->expr2); + ASSERT_EQ(caseExpr->exprList->size(), 3); + ASSERT(caseExpr->expr->isType(kExprColumnRef)); + + Expr* whenExpr = caseExpr->exprList->at(2); + ASSERT(whenExpr->expr->isType(kExprLiteralInt)); + ASSERT_EQ(whenExpr->expr2->ival, 7); +} + +TEST(SelectJoin) { + TEST_PARSE_SINGLE_SQL( + "SELECT City.name, Product.category, SUM(price) FROM fact\ + INNER JOIN City ON fact.city_id = City.id\ + OUTER JOIN Product ON fact.product_id = Product.id\ + GROUP BY City.name, Product.category;", + kStmtSelect, SelectStatement, result, stmt); + + const TableRef* table = stmt->fromTable; + const JoinDefinition* outer_join = table->join; + ASSERT_EQ(table->type, kTableJoin); + ASSERT_EQ(outer_join->type, kJoinFull); + + ASSERT_EQ(outer_join->right->type, kTableName); + ASSERT_STREQ(outer_join->right->name, "Product"); + ASSERT_EQ(outer_join->condition->opType, kOpEquals); + ASSERT_STREQ(outer_join->condition->expr->table, "fact"); + ASSERT_STREQ(outer_join->condition->expr->name, "product_id"); + ASSERT_STREQ(outer_join->condition->expr2->table, "Product"); + ASSERT_STREQ(outer_join->condition->expr2->name, "id"); + ASSERT_FALSE(outer_join->namedColumns); + + // Joins are are left associative. + // So the second join should be on the left. + ASSERT_EQ(outer_join->left->type, kTableJoin); + + const JoinDefinition* inner_join = outer_join->left->join; + ASSERT_EQ(inner_join->type, kJoinInner); + ASSERT_EQ(inner_join->left->type, kTableName); + ASSERT_STREQ(inner_join->left->name, "fact"); + ASSERT_EQ(inner_join->right->type, kTableName); + ASSERT_STREQ(inner_join->right->name, "City"); + ASSERT_FALSE(inner_join->namedColumns); + + ASSERT_EQ(inner_join->condition->opType, kOpEquals); + ASSERT_STREQ(inner_join->condition->expr->table, "fact"); + ASSERT_STREQ(inner_join->condition->expr->name, "city_id"); + ASSERT_STREQ(inner_join->condition->expr2->table, "City"); + ASSERT_STREQ(inner_join->condition->expr2->name, "id"); +} + +TEST(SelectJoinUsing) { + TEST_PARSE_SQL_QUERY( + "SELECT * FROM foo INNER JOIN bar USING (a, b);" + "SELECT a, b, c FROM foo LEFT JOIN bar USING (a);" + "SELECT b FROM foo AS baz JOIN bar USING (a);", + result, 3); + + auto stmt = (SelectStatement*)result.getStatement(0); + // SELECT * ... + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_EQ(stmt->selectList->front()->type, kExprStar); + + // ... FROM foo INNER JOIN bar ... + ASSERT_TRUE(stmt->fromTable); + ASSERT_EQ(stmt->fromTable->type, kTableJoin); + ASSERT_TRUE(stmt->fromTable->join); + ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); + ASSERT_TRUE(stmt->fromTable->join->left); + ASSERT_EQ(stmt->fromTable->join->left->type, kTableName); + ASSERT_TRUE(stmt->fromTable->join->left->name); + ASSERT_STREQ(stmt->fromTable->join->left->name, "foo"); + ASSERT_TRUE(stmt->fromTable->join->right); + ASSERT_EQ(stmt->fromTable->join->right->type, kTableName); + ASSERT_TRUE(stmt->fromTable->join->right->name); + ASSERT_STREQ(stmt->fromTable->join->right->name, "bar"); + + // ... USING a, b; + ASSERT_FALSE(stmt->fromTable->join->condition); + ASSERT_TRUE(stmt->fromTable->join->namedColumns); + ASSERT_EQ(stmt->fromTable->join->namedColumns->size(), 2); + ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(0), "a"); + ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(1), "b"); + + stmt = (SelectStatement*)result.getStatement(1); + // SELECT a, b, c ... + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 3); + ASSERT_EQ(stmt->selectList->at(0)->type, kExprColumnRef); + ASSERT_TRUE(stmt->selectList->at(0)->name); + ASSERT_STREQ(stmt->selectList->at(0)->name, "a"); + ASSERT_EQ(stmt->selectList->at(1)->type, kExprColumnRef); + ASSERT_TRUE(stmt->selectList->at(1)->name); + ASSERT_STREQ(stmt->selectList->at(1)->name, "b"); + ASSERT_EQ(stmt->selectList->at(2)->type, kExprColumnRef); + ASSERT_TRUE(stmt->selectList->at(2)->name); + ASSERT_STREQ(stmt->selectList->at(2)->name, "c"); + + // ... FROM foo LEFT JOIN bar ... + ASSERT_TRUE(stmt->fromTable); + ASSERT_EQ(stmt->fromTable->type, kTableJoin); + ASSERT_TRUE(stmt->fromTable->join); + ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); + ASSERT_TRUE(stmt->fromTable->join->left); + ASSERT_EQ(stmt->fromTable->join->left->type, kTableName); + ASSERT_TRUE(stmt->fromTable->join->left->name); + ASSERT_STREQ(stmt->fromTable->join->left->name, "foo"); + ASSERT_TRUE(stmt->fromTable->join->right); + ASSERT_EQ(stmt->fromTable->join->right->type, kTableName); + ASSERT_TRUE(stmt->fromTable->join->right->name); + ASSERT_STREQ(stmt->fromTable->join->right->name, "bar"); + + // ... USING a; + ASSERT_FALSE(stmt->fromTable->join->condition); + ASSERT_TRUE(stmt->fromTable->join->namedColumns); + ASSERT_EQ(stmt->fromTable->join->namedColumns->size(), 1); + ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(0), "a"); + + stmt = (SelectStatement*)result.getStatement(2); + // SELECT b ... + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_EQ(stmt->selectList->at(0)->type, kExprColumnRef); + ASSERT_TRUE(stmt->selectList->at(0)->name); + ASSERT_STREQ(stmt->selectList->at(0)->name, "b"); + + // ... FROM foo as baz JOIN bar ... + ASSERT_TRUE(stmt->fromTable); + ASSERT_EQ(stmt->fromTable->type, kTableJoin); + ASSERT_TRUE(stmt->fromTable->join); + ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); + ASSERT_TRUE(stmt->fromTable->join->left); + ASSERT_EQ(stmt->fromTable->join->left->type, kTableName); + ASSERT_TRUE(stmt->fromTable->join->left->name); + ASSERT_STREQ(stmt->fromTable->join->left->name, "foo"); + ASSERT_TRUE(stmt->fromTable->join->left->alias); + ASSERT_TRUE(stmt->fromTable->join->left->alias->name); + ASSERT_STREQ(stmt->fromTable->join->left->alias->name, "baz"); + ASSERT_TRUE(stmt->fromTable->join->right); + ASSERT_EQ(stmt->fromTable->join->right->type, kTableName); + ASSERT_TRUE(stmt->fromTable->join->right->name); + ASSERT_STREQ(stmt->fromTable->join->right->name, "bar"); + + // ... USING a; + ASSERT_FALSE(stmt->fromTable->join->condition); + ASSERT_TRUE(stmt->fromTable->join->namedColumns); + ASSERT_EQ(stmt->fromTable->join->namedColumns->size(), 1); + ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(0), "a"); +} + +TEST(SelectColumnOrder) { + TEST_PARSE_SINGLE_SQL( + "SELECT *\ + FROM a,\ + (SELECT a AS b FROM a) b,\ + (SELECT a AS c FROM a) c,\ + (SELECT a AS d FROM a) d;", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_EQ(stmt->fromTable->list->size(), 4); + + // Make sure the order of the table list is corrects + ASSERT_STREQ(stmt->fromTable->list->at(0)->name, "a"); + ASSERT_STREQ(stmt->fromTable->list->at(1)->alias->name, "b"); + ASSERT_STREQ(stmt->fromTable->list->at(2)->alias->name, "c"); + ASSERT_STREQ(stmt->fromTable->list->at(3)->alias->name, "d"); +} + +TEST(SelectAliasAbsent) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_NULL(stmt->fromTable->alias); +} + +TEST(SelectAliasSimple) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students AS s1;", kStmtSelect, SelectStatement, result, stmt); + + Alias* alias = stmt->fromTable->alias; + ASSERT_NOTNULL(alias); + ASSERT_STREQ(alias->name, "s1"); + ASSERT_NULL(alias->columns); +} + +TEST(SelectAliasWithColumns) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students AS s1(id, city);", kStmtSelect, SelectStatement, result, stmt); + + Alias* alias = stmt->fromTable->alias; + ASSERT_NOTNULL(alias); + + ASSERT_NOTNULL(alias->name); + ASSERT_STREQ(alias->name, "s1"); + + ASSERT_NOTNULL(alias->columns); + ASSERT_EQ(alias->columns->size(), 2); + ASSERT_STREQ(alias->columns->at(0), "id"); + ASSERT_STREQ(alias->columns->at(1), "city"); +} + +TEST(SelectExpressionAlias) { + TEST_PARSE_SINGLE_SQL("SELECT AVG(grade) avg_grade FROM students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_NULL(stmt->fromTable->alias); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_TRUE(stmt->selectList->at(0)->isType(kExprFunctionRef)); + ASSERT_STREQ(stmt->selectList->at(0)->name, "AVG"); + ASSERT_TRUE(stmt->selectList->at(0)->hasAlias()); + ASSERT_STREQ(stmt->selectList->at(0)->alias, "avg_grade"); +} + +TEST(Operators) { + SelectStatement* stmt; + SQLParserResult result; + + SQLParser::parse( + "SELECT * FROM foo where a = 1; \ + SELECT * FROM foo where a == 2; \ + SELECT * FROM foo where a != 1; \ + SELECT * FROM foo where a <> 1; \ + SELECT * FROM foo where a > 1; \ + SELECT * FROM foo where a < 1; \ + SELECT * FROM foo where a >= 1; \ + SELECT * FROM foo where a <= 1; \ + SELECT * FROM foo where a = TRUE; \ + SELECT * FROM foo where a = false;", + &result); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->whereClause->opType, kOpEquals); + ASSERT_EQ(stmt->whereClause->expr2->ival, 1); + ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, false); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->whereClause->opType, kOpEquals); + ASSERT_EQ(stmt->whereClause->expr2->ival, 2); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_EQ(stmt->whereClause->opType, kOpNotEquals); + + stmt = (SelectStatement*)result.getStatement(3); + ASSERT_EQ(stmt->whereClause->opType, kOpNotEquals); + + stmt = (SelectStatement*)result.getStatement(4); + ASSERT_EQ(stmt->whereClause->opType, kOpGreater); + + stmt = (SelectStatement*)result.getStatement(5); + ASSERT_EQ(stmt->whereClause->opType, kOpLess); + + stmt = (SelectStatement*)result.getStatement(6); + ASSERT_EQ(stmt->whereClause->opType, kOpGreaterEq); + + stmt = (SelectStatement*)result.getStatement(7); + ASSERT_EQ(stmt->whereClause->opType, kOpLessEq); + + stmt = (SelectStatement*)result.getStatement(8); + ASSERT_EQ(stmt->whereClause->opType, kOpEquals); + ASSERT_EQ(stmt->whereClause->expr2->ival, 1); + ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, true); + + stmt = (SelectStatement*)result.getStatement(9); + ASSERT_EQ(stmt->whereClause->opType, kOpEquals); + ASSERT_EQ(stmt->whereClause->expr2->ival, 0); + ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, true); +} + +TEST(JoinTypes) { + SelectStatement* stmt; + SQLParserResult result; + + SQLParser::parse( + "SELECT * FROM x join y on a=b; \ + SELECT * FROM x inner join y on a=b; \ + SELECT * FROM x left join y on a=b; \ + SELECT * FROM x left outer join y on a=b; \ + SELECT * FROM x right join y on a=b; \ + SELECT * FROM x right outer join y on a=b; \ + SELECT * FROM x full join y on a=b; \ + SELECT * FROM x outer join y on a=b; \ + SELECT * FROM x full outer join y on a=b; \ + SELECT * FROM x natural join y; \ + SELECT * FROM x cross join y; \ + SELECT * FROM x, y where a = b;", + &result); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(3); + ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(4); + ASSERT_EQ(stmt->fromTable->join->type, kJoinRight); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(5); + ASSERT_EQ(stmt->fromTable->join->type, kJoinRight); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(6); + ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(7); + ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(8); + ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(9); + ASSERT_EQ(stmt->fromTable->join->type, kJoinNatural); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + + stmt = (SelectStatement*)result.getStatement(10); + ASSERT_EQ(stmt->fromTable->join->type, kJoinCross); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + ASSERT_NULL(stmt->fromTable->join->condition); + + stmt = (SelectStatement*)result.getStatement(11); + ASSERT_NULL(stmt->fromTable->join); +} + +TEST(CrossJoinNoCondition) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM x cross join y;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_NOTNULL(stmt->fromTable); + ASSERT_NOTNULL(stmt->fromTable->join); + ASSERT_EQ(stmt->fromTable->join->type, kJoinCross); + ASSERT_FALSE(stmt->fromTable->join->namedColumns); + ASSERT_NULL(stmt->fromTable->join->condition); +} + +TEST(SetLimitOffset) { + SelectStatement* stmt; + + TEST_PARSE_SQL_QUERY( + "select a from t1 limit 1; \ + select a from t1 limit 1 + 2; \ + select a from t1 offset 1; \ + select a from t1 offset 1 + 2; \ + select a from t1 limit 1 offset 1; \ + select a from t1 limit 1 + 2 offset 1 + 2; \ + select a from t1 limit 1 offset NULL; \ + select a from t1 limit ALL; \ + select a from t1 limit NULL; \ + select a from t1 limit ALL offset 1; \ + select a from t1 limit NULL offset 1; \ + select top 10 a from t1; \ + select top 20 a from t1 limit 10; \ + select a from t1 limit (SELECT MAX(b) FROM t1) offset (SELECT MIN(b) FROM t1);", + result, 14); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->limit->ival, 1); + ASSERT_NULL(stmt->limit->offset); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->limit->limit->type, kExprOperator); + ASSERT_EQ(stmt->limit->limit->opType, kOpPlus); + ASSERT_EQ(stmt->limit->limit->expr->ival, 1); + ASSERT_EQ(stmt->limit->limit->expr2->ival, 2); + ASSERT_NULL(stmt->limit->offset); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_NULL(stmt->limit->limit); + ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->offset->ival, 1); + + stmt = (SelectStatement*)result.getStatement(3); + ASSERT_NULL(stmt->limit->limit); + ASSERT_EQ(stmt->limit->offset->type, kExprOperator); + ASSERT_EQ(stmt->limit->offset->opType, kOpPlus); + ASSERT_EQ(stmt->limit->offset->expr->ival, 1); + ASSERT_EQ(stmt->limit->offset->expr2->ival, 2); + + stmt = (SelectStatement*)result.getStatement(4); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->limit->ival, 1); + ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->offset->ival, 1); + + stmt = (SelectStatement*)result.getStatement(5); + ASSERT_EQ(stmt->limit->limit->type, kExprOperator); + ASSERT_EQ(stmt->limit->limit->opType, kOpPlus); + ASSERT_EQ(stmt->limit->limit->expr->ival, 1); + ASSERT_EQ(stmt->limit->limit->expr2->ival, 2); + ASSERT_EQ(stmt->limit->offset->type, kExprOperator); + ASSERT_EQ(stmt->limit->offset->opType, kOpPlus); + ASSERT_EQ(stmt->limit->offset->expr->ival, 1); + ASSERT_EQ(stmt->limit->offset->expr2->ival, 2); + + stmt = (SelectStatement*)result.getStatement(6); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->limit->ival, 1); + ASSERT_EQ(stmt->limit->offset->type, kExprLiteralNull); + + stmt = (SelectStatement*)result.getStatement(7); + ASSERT_NULL(stmt->limit->limit); + ASSERT_NULL(stmt->limit->offset); + + stmt = (SelectStatement*)result.getStatement(8); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralNull); + ASSERT_NULL(stmt->limit->offset); + + stmt = (SelectStatement*)result.getStatement(9); + ASSERT_NULL(stmt->limit->limit); + ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->offset->ival, 1); + + stmt = (SelectStatement*)result.getStatement(10); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralNull); + ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->offset->ival, 1); + + stmt = (SelectStatement*)result.getStatement(11); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->limit->ival, 10); + ASSERT_NULL(stmt->limit->offset); + + stmt = (SelectStatement*)result.getStatement(12); + ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); + ASSERT_EQ(stmt->limit->limit->ival, 10); + ASSERT_NULL(stmt->limit->offset); + + stmt = (SelectStatement*)result.getStatement(13); + ASSERT_EQ(stmt->limit->limit->type, kExprSelect); + ASSERT_EQ(stmt->limit->offset->type, kExprSelect); +} + +TEST(Extract) { + SelectStatement* stmt; + + TEST_PARSE_SQL_QUERY( + "select extract(year from dc) FROM t;" + "select x, extract(month from dc) AS t FROM t;" + "select x FROM t WHERE extract(minute from dc) > 2011;", + result, 3); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1u); + ASSERT_EQ(stmt->selectList->at(0)->type, kExprExtract); + ASSERT_EQ(stmt->selectList->at(0)->datetimeField, kDatetimeYear); + ASSERT_TRUE(stmt->selectList->at(0)->expr); + ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprColumnRef); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 2u); + ASSERT_EQ(stmt->selectList->at(1)->type, kExprExtract); + ASSERT_EQ(stmt->selectList->at(1)->datetimeField, kDatetimeMonth); + ASSERT_TRUE(stmt->selectList->at(1)->expr); + ASSERT_EQ(stmt->selectList->at(1)->expr->type, kExprColumnRef); + ASSERT_TRUE(stmt->selectList->at(1)->alias); + ASSERT_EQ(stmt->selectList->at(1)->alias, std::string("t")); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_TRUE(stmt->whereClause); + ASSERT_TRUE(stmt->whereClause->expr); + ASSERT_EQ(stmt->whereClause->expr->type, kExprExtract); + ASSERT_EQ(stmt->whereClause->expr->datetimeField, kDatetimeMinute); +} + +TEST(CastExpression) { + TEST_PARSE_SINGLE_SQL("SELECT CAST(10 AS INT);", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_TRUE(stmt->selectList); + ASSERT_FALSE(stmt->fromTable); + ASSERT_FALSE(stmt->whereClause); + ASSERT_FALSE(stmt->groupBy); + + ASSERT_EQ(stmt->selectList->size(), 1u); + ASSERT_EQ(stmt->selectList->at(0)->type, kExprCast); + ASSERT_EQ(stmt->selectList->at(0)->columnType, ColumnType(DataType::INT)); + ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt); +} + +TEST(NoFromClause) { + TEST_PARSE_SINGLE_SQL("SELECT 1 + 2;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_TRUE(stmt->selectList); + ASSERT_FALSE(stmt->fromTable); + ASSERT_FALSE(stmt->whereClause); + ASSERT_FALSE(stmt->groupBy); + + ASSERT_EQ(stmt->selectList->size(), 1u); + ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(0)->expr2->type, kExprLiteralInt); +} + +TEST(WithClauseSingle) { + TEST_PARSE_SINGLE_SQL( + "WITH " + "a AS (SELECT name FROM peopleA)" + "SELECT name FROM a;", + kStmtSelect, SelectStatement, result, stmt); + + // with_description_list – count + ASSERT_EQ(stmt->withDescriptions->size(), 1); + + // with_description – alias + ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "a"); + + // with_description – select stmt + ASSERT_EQ(stmt->withDescriptions->at(0)->select->selectList->size(), 1); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->selectList->at(0)->name, std::string("name")); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, std::string("peopleA")); + + // main select + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_STREQ(stmt->selectList->at(0)->name, "name"); + ASSERT_STREQ(stmt->fromTable->name, "a"); +} + +TEST(WithClauseDouble) { + TEST_PARSE_SINGLE_SQL( + "WITH " + "a AS (SELECT nameA FROM peopleA), " + "b AS (SELECT nameB, cityB FROM peopleB) " + "SELECT nameA FROM a;", + kStmtSelect, SelectStatement, result, stmt); + + // with_description_list – count + ASSERT_EQ(stmt->withDescriptions->size(), 2); + + // with_description – aliases + ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "a"); + ASSERT_STREQ(stmt->withDescriptions->at(1)->alias, "b"); + + // with_description – select stmts + ASSERT_EQ(stmt->withDescriptions->at(0)->select->selectList->size(), 1); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, "peopleA"); + ASSERT_EQ(stmt->withDescriptions->at(1)->select->selectList->size(), 2); + ASSERT_STREQ(stmt->withDescriptions->at(1)->select->fromTable->name, "peopleB"); + + // main select + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_STREQ(stmt->selectList->at(0)->name, "nameA"); + ASSERT_STREQ(stmt->fromTable->name, "a"); +} + +TEST(CastAsDate) { + TEST_PARSE_SINGLE_SQL("SELECT CAST(ID AS DATE) FROM TEST", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_TRUE(result.isValid()); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_EQ(stmt->selectList->front()->type, kExprCast); + ASSERT_EQ(stmt->selectList->front()->columnType.data_type, DataType::DATE); +} + +TEST(DateLiteral) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM t WHERE a = DATE '1996-12-31'", kStmtSelect, SelectStatement, result, stmt); + ASSERT_TRUE(result.isValid()); + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->whereClause->opType, kOpEquals); + ASSERT_STREQ(stmt->whereClause->expr2->name, "1996-12-31"); +} + +TEST(IntervalLiteral) { + SelectStatement* stmt; + Expr* interval_literal; + TEST_PARSE_SQL_QUERY( + "SELECT a + 1 year FROM t;" + "SELECT * FROM t where a = cast ('2000-01-01' AS DATE) - 30 days;", + result, 2); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1u); + ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator); + ASSERT_TRUE(stmt->selectList->at(0)->expr2); + interval_literal = stmt->selectList->at(0)->expr2; + ASSERT_EQ(interval_literal->datetimeField, kDatetimeYear); + ASSERT_EQ(interval_literal->ival, 1); + ASSERT_EQ(interval_literal->type, kExprLiteralInterval); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_TRUE(stmt->whereClause); + ASSERT_TRUE(stmt->whereClause->expr); + ASSERT_TRUE(stmt->whereClause->type = kExprOperator); + ASSERT_TRUE(stmt->whereClause->opType = kOpEquals); + ASSERT_TRUE(stmt->whereClause->expr2); + ASSERT_TRUE(stmt->whereClause->expr2->type = kExprOperator); + ASSERT_TRUE(stmt->whereClause->expr2->opType = kOpPlus); + ASSERT_TRUE(stmt->whereClause->expr2->expr2); + interval_literal = stmt->whereClause->expr2->expr2; + ASSERT_EQ(interval_literal->datetimeField, kDatetimeDay); + ASSERT_EQ(interval_literal->ival, 30); + ASSERT_EQ(interval_literal->type, kExprLiteralInterval); + + const auto interval_units = std::map{ + {kDatetimeSecond, "second"}, {kDatetimeMinute, "minute"}, {kDatetimeHour, "hour"}, + {kDatetimeDay, "day"}, {kDatetimeMonth, "month"}, {kDatetimeYear, "year"}}; + + for (const auto& it : interval_units) { + const auto& unit_string = it.second; + const auto unit_string_plural = unit_string + "s"; + TEST_PARSE_SQL_QUERY("SELECT * FROM t WHERE a = 1 + 5 " + unit_string + + ";" + "SELECT * FROM t WHERE a = 1 + 5 " + + unit_string_plural + + ";" + "SELECT * FROM t WHERE a = 1 + INTERVAL '5'" + + unit_string + + ";" + "SELECT * FROM t WHERE a = 1 + INTERVAL '5 " + + unit_string + + "';" + "SELECT * FROM t WHERE a = 1 + INTERVAL '5 " + + unit_string_plural + "';", + result, 5); + + for (const auto& statement : result.getStatements()) { + stmt = (SelectStatement*)statement; + interval_literal = stmt->whereClause->expr2->expr2; + ASSERT_EQ(interval_literal->datetimeField, it.first); + ASSERT_EQ(interval_literal->ival, 5); + ASSERT_EQ(interval_literal->type, kExprLiteralInterval); + } + } +} + +TEST(LockingClauseWithoutWaitPolicy) { + SelectStatement* stmt; + TEST_PARSE_SQL_QUERY( + "SELECT * FROM t WHERE a = 10 FOR UPDATE;" + "SELECT * FROM t WHERE a = 10 FOR SHARE;" + "SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE FOR KEY SHARE;", + result, 3); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_EQ(stmt->lockings->size(), 2); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_FALSE(stmt->lockings->at(1)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForKeyShare); + ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::None); +} + +TEST(LockingClauseWithWaitPolicy) { + SelectStatement* stmt; + TEST_PARSE_SQL_QUERY( + "SELECT * FROM t WHERE a = 10 FOR UPDATE NOWAIT;" + "SELECT * FROM t WHERE a = 10 FOR SHARE NOWAIT;" + "SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE NOWAIT;" + "SELECT * FROM t WHERE a = 10 FOR KEY SHARE NOWAIT;" + "SELECT * FROM t WHERE a = 10 FOR UPDATE SKIP LOCKED;" + "SELECT * FROM t WHERE a = 10 FOR SHARE SKIP LOCKED;" + "SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE SKIP LOCKED;" + "SELECT * FROM t WHERE a = 10 FOR KEY SHARE SKIP LOCKED;", + result, 8); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + + stmt = (SelectStatement*)result.getStatement(3); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForKeyShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + + stmt = (SelectStatement*)result.getStatement(4); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); + + stmt = (SelectStatement*)result.getStatement(5); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); + + stmt = (SelectStatement*)result.getStatement(6); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); + + stmt = (SelectStatement*)result.getStatement(7); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForKeyShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); +} + +TEST(LockingClauseWithTableReference) { + SelectStatement* stmt; + TEST_PARSE_SQL_QUERY( + "SELECT * FROM t WHERE a = 10 FOR UPDATE OF t;" + "SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t,c;" + "SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t,c NOWAIT;", + result, 3); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 2); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(1), "c"); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_EQ(stmt->lockings->size(), 1); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 2); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(1), "c"); +} + +TEST(MultipleLockingClause) { + SelectStatement* stmt; + TEST_PARSE_SQL_QUERY( + "SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t FOR KEY SHARE OF c;" + "SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c NOWAIT;" + "SELECT * FROM t, c, s WHERE t.a = 10 FOR NO KEY UPDATE FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c, s NOWAIT;", + result, 3); + + stmt = (SelectStatement*)result.getStatement(0); + ASSERT_EQ(stmt->lockings->size(), 2); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); + ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForKeyShare); + ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::None); + ASSERT_EQ(stmt->lockings->at(1)->tables->size(), 1); + ASSERT_STREQ(stmt->lockings->at(1)->tables->at(0), "c"); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_EQ(stmt->lockings->size(), 2); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); + ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); + ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); + ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForUpdate); + ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); + ASSERT_STREQ(stmt->lockings->at(1)->tables->at(0), "c"); + + stmt = (SelectStatement*)result.getStatement(2); + ASSERT_EQ(stmt->lockings->size(), 3); + ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); + ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); + ASSERT_FALSE(stmt->lockings->at(0)->tables); + + ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForShare); + ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); + ASSERT_EQ(stmt->lockings->at(1)->tables->size(), 1); + ASSERT_STREQ(stmt->lockings->at(1)->tables->at(0), "t"); + + ASSERT_EQ(stmt->lockings->at(2)->rowLockMode, RowLockMode::ForUpdate); + ASSERT_EQ(stmt->lockings->at(2)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); + ASSERT_EQ(stmt->lockings->at(2)->tables->size(), 2); + ASSERT_STREQ(stmt->lockings->at(2)->tables->at(0), "c"); + ASSERT_STREQ(stmt->lockings->at(2)->tables->at(1), "s"); +} + +TEST(WindowFunctions) { + TEST_PARSE_SQL_QUERY( + "SELECT t2, 1 / avg(t1) OVER(), rank() OVER(ORDER BY t1 DESC) rnk FROM t;" + "SELECT avg(t1) OVER(PARTITION BY t2, t3 ORDER BY t4, t5 ROWS UNBOUNDED PRECEDING) FROM t;" + "SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 ROWS BETWEEN 25 PRECEDING AND 2 FOLLOWING) FROM t;" + "SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM " + "t;" + "SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t;", + result, 5); + + auto stmt = (SelectStatement*)result.getStatement(0); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 3); + ASSERT_TRUE(stmt->fromTable); + ASSERT_EQ(stmt->fromTable->type, kTableName); + ASSERT_STREQ(stmt->fromTable->name, "t"); + + ASSERT_EQ(stmt->selectList->at(1)->type, kExprOperator); + ASSERT_EQ(stmt->selectList->at(1)->opType, kOpSlash); + ASSERT_TRUE(stmt->selectList->at(1)->expr); + ASSERT_EQ(stmt->selectList->at(1)->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->selectList->at(1)->expr->ival, 1); + + ASSERT_TRUE(stmt->selectList->at(1)->expr2); + ASSERT_EQ(stmt->selectList->at(1)->expr2->type, kExprFunctionRef); + ASSERT_STREQ(stmt->selectList->at(1)->expr2->name, "avg"); + ASSERT_TRUE(stmt->selectList->at(1)->expr2->exprList); + ASSERT_EQ(stmt->selectList->at(1)->expr2->exprList->size(), 1); + ASSERT_EQ(stmt->selectList->at(1)->expr2->exprList->at(0)->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(1)->expr2->exprList->at(0)->name, "t1"); + + ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription); + ASSERT_FALSE(stmt->selectList->at(1)->expr2->windowDescription->partitionList); + ASSERT_FALSE(stmt->selectList->at(1)->expr2->windowDescription->orderList); + ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription); + ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->type, kRange); + ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start); + ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start->offset, 0); + ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start->type, kPreceding); + ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start->unbounded); + ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end); + ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end->offset, 0); + ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end->type, kCurrentRow); + ASSERT_FALSE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end->unbounded); + + ASSERT_TRUE(stmt->selectList->at(2)); + ASSERT_EQ(stmt->selectList->at(2)->type, kExprFunctionRef); + ASSERT_STREQ(stmt->selectList->at(2)->name, "rank"); + ASSERT_TRUE(stmt->selectList->at(2)->alias); + ASSERT_STREQ(stmt->selectList->at(2)->alias, "rnk"); + ASSERT_TRUE(stmt->selectList->at(2)->exprList); + ASSERT_TRUE(stmt->selectList->at(2)->exprList->empty()); + + ASSERT_TRUE(stmt->selectList->at(2)->windowDescription); + ASSERT_FALSE(stmt->selectList->at(2)->windowDescription->partitionList); + ASSERT_TRUE(stmt->selectList->at(2)->windowDescription->orderList); + ASSERT_EQ(stmt->selectList->at(2)->windowDescription->orderList->size(), 1); + ASSERT_EQ(stmt->selectList->at(2)->windowDescription->orderList->at(0)->type, kOrderDesc); + ASSERT_TRUE(stmt->selectList->at(2)->windowDescription->orderList->at(0)->expr); + ASSERT_EQ(stmt->selectList->at(2)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(2)->windowDescription->orderList->at(0)->expr->name, "t1"); + ASSERT_TRUE(stmt->selectList->at(2)->windowDescription->frameDescription); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_TRUE(stmt->fromTable); + ASSERT_EQ(stmt->fromTable->type, kTableName); + ASSERT_STREQ(stmt->fromTable->name, "t"); + + ASSERT_EQ(stmt->selectList->at(0)->type, kExprFunctionRef); + ASSERT_STREQ(stmt->selectList->at(0)->name, "avg"); + ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 1); + ASSERT_STREQ(stmt->selectList->at(0)->exprList->at(0)->name, "t1"); + + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->partitionList); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->size(), 2); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->name, "t2"); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(1)->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(1)->name, "t3"); + + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->size(), 2); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->type, kOrderAsc); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->name, "t4"); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(1)->expr->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(1)->expr->name, "t5"); + + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->type, kRows); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->offset, 0); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->type, kPreceding); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start->unbounded); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->end); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->offset, 0); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->type, kCurrentRow); + ASSERT_FALSE(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded); + + const auto frame_starts = + std::vector{{25, kPreceding, false}, {0, kPreceding, true}, {0, kPreceding, true}}; + const auto frame_ends = + std::vector{{2, kFollowing, false}, {0, kFollowing, true}, {0, kCurrentRow, false}}; + + for (auto bound_index = size_t{0}; bound_index < frame_starts.size(); ++bound_index) { + stmt = (SelectStatement*)result.getStatement(2 + bound_index); + const auto& expected_start = frame_starts[bound_index]; + const auto& expected_end = frame_ends[bound_index]; + + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_TRUE(stmt->fromTable); + ASSERT_EQ(stmt->fromTable->type, kTableName); + ASSERT_STREQ(stmt->fromTable->name, "t"); + + ASSERT_EQ(stmt->selectList->at(0)->type, kExprFunctionRef); + ASSERT_STREQ(stmt->selectList->at(0)->name, "rank"); + ASSERT_TRUE(stmt->selectList->at(0)->exprList->empty()); + + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->partitionList); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->size(), 1); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->name, "t1"); + + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->size(), 1); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->type, kOrderAsc); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef); + ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->name, "t2"); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->offset, expected_start.offset); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->type, expected_start.type); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->unbounded, expected_start.unbounded); + ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->end); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->offset, expected_end.offset); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->type, expected_end.type); + ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded, expected_end.unbounded); + } +} + +TEST(FunctionSchema) { + TEST_PARSE_SQL_QUERY( + "SELECT sys.uuid();" + "SELECT json.isarray('[1, 2, 3]');", + result, 2); + + auto stmt = (SelectStatement*)result.getStatement(0); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_STREQ(stmt->selectList->at(0)->schema, "sys"); + ASSERT_STREQ(stmt->selectList->at(0)->name, "uuid"); + ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 0); + + stmt = (SelectStatement*)result.getStatement(1); + ASSERT_TRUE(stmt->selectList); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_STREQ(stmt->selectList->at(0)->schema, "json"); + ASSERT_STREQ(stmt->selectList->at(0)->name, "isarray"); + ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 1); + ASSERT_STREQ(stmt->selectList->at(0)->exprList->at(0)->name, "[1, 2, 3]"); +} + +} // namespace hsql diff --git a/extern/hyrise_sql_parser/test/sql_asserts.h b/extern/hyrise_sql_parser/test/sql_asserts.h new file mode 100644 index 0000000000..aa493bbad3 --- /dev/null +++ b/extern/hyrise_sql_parser/test/sql_asserts.h @@ -0,0 +1,19 @@ +#ifndef __HELPER_H__ +#define __HELPER_H__ + +#define TEST_PARSE_SQL_QUERY(query, result, numStatements) \ + hsql::SQLParserResult result; \ + hsql::SQLParser::parse(query, &result); \ + ASSERT(result.isValid()); \ + ASSERT_EQ(result.size(), numStatements) + +#define TEST_PARSE_SINGLE_SQL(query, stmtType, stmtClass, result, outputVar) \ + TEST_PARSE_SQL_QUERY(query, result, 1); \ + ASSERT_EQ(result.getStatement(0)->type(), stmtType); \ + const stmtClass* outputVar = (const stmtClass*)result.getStatement(0) + +#define TEST_CAST_STMT(result, stmt_index, stmtType, stmtClass, outputVar) \ + ASSERT_EQ(result.getStatement(stmt_index)->type(), stmtType); \ + const stmtClass* outputVar = (const stmtClass*)result.getStatement(stmt_index) + +#endif diff --git a/extern/hyrise_sql_parser/test/sql_parser.cpp b/extern/hyrise_sql_parser/test/sql_parser.cpp new file mode 100644 index 0000000000..31b9be1f9a --- /dev/null +++ b/extern/hyrise_sql_parser/test/sql_parser.cpp @@ -0,0 +1,44 @@ +#include "thirdparty/microtest/microtest.h" + +#include +#include +#include + +#include "SQLParser.h" +#include "parser/bison_parser.h" +#include "sql_asserts.h" + +using namespace hsql; + +void test_tokens(const std::string& query, const std::vector& expected_tokens) { + std::vector tokens; + ASSERT(SQLParser::tokenize(query, &tokens)); + + ASSERT_EQ(expected_tokens.size(), tokens.size()); + + for (unsigned i = 0; i < expected_tokens.size(); ++i) { + ASSERT_EQ(expected_tokens[i], tokens[i]); + } +} + +TEST(SQLParserTokenizeTest) { + test_tokens("SELECT * FROM test;", {SQL_SELECT, '*', SQL_FROM, SQL_IDENTIFIER, ';'}); + test_tokens("SELECT a, 'b' FROM test WITH HINT;", + {SQL_SELECT, SQL_IDENTIFIER, ',', SQL_STRING, SQL_FROM, SQL_IDENTIFIER, SQL_WITH, SQL_HINT, ';'}); +} + +TEST(SQLParserTokenizeStringifyTest) { + const std::string query = "SELECT * FROM test;"; + std::vector tokens; + ASSERT(SQLParser::tokenize(query, &tokens)); + + // Make u16string. + std::u16string token_string(tokens.cbegin(), tokens.cend()); + + // Check if u16 string is cacheable. + std::map cache; + cache[token_string] = query; + + ASSERT(query == cache[token_string]); + ASSERT(&query != &cache[token_string]); +} diff --git a/extern/hyrise_sql_parser/test/sql_tests.cpp b/extern/hyrise_sql_parser/test/sql_tests.cpp new file mode 100644 index 0000000000..58264ba24d --- /dev/null +++ b/extern/hyrise_sql_parser/test/sql_tests.cpp @@ -0,0 +1,793 @@ +/* + * sql_tests.cpp + */ + +#include "thirdparty/microtest/microtest.h" + +#include "SQLParser.h" +#include "util/sqlhelper.h" + +#include "sql_asserts.h" + +namespace hsql { + +TEST(DeleteStatementTest) { + auto result = SQLParserResult{}; + SQLParser::parse("DELETE FROM students WHERE grade > 2.0;", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT(result.getStatement(0)->type() == kStmtDelete); + + const DeleteStatement* stmt = (const DeleteStatement*)result.getStatement(0); + ASSERT_STREQ(stmt->tableName, "students"); + ASSERT_NOTNULL(stmt->expr); + ASSERT(stmt->expr->isType(kExprOperator)); + ASSERT_STREQ(stmt->expr->expr->name, "grade"); + ASSERT_EQ(stmt->expr->expr2->fval, 2.0); +} + +TEST(CreateStatementTest) { + auto result = SQLParserResult{}; + SQLParser::parse( + "CREATE TABLE dummy_table (" + " c_bigint BIGINT, " + " c_boolean BOOLEAN, " + " c_char CHAR(42), " + " c_date DATE, " + " c_datetime DATETIME, " + " c_decimal DECIMAL, " + " c_decimal_precision DECIMAL(13), " + " c_decimal_precision_scale DECIMAL(13,37), " + " c_double_not_null DOUBLE NOT NULL, " + " c_float FLOAT, " + " c_int INT, " + " PRIMARY KEY(c_char, c_int), " + " c_integer_null INTEGER NULL, " + " c_long LONG, " + " c_real REAL, " + " c_smallint SMALLINT, " + " c_text TEXT UNIQUE PRIMARY KEY NOT NULL, " + " c_time TIME, " + " c_time_precision TIME(17), " + " c_timestamp TIMESTAMP, " + " c_varchar VARCHAR(50), " + " c_char_varying CHARACTER VARYING(60)" + ")", + &result); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); + + const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); + ASSERT_EQ(stmt->type, kCreateTable); + ASSERT_STREQ(stmt->tableName, "dummy_table"); + ASSERT_NOTNULL(stmt->columns); + ASSERT_EQ(stmt->columns->size(), 21); + // c_bigint BIGINT + ASSERT_STREQ(stmt->columns->at(0)->name, "c_bigint"); + ASSERT_EQ(stmt->columns->at(0)->type, (ColumnType{DataType::BIGINT})); + ASSERT_EQ(stmt->columns->at(0)->nullable, true); + // c_boolean BOOLEAN + ASSERT_STREQ(stmt->columns->at(1)->name, "c_boolean"); + ASSERT_EQ(stmt->columns->at(1)->type, (ColumnType{DataType::BOOLEAN})); + ASSERT_EQ(stmt->columns->at(1)->nullable, true); + // c_char CHAR(42) + ASSERT_STREQ(stmt->columns->at(2)->name, "c_char"); + ASSERT_EQ(stmt->columns->at(2)->type, (ColumnType{DataType::CHAR, 42})); + ASSERT_NEQ(stmt->columns->at(2)->type, (ColumnType{DataType::CHAR, 43})); + ASSERT_EQ(stmt->columns->at(2)->nullable, true); + // c_date DATE + ASSERT_STREQ(stmt->columns->at(3)->name, "c_date"); + ASSERT_EQ(stmt->columns->at(3)->type, (ColumnType{DataType::DATE})); + ASSERT_EQ(stmt->columns->at(3)->nullable, true); + // c_datetime DATETIME + ASSERT_STREQ(stmt->columns->at(4)->name, "c_datetime"); + ASSERT_EQ(stmt->columns->at(4)->type, (ColumnType{DataType::DATETIME})); + ASSERT_EQ(stmt->columns->at(4)->nullable, true); + // c_decimal DECIMAL + ASSERT_STREQ(stmt->columns->at(5)->name, "c_decimal"); + ASSERT_EQ(stmt->columns->at(5)->type, (ColumnType{DataType::DECIMAL})); + ASSERT_EQ(stmt->columns->at(5)->nullable, true); + // c_decimal_precision DECIMAL(13) + ASSERT_STREQ(stmt->columns->at(6)->name, "c_decimal_precision"); + ASSERT_EQ(stmt->columns->at(6)->type, (ColumnType{DataType::DECIMAL, 0, 13})); + ASSERT_NEQ(stmt->columns->at(6)->type, (ColumnType{DataType::DECIMAL, 0, 14})); + ASSERT_NEQ(stmt->columns->at(6)->type, (ColumnType{DataType::DECIMAL, 1, 13})); + ASSERT_EQ(stmt->columns->at(6)->nullable, true); + // c_decimal_precision_scale DECIMAL(13,37) + ASSERT_STREQ(stmt->columns->at(7)->name, "c_decimal_precision_scale"); + ASSERT_EQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 0, 13, 37})); + ASSERT_NEQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 0, 14, 37})); + ASSERT_NEQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 0, 13, 38})); + ASSERT_NEQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 1, 13, 37})); + ASSERT_EQ(stmt->columns->at(7)->nullable, true); + // c_double_not_null DOUBLE NOT NULL + ASSERT_STREQ(stmt->columns->at(8)->name, "c_double_not_null"); + ASSERT_EQ(stmt->columns->at(8)->type, (ColumnType{DataType::DOUBLE})); + ASSERT_EQ(stmt->columns->at(8)->nullable, false); + ASSERT_EQ(stmt->columns->at(8)->column_constraints->size(), 1); + ASSERT(stmt->columns->at(8)->column_constraints->count(ConstraintType::NotNull)); + // c_float FLOAT + ASSERT_STREQ(stmt->columns->at(9)->name, "c_float"); + ASSERT_EQ(stmt->columns->at(9)->type, (ColumnType{DataType::FLOAT})); + ASSERT_EQ(stmt->columns->at(9)->nullable, true); + // c_int INT + ASSERT_STREQ(stmt->columns->at(10)->name, "c_int"); + ASSERT_EQ(stmt->columns->at(10)->type, (ColumnType{DataType::INT})); + ASSERT_EQ(stmt->columns->at(10)->nullable, true); + // c_integer INTEGER NULL + ASSERT_STREQ(stmt->columns->at(11)->name, "c_integer_null"); + ASSERT_EQ(stmt->columns->at(11)->type, (ColumnType{DataType::INT})); + ASSERT_EQ(stmt->columns->at(11)->nullable, true); + ASSERT_EQ(stmt->columns->at(11)->column_constraints->size(), 1); + ASSERT(stmt->columns->at(11)->column_constraints->count(ConstraintType::Null)); + // c_long LONG + ASSERT_STREQ(stmt->columns->at(12)->name, "c_long"); + ASSERT_EQ(stmt->columns->at(12)->type, (ColumnType{DataType::LONG})); + ASSERT_EQ(stmt->columns->at(12)->nullable, true); + // c_real REAL + ASSERT_STREQ(stmt->columns->at(13)->name, "c_real"); + ASSERT_EQ(stmt->columns->at(13)->type, (ColumnType{DataType::REAL})); + ASSERT_EQ(stmt->columns->at(13)->nullable, true); + // c_smallint SMALLINT + ASSERT_STREQ(stmt->columns->at(14)->name, "c_smallint"); + ASSERT_EQ(stmt->columns->at(14)->type, (ColumnType{DataType::SMALLINT})); + ASSERT_EQ(stmt->columns->at(14)->nullable, true); + // c_text TEXT UNIQUE PRIMARY KEY NOT NULL + ASSERT_STREQ(stmt->columns->at(15)->name, "c_text"); + ASSERT_EQ(stmt->columns->at(15)->type, (ColumnType{DataType::TEXT})); + ASSERT_EQ(stmt->columns->at(15)->nullable, false); + // Expecting two elements in column_constraints since information about NULL constraints is separately stored in + // ColumnDefinition::nullable + ASSERT_EQ(stmt->columns->at(15)->column_constraints->size(), 3); + ASSERT(stmt->columns->at(15)->column_constraints->count(ConstraintType::Unique)); + ASSERT(stmt->columns->at(15)->column_constraints->count(ConstraintType::PrimaryKey)); + ASSERT(stmt->columns->at(15)->column_constraints->count(ConstraintType::NotNull)); + // c_time TIME + ASSERT_STREQ(stmt->columns->at(16)->name, "c_time"); + ASSERT_EQ(stmt->columns->at(16)->type, (ColumnType{DataType::TIME})); + ASSERT_EQ(stmt->columns->at(16)->nullable, true); + // c_time_precision TIME(17) + ASSERT_STREQ(stmt->columns->at(17)->name, "c_time_precision"); + ASSERT_EQ(stmt->columns->at(17)->type, (ColumnType{DataType::TIME, 0, 17})); + ASSERT_NEQ(stmt->columns->at(17)->type, (ColumnType{DataType::TIME, 0, 18})); + ASSERT_NEQ(stmt->columns->at(17)->type, (ColumnType{DataType::TIME, 1, 17})); + ASSERT_EQ(stmt->columns->at(17)->nullable, true); + // c_timestamp TIMESTAMP + ASSERT_STREQ(stmt->columns->at(18)->name, "c_timestamp"); + ASSERT_EQ(stmt->columns->at(18)->type, (ColumnType{DataType::DATETIME})); + ASSERT_EQ(stmt->columns->at(18)->nullable, true); + // c_varchar VARCHAR(50) + ASSERT_STREQ(stmt->columns->at(19)->name, "c_varchar"); + ASSERT_EQ(stmt->columns->at(19)->type, (ColumnType{DataType::VARCHAR, 50})); + ASSERT_NEQ(stmt->columns->at(19)->type, (ColumnType{DataType::VARCHAR, 51})); + ASSERT_EQ(stmt->columns->at(19)->nullable, true); + // c_char_varying CHARACTER VARYING(60) + ASSERT_STREQ(stmt->columns->at(20)->name, "c_char_varying"); + ASSERT_EQ(stmt->columns->at(20)->type, (ColumnType{DataType::VARCHAR, 60})); + ASSERT_NEQ(stmt->columns->at(20)->type, (ColumnType{DataType::VARCHAR, 61})); + // Table constraints are identified and separated during the parsing of the SQL string + // Table constraints: + // - PRIMARY KEY(c_char, c_int) + ASSERT_EQ(stmt->tableConstraints->size(), 1); + ASSERT(stmt->tableConstraints->at(0)->type == ConstraintType::PrimaryKey); + ASSERT_STREQ(stmt->tableConstraints->at(0)->columnNames->at(0), "c_char"); + ASSERT_STREQ(stmt->tableConstraints->at(0)->columnNames->at(1), "c_int"); +} + +TEST(CreateStatementForeignKeyTest) { + auto result = SQLParserResult{}; + SQLParser::parse( + "CREATE TABLE foo (a int, b int REFERENCES bar.baz (x)); " + "CREATE TABLE foo (a int, b int, FOREIGN KEY (a, b) REFERENCES bar.baz (x, y)); " + "CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES baz)", + &result); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 3); + ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); + const auto* stmt = (const CreateStatement*)result.getStatement(0); + // We focus on the correct parsing of the FKs here. The remaining functionality is tested in CreateStatementTest. + ASSERT_EQ(stmt->type, kCreateTable); + ASSERT_TRUE(stmt->tableConstraints->empty()); + ASSERT_TRUE(stmt->columns); + ASSERT_EQ(stmt->columns->size(), 2); + ASSERT_TRUE(stmt->columns->at(1)); + ASSERT_STREQ(stmt->columns->at(1)->name, "b"); + ASSERT_TRUE(stmt->columns->at(1)->references); + ASSERT_EQ(stmt->columns->at(1)->references->size(), 1); + ASSERT_STREQ(stmt->columns->at(1)->references->at(0)->schema, "bar"); + ASSERT_STREQ(stmt->columns->at(1)->references->at(0)->table, "baz"); + ASSERT_TRUE(stmt->columns->at(1)->references->at(0)->columns); + ASSERT_EQ(stmt->columns->at(1)->references->at(0)->columns->size(), 1); + ASSERT_STREQ(stmt->columns->at(1)->references->at(0)->columns->at(0), "x"); + + ASSERT_EQ(result.getStatement(1)->type(), kStmtCreate); + stmt = (const CreateStatement*)result.getStatement(1); + ASSERT_EQ(stmt->type, kCreateTable); + ASSERT_TRUE(stmt->tableConstraints); + ASSERT_EQ(stmt->tableConstraints->size(), 1); + ASSERT_EQ(stmt->tableConstraints->at(0)->type, ConstraintType::ForeignKey); + const auto* foreign_key = (const ForeignKeyConstraint*)stmt->tableConstraints->at(0); + ASSERT_TRUE(foreign_key->columnNames); + ASSERT_EQ(foreign_key->columnNames->size(), 2); + ASSERT_STREQ(foreign_key->columnNames->at(0), "a"); + ASSERT_STREQ(foreign_key->columnNames->at(1), "b"); + ASSERT_TRUE(foreign_key->references); + ASSERT_STREQ(foreign_key->references->schema, "bar"); + ASSERT_STREQ(foreign_key->references->table, "baz"); + ASSERT_TRUE(foreign_key->references->columns); + ASSERT_EQ(foreign_key->references->columns->size(), 2); + ASSERT_STREQ(foreign_key->references->columns->at(0), "x"); + ASSERT_STREQ(foreign_key->references->columns->at(1), "y"); + + ASSERT_EQ(result.getStatement(2)->type(), kStmtCreate); + stmt = (const CreateStatement*)result.getStatement(2); + ASSERT_EQ(stmt->type, kCreateTable); + ASSERT_TRUE(stmt->tableConstraints); + ASSERT_EQ(stmt->tableConstraints->size(), 1); + ASSERT_EQ(stmt->tableConstraints->at(0)->type, ConstraintType::ForeignKey); + foreign_key = (const ForeignKeyConstraint*)stmt->tableConstraints->at(0); + ASSERT_TRUE(foreign_key->columnNames); + printf("%zu\n", foreign_key->columnNames->size()); + ASSERT_EQ(foreign_key->columnNames->size(), 1); + ASSERT_STREQ(foreign_key->columnNames->at(0), "b"); + ASSERT_TRUE(foreign_key->references); + ASSERT_FALSE(foreign_key->references->schema); + ASSERT_STREQ(foreign_key->references->table, "baz"); + ASSERT_FALSE(foreign_key->references->columns); +} + +TEST(CreateAsSelectStatementTest) { + auto result = SQLParserResult{}; + SQLParser::parse("CREATE TABLE students_2 AS SELECT student_number, grade FROM students", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); + + const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); + ASSERT_EQ(stmt->type, kCreateTable); + ASSERT_STREQ(stmt->tableName, "students_2"); + ASSERT_NULL(stmt->columns); + ASSERT_NOTNULL(stmt->select); + ASSERT(stmt->select->selectList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->select->selectList->at(0)->getName(), "student_number"); + ASSERT(stmt->select->selectList->at(1)->isType(kExprColumnRef)); + ASSERT_STREQ(stmt->select->selectList->at(1)->getName(), "grade"); +} + +TEST(UpdateStatementTest) { + auto result = SQLParserResult{}; + SQLParser::parse("UPDATE students SET grade = 5.0, name = 'test' WHERE name = 'Max O''Mustermann';", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + ASSERT_EQ(result.getStatement(0)->type(), kStmtUpdate); + + const UpdateStatement* stmt = (const UpdateStatement*)result.getStatement(0); + ASSERT_NOTNULL(stmt->table); + ASSERT_STREQ(stmt->table->name, "students"); + + ASSERT_NOTNULL(stmt->updates); + ASSERT_EQ(stmt->updates->size(), 2); + ASSERT_STREQ(stmt->updates->at(0)->column, "grade"); + ASSERT_STREQ(stmt->updates->at(1)->column, "name"); + ASSERT(stmt->updates->at(0)->value->isType(kExprLiteralFloat)); + ASSERT(stmt->updates->at(1)->value->isType(kExprLiteralString)); + ASSERT_EQ(stmt->updates->at(0)->value->fval, 5.0); + ASSERT_STREQ(stmt->updates->at(1)->value->name, "test"); + + ASSERT_NOTNULL(stmt->where); + ASSERT(stmt->where->isType(kExprOperator)); + ASSERT_EQ(stmt->where->opType, kOpEquals); + ASSERT_STREQ(stmt->where->expr->name, "name"); + ASSERT_STREQ(stmt->where->expr2->name, "Max O'Mustermann"); +} + +TEST(InsertStatementTest) { + TEST_PARSE_SINGLE_SQL( + "INSERT INTO students VALUES ('Max Mustermann', 12345, 'Musterhausen', 2.0, -1, 1 month, " + " CAST('2000-02-02' AS DATE), - INTERVAL '3 seconds', DATE '2000-02-02', FALSE, NULL)", + kStmtInsert, InsertStatement, result, stmt); + + ASSERT_EQ(stmt->values->size(), 11); + ASSERT_EQ(stmt->values->at(0)->type, kExprLiteralString); + ASSERT_STREQ(stmt->values->at(0)->name, "Max Mustermann"); + ASSERT_EQ(stmt->values->at(1)->type, kExprLiteralInt); + ASSERT_EQ(stmt->values->at(1)->ival, 12345); + ASSERT_EQ(stmt->values->at(2)->type, kExprLiteralString); + ASSERT_STREQ(stmt->values->at(2)->name, "Musterhausen"); + ASSERT_EQ(stmt->values->at(3)->type, kExprLiteralFloat); + ASSERT_EQ(stmt->values->at(3)->fval, 2.0); + ASSERT_EQ(stmt->values->at(4)->type, kExprOperator); + ASSERT_EQ(stmt->values->at(4)->opType, kOpUnaryMinus); + ASSERT(stmt->values->at(4)->expr); + ASSERT_EQ(stmt->values->at(4)->expr->type, kExprLiteralInt); + ASSERT_EQ(stmt->values->at(4)->expr->ival, 1); + ASSERT_EQ(stmt->values->at(5)->type, kExprLiteralInterval); + ASSERT_EQ(stmt->values->at(5)->ival, 1); + ASSERT_EQ(stmt->values->at(5)->datetimeField, kDatetimeMonth); + ASSERT_EQ(stmt->values->at(6)->type, kExprCast); + ASSERT_EQ(stmt->values->at(6)->columnType, ColumnType{DataType::DATE}); + ASSERT(stmt->values->at(6)->expr); + ASSERT_EQ(stmt->values->at(6)->expr->type, kExprLiteralString); + ASSERT_STREQ(stmt->values->at(6)->expr->name, "2000-02-02"); + ASSERT_EQ(stmt->values->at(7)->type, kExprOperator); + ASSERT_EQ(stmt->values->at(7)->opType, kOpUnaryMinus); + ASSERT(stmt->values->at(7)->expr); + ASSERT_EQ(stmt->values->at(7)->expr->type, kExprLiteralInterval); + ASSERT_EQ(stmt->values->at(7)->expr->ival, 3); + ASSERT_EQ(stmt->values->at(7)->expr->datetimeField, kDatetimeSecond); + ASSERT_EQ(stmt->values->at(8)->type, kExprLiteralDate); + ASSERT_STREQ(stmt->values->at(8)->name, "2000-02-02"); + ASSERT_EQ(stmt->values->at(9)->type, kExprLiteralInt); + ASSERT_EQ(stmt->values->at(9)->ival, 0); + ASSERT_TRUE(stmt->values->at(9)->isBoolLiteral); + ASSERT_EQ(stmt->values->at(10)->type, kExprLiteralNull); +} + +TEST(AlterStatementDropActionTest) { + auto result = SQLParserResult{}; + SQLParser::parse("ALTER TABLE mytable DROP COLUMN IF EXISTS mycolumn", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + + const AlterStatement* stmt = (const AlterStatement*)result.getStatement(0); + ASSERT_STREQ(stmt->name, "mytable"); + ASSERT_EQ(stmt->ifTableExists, false); + + auto dropAction = (const DropColumnAction*)stmt->action; + + ASSERT_EQ(dropAction->type, ActionType::DropColumn); + ASSERT_STREQ(dropAction->columnName, "mycolumn"); +} + +TEST(CreateIndexStatementTest) { + auto result = SQLParserResult{}; + SQLParser::parse("CREATE INDEX myindex ON myTable (col1);", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + + const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); + ASSERT_STREQ(stmt->indexName, "myindex"); + ASSERT_STREQ(stmt->tableName, "myTable"); + ASSERT_EQ(stmt->type, kCreateIndex); + ASSERT_EQ(stmt->ifNotExists, false); + ASSERT_EQ(stmt->indexColumns->size(), 1); +} + +TEST(CreateIndexStatementIfNotExistsTest) { + auto result = SQLParserResult{}; + SQLParser::parse("CREATE INDEX IF NOT EXISTS myindex ON myTable (col1, col2);", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + + const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); + ASSERT_STREQ(stmt->indexName, "myindex"); + ASSERT_STREQ(stmt->tableName, "myTable"); + ASSERT_EQ(stmt->type, kCreateIndex); + ASSERT_EQ(stmt->ifNotExists, true); + ASSERT_EQ(stmt->indexColumns->size(), 2); +} + +TEST(DropIndexTest) { + auto result = SQLParserResult{}; + SQLParser::parse("DROP INDEX myindex", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + + const DropStatement* stmt = (const DropStatement*)result.getStatement(0); + ASSERT_STREQ(stmt->indexName, "myindex"); + ASSERT_EQ(stmt->ifExists, false); +} + +TEST(DropIndexIfExistsTest) { + auto result = SQLParserResult{}; + SQLParser::parse("DROP INDEX IF EXISTS myindex", &result); + + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + + const DropStatement* stmt = (const DropStatement*)result.getStatement(0); + ASSERT_STREQ(stmt->indexName, "myindex"); + ASSERT_EQ(stmt->ifExists, true); +} + +TEST(DropTableStatementTest) { + TEST_PARSE_SINGLE_SQL("DROP TABLE students", kStmtDrop, DropStatement, result, stmt); + + ASSERT_FALSE(stmt->ifExists); + ASSERT_EQ(stmt->type, kDropTable); + ASSERT_NOTNULL(stmt->name); + ASSERT_STREQ(stmt->name, "students"); +} + +TEST(DropTableIfExistsStatementTest) { + TEST_PARSE_SINGLE_SQL("DROP TABLE IF EXISTS students", kStmtDrop, DropStatement, result, stmt); + + ASSERT_TRUE(stmt->ifExists); + ASSERT_EQ(stmt->type, kDropTable); + ASSERT_NOTNULL(stmt->name); + ASSERT_STREQ(stmt->name, "students"); +} + +TEST(ReleaseStatementTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students;", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_EQ(1, result.size()); + ASSERT_NULL(stmt->whereClause); + + std::vector statements = result.releaseStatements(); + + ASSERT_EQ(0, result.size()); + + for (SQLStatement* stmt : statements) { + delete stmt; + } +} + +TEST(ShowTableStatementTest) { + TEST_PARSE_SINGLE_SQL("SHOW TABLES;", kStmtShow, ShowStatement, result, stmt); + + ASSERT_EQ(stmt->type, kShowTables); + ASSERT_NULL(stmt->name); +} + +TEST(ShowColumnsStatementTest) { + TEST_PARSE_SINGLE_SQL("SHOW COLUMNS students;", kStmtShow, ShowStatement, result, stmt); + + ASSERT_EQ(stmt->type, kShowColumns); + ASSERT_NOTNULL(stmt->name); + ASSERT_STREQ(stmt->name, "students"); +} + +TEST(DescribeStatementTest) { + TEST_PARSE_SINGLE_SQL("DESCRIBE students;", kStmtShow, ShowStatement, result, stmt); + + ASSERT_EQ(stmt->type, kShowColumns); + ASSERT_NOTNULL(stmt->name); + ASSERT_STREQ(stmt->name, "students"); +} + +TEST(ImportStatementTest) { + TEST_PARSE_SINGLE_SQL("IMPORT FROM TBL FILE 'students_file' INTO students;", kStmtImport, ImportStatement, result, + stmt); + + ASSERT_EQ(stmt->type, kImportTbl); + ASSERT_NOTNULL(stmt->tableName); + ASSERT_STREQ(stmt->tableName, "students"); + ASSERT_STREQ(stmt->filePath, "students_file"); + ASSERT_NULL(stmt->encoding); +} + +TEST(CopyStatementTest) { + TEST_PARSE_SINGLE_SQL("COPY students FROM 'students_file' WITH (FORMAT CSV, DELIMITER '|', NULL '', QUOTE '\"');", + kStmtImport, ImportStatement, import_result, import_stmt); + + ASSERT_EQ(import_stmt->type, kImportCSV); + ASSERT_NOTNULL(import_stmt->tableName); + ASSERT_STREQ(import_stmt->tableName, "students"); + ASSERT_NOTNULL(import_stmt->filePath); + ASSERT_STREQ(import_stmt->filePath, "students_file"); + ASSERT_NULL(import_stmt->whereClause); + ASSERT_NULL(import_stmt->encoding); + ASSERT_NOTNULL(import_stmt->csv_options); + ASSERT_NOTNULL(import_stmt->csv_options->delimiter); + ASSERT_STREQ(import_stmt->csv_options->delimiter, "|"); + ASSERT_NOTNULL(import_stmt->csv_options->null); + ASSERT_STREQ(import_stmt->csv_options->null, ""); + ASSERT_NOTNULL(import_stmt->csv_options->quote); + ASSERT_STREQ(import_stmt->csv_options->quote, "\""); + + TEST_PARSE_SINGLE_SQL("COPY students FROM 'students_file' WHERE lastname = 'Potter';", kStmtImport, ImportStatement, + import_filter_result, import_filter_stmt); + + ASSERT_EQ(import_filter_stmt->type, kImportAuto); + ASSERT_NOTNULL(import_filter_stmt->tableName); + ASSERT_STREQ(import_filter_stmt->tableName, "students"); + ASSERT_NOTNULL(import_filter_stmt->filePath); + ASSERT_STREQ(import_filter_stmt->filePath, "students_file"); + ASSERT_NOTNULL(import_filter_stmt->whereClause); + ASSERT_EQ(import_filter_stmt->whereClause->opType, kOpEquals); + ASSERT_EQ(import_filter_stmt->whereClause->expr->type, kExprColumnRef); + ASSERT_STREQ(import_filter_stmt->whereClause->expr->name, "lastname"); + ASSERT_EQ(import_filter_stmt->whereClause->expr2->type, kExprLiteralString); + ASSERT_STREQ(import_filter_stmt->whereClause->expr2->name, "Potter"); + ASSERT_NULL(import_filter_stmt->encoding); + ASSERT_NULL(import_filter_stmt->csv_options); + + TEST_PARSE_SINGLE_SQL("COPY students TO 'students_file' WITH (ENCODING 'FSST', FORMAT BINARY);", kStmtExport, + ExportStatement, export_table_result, export_table_stmt); + + ASSERT_EQ(export_table_stmt->type, kImportBinary); + ASSERT_NOTNULL(export_table_stmt->tableName); + ASSERT_STREQ(export_table_stmt->tableName, "students"); + ASSERT_NOTNULL(export_table_stmt->filePath); + ASSERT_STREQ(export_table_stmt->filePath, "students_file"); + ASSERT_NULL(export_table_stmt->select); + ASSERT_STREQ(export_table_stmt->encoding, "FSST"); + ASSERT_NULL(export_table_stmt->csv_options); + + TEST_PARSE_SINGLE_SQL( + "COPY (SELECT firstname, lastname FROM students) TO 'students_file' WITH (ENCODING 'Dictionary');", kStmtExport, + ExportStatement, export_select_result, export_select_stmt); + + ASSERT_EQ(export_select_stmt->type, kImportAuto); + ASSERT_NULL(export_select_stmt->tableName); + ASSERT_NOTNULL(export_select_stmt->filePath); + ASSERT_STREQ(export_select_stmt->filePath, "students_file"); + ASSERT_STREQ(export_select_stmt->encoding, "Dictionary"); + ASSERT_NULL(export_select_stmt->csv_options); + + ASSERT_NOTNULL(export_select_stmt->select); + const auto& select_stmt = export_select_stmt->select; + ASSERT_NULL(select_stmt->whereClause); + ASSERT_NULL(select_stmt->groupBy); + ASSERT_EQ(select_stmt->selectList->size(), 2); + ASSERT(select_stmt->selectList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(select_stmt->selectList->at(0)->getName(), "firstname"); + ASSERT(select_stmt->selectList->at(1)->isType(kExprColumnRef)); + ASSERT_STREQ(select_stmt->selectList->at(1)->getName(), "lastname"); + ASSERT_NOTNULL(select_stmt->fromTable); + ASSERT_STREQ(select_stmt->fromTable->name, "students"); +} + +SQLParserResult parse_and_move(std::string query) { + auto result = SQLParserResult{}; + SQLParser::parse(query, &result); + // Moves on return. + return result; +} + +SQLParserResult move_in_and_back(SQLParserResult res) { + // Moves on return. + return res; +} + +TEST(MoveSQLResultTest) { + auto res = parse_and_move("SELECT * FROM test;"); + ASSERT(res.isValid()); + ASSERT_EQ(1, res.size()); + + // Moved around. + auto new_res = move_in_and_back(std::move(res)); + + // Original object should be invalid. + ASSERT_FALSE(res.isValid()); + ASSERT_EQ(0, res.size()); + + ASSERT(new_res.isValid()); + ASSERT_EQ(1, new_res.size()); +} + +TEST(HintTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students WITH HINT(NO_CACHE, SAMPLE_RATE(10));", kStmtSelect, SelectStatement, + result, stmt); + + ASSERT_NOTNULL(stmt->hints); + ASSERT_EQ(2, stmt->hints->size()); + ASSERT_STREQ("NO_CACHE", stmt->hints->at(0)->name); + ASSERT_STREQ("SAMPLE_RATE", stmt->hints->at(1)->name); + ASSERT_EQ(1, stmt->hints->at(1)->exprList->size()); + ASSERT_EQ(10, stmt->hints->at(1)->exprList->at(0)->ival); +} + +TEST(StringLengthTest) { + TEST_PARSE_SQL_QUERY("SELECT * FROM bar; INSERT INTO foo VALUES (4);\t\n SELECT * FROM foo;", result, 3); + + ASSERT_EQ(result.getStatement(0)->stringLength, 18); + ASSERT_EQ(result.getStatement(1)->stringLength, 28); + ASSERT_EQ(result.getStatement(2)->stringLength, 21); +} + +TEST(ExceptOperatorTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students EXCEPT SELECT * FROM students_2;", kStmtSelect, SelectStatement, result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); +} + +TEST(IntersectOperatorTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students INTERSECT SELECT * FROM students_2;", kStmtSelect, SelectStatement, + result, stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetIntersect); +} + +TEST(UnionOperatorTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students UNION SELECT * FROM students_2;", kStmtSelect, SelectStatement, result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetUnion); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(UnionAllOperatorTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students UNION ALL SELECT * FROM students_2;", kStmtSelect, SelectStatement, + result, stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_TRUE(stmt->setOperations->back()->isAll); +} + +TEST(NestedSetOperationTest) { + TEST_PARSE_SINGLE_SQL("SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees;", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_STREQ( + stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->nestedSelectStatement->fromTable->name, + "employees"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetIntersect); + ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->setType, kSetUnion); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(OrderByFullStatementTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees ORDER BY grade ASC;", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(SetOperationSubQueryOrder) { + TEST_PARSE_SINGLE_SQL( + "(SELECT * FROM students ORDER BY name DESC) INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM " + "employees ORDER BY grade ASC;", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_EQ(stmt->order->at(0)->type, kOrderDesc); + ASSERT_STREQ(stmt->order->at(0)->expr->name, "name"); + + ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(SetOperationLastSubQueryOrder) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION (SELECT * FROM employees ORDER BY name " + "DESC) ORDER BY grade ASC;", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_EQ(stmt->setOperations->back() + ->nestedSelectStatement->setOperations->back() + ->nestedSelectStatement->order->at(0) + ->type, + kOrderDesc); + ASSERT_STREQ(stmt->setOperations->back() + ->nestedSelectStatement->setOperations->back() + ->nestedSelectStatement->order->at(0) + ->expr->name, + "name"); + + ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(NestedDifferentSetOperationsWithWithClause) { + TEST_PARSE_SINGLE_SQL( + "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM C", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_STREQ(stmt->withDescriptions->back()->alias, "UNION_FIRST"); + ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetUnion); + ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "A"); + ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, + "B"); + + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); + ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "C"); +} + +TEST(NestedAllSetOperationsWithWithClause) { + TEST_PARSE_SINGLE_SQL( + "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM " + "(SELECT * FROM C INTERSECT SELECT * FROM D)", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_STREQ(stmt->withDescriptions->back()->alias, "UNION_FIRST"); + ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetUnion); + ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "A"); + ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, + "B"); + + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); + ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); + ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->setOperations->back()->setType, + kSetIntersect); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->fromTable->name, "C"); + ASSERT_STREQ(stmt->setOperations->back() + ->nestedSelectStatement->fromTable->select->setOperations->back() + ->nestedSelectStatement->fromTable->name, + "D"); +} + +TEST(NestedSetOperationsWithMultipleWithClauses) { + TEST_PARSE_SINGLE_SQL( + "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B),INTERSECT_SECOND AS (SELECT * FROM UNION_FIRST " + "INTERSECT SELECT * FROM C) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM INTERSECT_SECOND", + kStmtSelect, SelectStatement, result, stmt); + + ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "UNION_FIRST"); + ASSERT_STREQ(stmt->withDescriptions->back()->alias, "INTERSECT_SECOND"); + + ASSERT_EQ(stmt->withDescriptions->at(0)->select->setOperations->back()->setType, kSetUnion); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, "A"); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->setOperations->back()->nestedSelectStatement->fromTable->name, + "B"); + + ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetIntersect); + ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "UNION_FIRST"); + ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, + "C"); + + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); + ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "INTERSECT_SECOND"); +} + +TEST(WrongOrderByStatementTest) { + auto res = parse_and_move("SELECT * FROM students ORDER BY name INTERSECT SELECT grade FROM students_2;"); + ASSERT_FALSE(res.isValid()); +} + +TEST(BeginTransactionTest) { + { + TEST_PARSE_SINGLE_SQL("BEGIN TRANSACTION;", kStmtTransaction, TransactionStatement, transaction_result, + transaction_stmt); + + ASSERT_EQ(transaction_stmt->command, kBeginTransaction); + } + + { + TEST_PARSE_SINGLE_SQL("BEGIN;", kStmtTransaction, TransactionStatement, transaction_result, transaction_stmt); + + ASSERT_EQ(transaction_stmt->command, kBeginTransaction); + } +} + +TEST(RollbackTransactionTest) { + TEST_PARSE_SINGLE_SQL("ROLLBACK TRANSACTION;", kStmtTransaction, TransactionStatement, transaction_result, + transaction_stmt); + + ASSERT_EQ(transaction_stmt->command, kRollbackTransaction); +} + +TEST(CommitTransactionTest) { + TEST_PARSE_SINGLE_SQL("COMMIT TRANSACTION;", kStmtTransaction, TransactionStatement, transaction_result, + transaction_stmt); + + ASSERT_EQ(transaction_stmt->command, kCommitTransaction); +} + +TEST(CastAsType) { + TEST_PARSE_SINGLE_SQL("SELECT CAST(ID AS VARCHAR(8)) FROM TEST", kStmtSelect, SelectStatement, result, stmt); + + ASSERT_TRUE(result.isValid()); + ASSERT_EQ(stmt->selectList->size(), 1); + ASSERT_EQ(stmt->selectList->front()->columnType.data_type, DataType::VARCHAR); + ASSERT_EQ(stmt->selectList->front()->columnType.length, 8); +} + +} // namespace hsql + +TEST_MAIN(); diff --git a/extern/hyrise_sql_parser/test/test.sh b/extern/hyrise_sql_parser/test/test.sh new file mode 100644 index 0000000000..550f1bdb02 --- /dev/null +++ b/extern/hyrise_sql_parser/test/test.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# Has to be executed from the root of the repository. +# Usually invoked by `make test`. +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ + +# Colors +RED='\033[1;31m' +GREEN='\033[1;32m' +YELLOW='\033[1;33m' +NC='\033[0m' +BOLD='\033[1;39m' + +RET=0 +SQL_TEST_RET=1 +MEM_LEAK_EXECUTED=false +MEM_LEAK_RET=1 +CONFLICT_RET=1 + +################################################# +# Running SQL parser tests. +printf "\n${GREEN}Running SQL parser tests...${NC}\n" +bin/tests -f "test/queries/queries-good.sql" -f "test/queries/queries-bad.sql" +SQL_TEST_RET=$? + +if [ $SQL_TEST_RET -eq 0 ]; then + printf "${GREEN}SQL parser tests succeeded!${NC}\n" +else + printf "${RED}SQL parser tests failed!${NC}\n" +fi + +################################################# +# Running memory leak checks (only on Linux). +unamestr=$(uname) +if [[ "$unamestr" == 'Linux' ]]; then + printf "\n${GREEN}Running memory leak checks...${NC}\n" + valgrind --leak-check=full --error-exitcode=200 --log-fd=3 \ + bin/tests -f "test/queries/queries-good.sql" -f "test/queries/queries-bad.sql" \ + 3>&1>/dev/null; + + MEM_LEAK_RET=$? + MEM_LEAK_EXECUTED=true + + if [ $MEM_LEAK_RET -eq 0 ]; then + printf "${GREEN}Memory leak check succeeded!${NC}\n" + elif [ $MEM_LEAK_RET -eq 200 ]; then + printf "${RED}Memory leak check failed!${NC}\n" + elif [ $MEM_LEAK_RET -eq 127 ]; then + printf "${RED}Memory leak check failed: command 'valgrind' not found!${NC}\n" + else + printf "${RED}Memory leak check failed: error code ${MEM_LEAK_RET}!${NC}\n" + fi +else + printf "\n${YELLOW}Skipping memory leak checks (can only be executed on Linux)!${NC}\n" +fi + +################################################# +# Checking if the grammar is conflict free. +printf "\n${GREEN}Checking for conflicts in the grammar...${NC}\n" +printf "${RED}" +make -C src/parser/ test >>/dev/null +CONFLICT_RET=$? + +if [ $CONFLICT_RET -eq 0 ]; then + printf "${GREEN}Conflict check succeeded!${NC}\n" +else + printf "${RED}Conflict check failed!${NC}\n" +fi + +# Print a summary of the test results. +printf " +---------------------------------- +${BOLD}Summary:\n" +if [ $SQL_TEST_RET -eq 0 ]; then printf "SQL Tests: ${GREEN}Success${BOLD}\n"; +else printf "SQL Tests: ${RED}Failure${BOLD}\n"; fi +if [ "$MEM_LEAK_EXECUTED" = true ]; then + if [ $MEM_LEAK_RET -eq 0 ]; then printf "Memory Leak Check: ${GREEN}Success${BOLD}\n"; + else printf "Memory Leak Check: ${RED}Failure${BOLD}\n"; fi +else printf "Memory Leak Check: ${YELLOW}Skipped${BOLD}\n" +fi +if [ $CONFLICT_RET -eq 0 ]; then printf "Grammar Conflict Check: ${GREEN}Success${BOLD}\n"; +else printf "Grammar Conflict Check: ${RED}Failure${BOLD}\n"; fi + +if [[ $SQL_TEST_RET -ne 0 || $CONFLICT_RET -ne 0 ]]; then + RET=1 +fi + +if [ $MEM_LEAK_RET -ne 0 ]; then + if [ "$MEM_LEAK_EXECUTED" = true ]; then + RET=1 + fi +fi + + +if [ $RET -eq 0 ]; then + if [ "$MEM_LEAK_EXECUTED" = true ]; then printf "${GREEN}All tests passed!${NC}\n" + else printf "${YELLOW}Some tests were skipped!${NC}\n" + fi +else printf "${RED}Some tests failed!${NC}\n" +fi +printf "${NC}----------------------------------\n" + +exit $RET diff --git a/extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h b/extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h new file mode 100644 index 0000000000..95f80dc0ba --- /dev/null +++ b/extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h @@ -0,0 +1,207 @@ +// +// microtest.h +// +// URL: https://github.com/torpedro/microtest.h +// Author: Pedro Flemming (http://torpedro.com/) +// License: MIT License (https://github.com/torpedro/microtest.h/blob/master/LICENSE) +// Copyright (c) 2017 Pedro Flemming +// +// This is a small header-only C++ unit testing framework. +// It allows to define small unit tests with set of assertions available. +// +#ifndef __MICROTEST_H__ +#define __MICROTEST_H__ + +#include +#include +#include +#include + +//////////////// +// Assertions // +//////////////// + +#define ASSERT(cond) ASSERT_TRUE(cond) + +#define ASSERT_TRUE(cond) \ + if (!(cond)) { \ + throw mt::AssertFailedException(#cond, __FILE__, __LINE__); \ + } \ + static_assert(true, "End call of macro with a semicolon.") + +#define ASSERT_FALSE(cond) \ + if (cond) { \ + throw mt::AssertFailedException(#cond, __FILE__, __LINE__); \ + } \ + static_assert(true, "End call of macro with a semicolon.") + +#define ASSERT_NULL(value) ASSERT_TRUE(value == NULL) + +#define ASSERT_NOTNULL(value) ASSERT_TRUE(value != NULL) + +#define ASSERT_STREQ(a, b) \ + if (std::string(a).compare(std::string(b)) != 0) { \ + printf("%s{ info} %s", mt::yellow(), mt::def()); \ + std::cout << "Actual values: " << a << " != " << b << std::endl; \ + throw mt::AssertFailedException(#a " == " #b, __FILE__, __LINE__); \ + } \ + static_assert(true, "End call of macro with a semicolon.") + +#define ASSERT_STRNEQ(a, b) \ + if (std::string(a).compare(std::string(b)) != = 0) { \ + printf("%s{ info} %s", mt::yellow(), mt::def()); \ + std::cout << "Actual values: " << a << " == " << b << std::endl; \ + throw mt::AssertFailedException(#a " != " #b, __FILE__, __LINE__); \ + } \ + static_assert(true, "End call of macro with a semicolon.") + +#define ASSERT_EQ(a, b) \ + if (a != b) { \ + printf("%s{ info} %s", mt::yellow(), mt::def()); \ + std::cout << "Actual values: " << a << " != " << b << std::endl; \ + } \ + ASSERT(a == b) + +#define ASSERT_NEQ(a, b) \ + if (a == b) { \ + printf("%s{ info} %s", mt::yellow(), mt::def()); \ + std::cout << "Actual values: " << a << " == " << b << std::endl; \ + } \ + ASSERT(a != b) + +//////////////// +// Unit Tests // +//////////////// + +#define TEST(name) \ + void name(); \ + namespace { \ + bool __##name = mt::TestsManager::AddTest(name, #name); \ + } \ + void name() + +/////////////// +// Framework // +/////////////// + +namespace mt { + +inline const char* red() { return "\033[1;31m"; } + +inline const char* green() { return "\033[0;32m"; } + +inline const char* yellow() { return "\033[0;33m"; } + +inline const char* def() { return "\033[0m"; } + +inline void printRunning(const char* message, FILE* file = stdout) { + fprintf(file, "%s{ running}%s %s\n", green(), def(), message); +} + +inline void printOk(const char* message, FILE* file = stdout) { + fprintf(file, "%s{ ok}%s %s\n", green(), def(), message); +} + +inline void printFailed(const char* message, FILE* file = stdout) { + fprintf(file, "%s{ failed} %s%s\n", red(), message, def()); +} + +// Exception that is thrown when an assertion fails. +class AssertFailedException : public std::exception { + public: + AssertFailedException(std::string description, std::string filepath, int line) + : std::exception(), description_(description), filepath_(filepath), line_(line) {}; + + virtual const char* what() const throw() { return description_.c_str(); } + + inline const char* getFilepath() { return filepath_.c_str(); } + + inline int getLine() { return line_; } + + protected: + std::string description_; + std::string filepath_; + int line_; +}; + +class TestsManager { + // Note: static initialization fiasco + // http://www.parashift.com/c++-faq-lite/static-init-order.html + // http://www.parashift.com/c++-faq-lite/static-init-order-on-first-use.html + public: + struct Test { + const char* name; + void (*fn)(void); + }; + + static std::vector& tests() { + static std::vector tests_; + return tests_; + } + + // Adds a new test to the current set of tests. + // Returns false if a test with the same name already exists. + inline static bool AddTest(void (*fn)(void), const char* name) { + tests().push_back({name, fn}); + return true; + } + + // Run all tests that are registered. + // Returns the number of tests that failed. + inline static size_t RunAllTests(FILE* file = stdout) { + size_t num_failed = 0; + + for (const Test& test : tests()) { + // Run the test. + // If an AsserFailedException is thrown, the test has failed. + try { + printRunning(test.name, file); + + (*test.fn)(); + + printOk(test.name, file); + + } catch (AssertFailedException& e) { + printFailed(test.name, file); + fprintf(file, " %sAssertion failed: %s%s\n", red(), e.what(), def()); + fprintf(file, " %s%s:%d%s\n", red(), e.getFilepath(), e.getLine(), def()); + ++num_failed; + } + } + + int return_code = (num_failed > 0) ? 1 : 0; + return return_code; + } +}; + +// Class that will capture the arguments passed to the program. +class Runtime { + public: + static const std::vector& args(int argc = -1, char** argv = NULL) { + static std::vector args_; + if (argc >= 0) { + for (int i = 0; i < argc; ++i) { + args_.push_back(argv[i]); + } + } + return args_; + } +}; +} // namespace mt + +#define TEST_MAIN() \ + int main(int argc, char* argv[]) { \ + mt::Runtime::args(argc, argv); \ + \ + size_t num_failed = mt::TestsManager::RunAllTests(stdout); \ + if (num_failed == 0) { \ + fprintf(stdout, "%s{ summary} All tests succeeded!%s\n", mt::green(), mt::def()); \ + return 0; \ + } else { \ + double percentage = 100.0 * num_failed / mt::TestsManager::tests().size(); \ + fprintf(stderr, "%s{ summary} %lu tests failed (%.2f%%)%s\n", mt::red(), num_failed, percentage, mt::def()); \ + return -1; \ + } \ + } + +#endif // __MICROTEST_H__ diff --git a/extern/hyrise_sql_parser/test/tpc_h_tests.cpp b/extern/hyrise_sql_parser/test/tpc_h_tests.cpp new file mode 100644 index 0000000000..48b2daaa50 --- /dev/null +++ b/extern/hyrise_sql_parser/test/tpc_h_tests.cpp @@ -0,0 +1,111 @@ +#include "thirdparty/microtest/microtest.h" + +#include "SQLParser.h" +#include "util/sqlhelper.h" + +#include "sql_asserts.h" + +#include +#include +#include +#include + +using namespace hsql; + +std::string readFileContents(std::string file_path) { + std::ifstream t(file_path.c_str()); + std::string text((std::istreambuf_iterator(t)), std::istreambuf_iterator()); + return text; +} + +TEST(TPCHQueryGrammarTests) { + std::vector files = { + "test/queries/tpc-h-01.sql", "test/queries/tpc-h-02.sql", "test/queries/tpc-h-03.sql", + "test/queries/tpc-h-04.sql", "test/queries/tpc-h-05.sql", "test/queries/tpc-h-06.sql", + "test/queries/tpc-h-07.sql", "test/queries/tpc-h-08.sql", "test/queries/tpc-h-09.sql", + "test/queries/tpc-h-10.sql", "test/queries/tpc-h-11.sql", "test/queries/tpc-h-12.sql", + "test/queries/tpc-h-13.sql", "test/queries/tpc-h-14.sql", "test/queries/tpc-h-15.sql", + "test/queries/tpc-h-16.sql", "test/queries/tpc-h-17.sql", "test/queries/tpc-h-18.sql", + "test/queries/tpc-h-19.sql", "test/queries/tpc-h-20.sql", "test/queries/tpc-h-21.sql", + "test/queries/tpc-h-22.sql", + }; + + int testsFailed = 0; + std::string concatenated = ""; + for (const std::string& file_path : files) { + std::string query = readFileContents(file_path); + + concatenated += query; + if (concatenated.back() != ';') concatenated += ';'; + + SQLParserResult result; + SQLParser::parse(query.c_str(), &result); + if (!result.isValid()) { + mt::printFailed(file_path.c_str()); + printf("%s %s (L%d:%d)%s\n", mt::red(), result.errorMsg(), result.errorLine(), result.errorColumn(), + mt::def()); + ++testsFailed; + } else { + mt::printOk(file_path.c_str()); + } + } + + SQLParserResult result; + SQLParser::parse(concatenated.c_str(), &result); + if (!result.isValid()) { + mt::printFailed("TPCHAllConcatenated"); + printf("%s %s (L%d:%d)%s\n", mt::red(), result.errorMsg(), result.errorLine(), result.errorColumn(), + mt::def()); + ++testsFailed; + } else { + mt::printOk("TPCHAllConcatenated"); + } + + ASSERT_EQ(testsFailed, 0); +} + +TEST(TPCHQueryDetailTest) { + std::string query = readFileContents("test/queries/tpc-h-20.sql"); + + SQLParserResult result; + SQLParser::parse(query.c_str(), &result); + ASSERT(result.isValid()); + ASSERT_EQ(result.size(), 1); + + const SQLStatement* stmt20 = result.getStatement(0); + ASSERT_EQ(stmt20->type(), kStmtSelect); + + const SelectStatement* select20 = (const SelectStatement*)stmt20; + ASSERT_EQ(select20->selectList->size(), 2); + ASSERT_STREQ(select20->selectList->at(0)->getName(), "S_NAME"); + ASSERT_STREQ(select20->selectList->at(1)->getName(), "S_ADDRESS"); + + // Test WHERE Clause. + Expr* where = select20->whereClause; + ASSERT_NOTNULL(where); + ASSERT(where->isType(kExprOperator)); + ASSERT_EQ(where->opType, kOpAnd); + + Expr* andExpr2 = where->expr; + ASSERT_NOTNULL(andExpr2); + ASSERT(andExpr2->isType(kExprOperator)); + ASSERT_EQ(andExpr2->opType, kOpAnd); + + // Test IN expression. + Expr* inExpr = andExpr2->expr; + ASSERT_NOTNULL(inExpr); + ASSERT(inExpr->isType(kExprOperator)); + ASSERT_EQ(inExpr->opType, kOpIn); + + ASSERT_STREQ(inExpr->expr->getName(), "S_SUPPKEY"); + ASSERT_NOTNULL(inExpr->select); + ASSERT_EQ(inExpr->select->selectList->size(), 1); + ASSERT(inExpr->select->selectList->at(0)->isType(kExprColumnRef)); + ASSERT_STREQ(inExpr->select->selectList->at(0)->getName(), "PS_SUPPKEY"); + + // Test ORDER BY clause. + ASSERT_NOTNULL(select20->order); + ASSERT_EQ(select20->order->size(), 1); + ASSERT(select20->order->at(0)->expr->isType(kExprColumnRef)); + ASSERT_STREQ(select20->order->at(0)->expr->getName(), "S_NAME"); +} From bc9b28c411010e325454f76e3ed1f5e59b51d650 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Mon, 15 Jun 2026 22:03:32 +0000 Subject: [PATCH 03/19] Add Hyrise adapter and tests --- CMakeLists.txt | 6 + doc/CMakeLists.txt | 4 +- src/ccontrol/CMakeLists.txt | 17 +- src/ccontrol/HyriseAdapter.cc | 778 +++++++++ src/ccontrol/HyriseAdapter.h | 47 + src/ccontrol/ParseRunner.cc | 9 +- src/ccontrol/testAntlr4GeneratedIR.cc | 23 + src/ccontrol/testHyriseGeneratedIR.cc | 2304 +++++++++++++++++++++++++ 8 files changed, 3184 insertions(+), 4 deletions(-) create mode 100644 src/ccontrol/HyriseAdapter.cc create mode 100644 src/ccontrol/HyriseAdapter.h create mode 100644 src/ccontrol/testHyriseGeneratedIR.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b1ee2c3db..543fc75870 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,12 +7,18 @@ project(Qserv enable_testing() +option(QSERV_USE_HYRISE_SQL_PARSER + "Use the Hyrise SQL parser to build query IR for SELECT statements, instead of the ANTLR-based parser" + ON +) + include(GNUInstallDirs) set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/install) add_subdirectory(bin) add_subdirectory(doc) add_subdirectory(etc) +add_subdirectory(extern/hyrise_sql_parser) add_subdirectory(extern/log) add_subdirectory(extern/sphgeom) add_subdirectory(python) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 0b88a81811..f6995f74b0 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -19,11 +19,11 @@ add_custom_target(docs-linkcheck COMMENT "Checking documentation links with Sphinx" COMMAND ${SPHINX_EXECUTABLE} -b linkcheck - -d ${CMAKE_CURRENT_BINARY_DIR}/doctrees + -d ${CMAKE_CURRENT_BINARY_DIR}/doctrees-linkcheck -n -W ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/linkcheck BYPRODUCTS - ${CMAKE_CURRENT_BINARY_DIR}/doctrees + ${CMAKE_CURRENT_BINARY_DIR}/doctrees-linkcheck ${CMAKE_CURRENT_BINARY_DIR}/linkcheck ) diff --git a/src/ccontrol/CMakeLists.txt b/src/ccontrol/CMakeLists.txt index c1cb26ddb3..8db0301324 100644 --- a/src/ccontrol/CMakeLists.txt +++ b/src/ccontrol/CMakeLists.txt @@ -5,6 +5,7 @@ target_include_directories(ccontrol PRIVATE ) target_sources(ccontrol PRIVATE + HyriseAdapter.cc MergingHandler.cc ParseAdapters.cc ParseListener.cc @@ -27,11 +28,16 @@ target_link_libraries(ccontrol PUBLIC cconfig css global + hyrise_sql_parser::sqlparser log parser sphgeom ) +if(QSERV_USE_HYRISE_SQL_PARSER) + target_compile_definitions(ccontrol PUBLIC QSERV_USE_HYRISE_SQL_PARSER) +endif() + install(TARGETS ccontrol) FUNCTION(ccontrol_tests) @@ -58,7 +64,16 @@ FUNCTION(ccontrol_tests) ENDFUNCTION() ccontrol_tests( - testAntlr4GeneratedIR testCControl testUserQueryType ) + +if(QSERV_USE_HYRISE_SQL_PARSER) + ccontrol_tests( + testHyriseGeneratedIR + ) +else() + ccontrol_tests( + testAntlr4GeneratedIR + ) +endif() diff --git a/src/ccontrol/HyriseAdapter.cc b/src/ccontrol/HyriseAdapter.cc new file mode 100644 index 0000000000..4b276c28aa --- /dev/null +++ b/src/ccontrol/HyriseAdapter.cc @@ -0,0 +1,778 @@ +// -*- LSST-C++ -*- +/* + * LSST Data Management System + * Copyright 2026 LSST. + * + * This product includes software developed by the + * LSST Project (http://www.lsst.org/). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the LSST License Statement and + * the GNU General Public License along with this program. If not, + * see . + */ + +#include "ccontrol/HyriseAdapter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "SQLParser.h" +#include "SQLParserResult.h" +#include "sql/Expr.h" +#include "sql/SelectStatement.h" +#include "sql/Table.h" + +#include "global/constants.h" +#include "parser/ParseException.h" +#include "query/AndTerm.h" +#include "query/AreaRestrictor.h" +#include "query/BetweenPredicate.h" +#include "query/BoolFactor.h" +#include "query/BoolTermFactor.h" +#include "query/ColumnRef.h" +#include "query/CompPredicate.h" +#include "query/FromList.h" +#include "query/FuncExpr.h" +#include "query/GroupByClause.h" +#include "query/HavingClause.h" +#include "query/InPredicate.h" +#include "query/JoinRef.h" +#include "query/JoinSpec.h" +#include "query/LikePredicate.h" +#include "query/NullPredicate.h" +#include "query/OrderByClause.h" +#include "query/OrTerm.h" +#include "query/SelectList.h" +#include "query/SelectStmt.h" +#include "query/TableRef.h" +#include "query/ValueExpr.h" +#include "query/ValueExprPredicate.h" +#include "query/ValueFactor.h" +#include "query/WhereClause.h" + +namespace { + +using namespace lsst::qserv; + +std::string str(char const* value) { return value == nullptr ? std::string() : std::string(value); } + +[[noreturn]] void unsupported(std::string const& what) { + throw parser::ParseException("HyriseAdapter unsupported SQL construct: " + what); +} + +std::string formatFloat(double value) { + std::ostringstream out; + // digits10 (not max_digits10) avoids exposing binary floating-point noise for ordinary decimal + // literals (e.g. 0.1) while still giving enough precision for literals with many significant digits. + out << std::setprecision(std::numeric_limits::digits10) << value; + return out.str(); +} + +// Forward declarations for the mutually-recursive expression/term builders below. +std::shared_ptr buildValueExpr(hsql::Expr const* expr); +std::shared_ptr buildBoolFactorTerm(hsql::Expr const* expr); +std::shared_ptr buildBoolTerm(hsql::Expr const* expr); + +// --------------------------------------------------------------------------- +// The following helpers (qualifiedName, operatorSql, exprSql, containsFunction) +// are used only to render an hsql::Expr back into SQL text for diagnostic +// error messages (e.g. "functions are not allowed in ORDER BY"). They are not +// part of the AST-to-IR conversion itself. +// --------------------------------------------------------------------------- + +std::string qualifiedName(std::vector const& parts) { + std::string result; + for (auto const& part : parts) { + if (part.empty()) continue; + if (!result.empty()) result += "."; + result += part; + } + return result; +} + +std::string operatorSql(hsql::OperatorType op) { + switch (op) { + case hsql::kOpPlus: + return "+"; + case hsql::kOpMinus: + return "-"; + case hsql::kOpAsterisk: + return "*"; + case hsql::kOpSlash: + return "/"; + case hsql::kOpPercentage: + return "%"; + case hsql::kOpMod: + return "MOD"; + case hsql::kOpDiv: + return "DIV"; + case hsql::kOpCaret: + case hsql::kOpBitXor: + return "^"; + case hsql::kOpBitAnd: + return "&"; + case hsql::kOpBitOr: + return "|"; + case hsql::kOpBitShiftLeft: + return "<<"; + case hsql::kOpBitShiftRight: + return ">>"; + default: + unsupported("operator rendering"); + } +} + +std::string exprSql(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null expression"); + switch (expr->type) { + case hsql::kExprColumnRef: + return qualifiedName({str(expr->schema), str(expr->table), str(expr->name)}); + case hsql::kExprStar: + return qualifiedName({str(expr->table), "*"}); + case hsql::kExprLiteralInt: + return std::to_string(expr->ival); + case hsql::kExprLiteralIntString: + return str(expr->name); + case hsql::kExprLiteralFloat: + return formatFloat(expr->fval); + case hsql::kExprLiteralString: + return "'" + str(expr->name) + "'"; + case hsql::kExprLiteralNull: + return "NULL"; + case hsql::kExprFunctionRef: { + std::string result = qualifiedName({str(expr->schema), str(expr->name)}) + "("; + if (expr->distinct) result += "DISTINCT "; + if (expr->exprList != nullptr) { + for (auto iter = expr->exprList->begin(); iter != expr->exprList->end(); ++iter) { + if (iter != expr->exprList->begin()) result += ", "; + result += exprSql(*iter); + } + } + result += ")"; + return result; + } + case hsql::kExprOperator: + if (expr->opType == hsql::kOpUnaryMinus) return "-" + exprSql(expr->expr); + return exprSql(expr->expr) + " " + operatorSql(expr->opType) + " " + exprSql(expr->expr2); + default: + unsupported("expression rendering"); + } +} + +bool containsFunction(hsql::Expr const* expr) { + if (expr == nullptr) return false; + if (expr->type == hsql::kExprFunctionRef) return true; + if (containsFunction(expr->expr) || containsFunction(expr->expr2)) return true; + if (expr->exprList != nullptr) { + for (auto const* child : *expr->exprList) { + if (containsFunction(child)) return true; + } + } + return false; +} + +// --------------------------------------------------------------------------- +// End of diagnostic-only AST rendering helpers. +// --------------------------------------------------------------------------- + +void trimTrailingWhitespace(std::string& sql) { + while (!sql.empty() && std::isspace(static_cast(sql.back()))) { + sql.pop_back(); + } +} + +// TODO(DM-55216): This mainly exists to chop off extra whitespace and eliminate +// queries with empty extra statements (i.e., something;;). Hyrise will +// reject ';;', maybe that behavior is better anyway? +std::string normalizeSql(std::string const& sql) { + std::string normalized{sql}; + trimTrailingWhitespace(normalized); + while (!normalized.empty() && normalized.back() == ';') { + normalized.pop_back(); + trimTrailingWhitespace(normalized); + } + return normalized; +} + +// Mirrors the wording of the error ANTLR's parser produced for an unparseable statement, so that +// callers/tests written against the old parser's messages continue to see the same text. +std::string unparseableQueryError(std::string const& sql) { + return std::string("Failed to instantiate query: \"") + sql + '"'; +} + +// TODO(DM-55216): containsChunkId() and caseWhenFragment()/the "CASE WHEN" check below run on the raw, +// unparsed SQL text rather than the parsed AST. This is a quick stand-in for the equivalent ANTLR-era +// checks, but it can produce false positives if "_chunkId" or "CASE WHEN" appear inside a string literal +// or quoted identifier rather than as actual SQL syntax. Once the Hyrise migration is further along these +// checks should be reimplemented as a walk over the parsed hsql::SQLParserResult. +bool containsChunkId(std::string const& sql) { + static std::regex const pattern{R"((^|[^A-Za-z0-9_])_chunkId([^A-Za-z0-9_]|$))", std::regex::ECMAScript}; + return std::regex_search(sql, pattern); +} + +std::string caseWhenFragment(std::string const& sql) { + std::string upper = boost::algorithm::to_upper_copy(sql); + auto begin = upper.find("CASE WHEN"); + if (begin == std::string::npos) { + return "CASE WHEN"; + } + auto end = upper.find("END", begin); + if (end == std::string::npos) { + return sql.substr(begin); + } + return sql.substr(begin, (end + 3) - begin); +} + +query::ValueExpr::Op valueOp(hsql::OperatorType op) { + switch (op) { + case hsql::kOpPlus: + return query::ValueExpr::PLUS; + case hsql::kOpMinus: + return query::ValueExpr::MINUS; + case hsql::kOpAsterisk: + return query::ValueExpr::MULTIPLY; + case hsql::kOpSlash: + return query::ValueExpr::DIVIDE; + case hsql::kOpPercentage: + return query::ValueExpr::MODULO; + case hsql::kOpMod: + return query::ValueExpr::MOD; + case hsql::kOpDiv: + return query::ValueExpr::DIV; + case hsql::kOpCaret: + case hsql::kOpBitXor: + return query::ValueExpr::BIT_XOR; + case hsql::kOpBitAnd: + return query::ValueExpr::BIT_AND; + case hsql::kOpBitOr: + return query::ValueExpr::BIT_OR; + case hsql::kOpBitShiftLeft: + return query::ValueExpr::BIT_SHIFT_LEFT; + case hsql::kOpBitShiftRight: + return query::ValueExpr::BIT_SHIFT_RIGHT; + default: + unsupported("value operator"); + } +} + +query::CompPredicate::OpType compOp(hsql::OperatorType op) { + switch (op) { + case hsql::kOpEquals: + return query::CompPredicate::EQUALS_OP; + case hsql::kOpNullSafeEquals: + return query::CompPredicate::NULL_SAFE_EQUALS_OP; + case hsql::kOpNotEquals: + return query::CompPredicate::NOT_EQUALS_OP; + case hsql::kOpLess: + return query::CompPredicate::LESS_THAN_OP; + case hsql::kOpLessEq: + return query::CompPredicate::LESS_THAN_OR_EQUALS_OP; + case hsql::kOpGreater: + return query::CompPredicate::GREATER_THAN_OP; + case hsql::kOpGreaterEq: + return query::CompPredicate::GREATER_THAN_OR_EQUALS_OP; + default: + unsupported("comparison operator"); + } +} + +std::shared_ptr buildNotTerm(std::shared_ptr const& term) { + return std::make_shared( + query::BoolTerm::PtrVector{std::make_shared(term, true)}); +} + +struct WhereTerm { + std::shared_ptr term; + query::AreaRestrictorVec restrictors; +}; + +void appendRestrictors(query::AreaRestrictorVec& target, query::AreaRestrictorVec const& source) { + target.insert(target.end(), source.begin(), source.end()); +} + +std::shared_ptr buildColumnRef(hsql::Expr const* expr) { + if (expr->type != hsql::kExprColumnRef) unsupported("non-column column reference"); + std::string schema = str(expr->schema); + std::string table = str(expr->table); + std::string name = str(expr->name); + if (name.empty()) unsupported("empty column reference"); + if (!schema.empty() || !table.empty()) { + return std::make_shared(schema, table, name); + } + return std::make_shared(name); +} + +std::shared_ptr buildSimpleBoolTerm(std::shared_ptr const& term, + bool hasNot = false) { + return std::make_shared( + query::BoolTerm::PtrVector{std::make_shared(term, hasNot)}); +} + +std::shared_ptr buildValueFactor(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null expression"); + switch (expr->type) { + case hsql::kExprColumnRef: + return query::ValueFactor::newColumnRefFactor(buildColumnRef(expr)); + case hsql::kExprStar: + return query::ValueFactor::newStarFactor(str(expr->table)); + case hsql::kExprLiteralInt: + return query::ValueFactor::newConstFactor(std::to_string(expr->ival)); + case hsql::kExprLiteralIntString: + return query::ValueFactor::newConstFactor(str(expr->name)); + case hsql::kExprLiteralFloat: + return query::ValueFactor::newConstFactor(formatFloat(expr->fval)); + case hsql::kExprLiteralString: + return query::ValueFactor::newConstFactor("'" + str(expr->name) + "'"); + case hsql::kExprLiteralNull: + return query::ValueFactor::newConstFactor("NULL"); + case hsql::kExprFunctionRef: { + query::ValueExprPtrVector args; + if (expr->exprList != nullptr) { + for (auto const* arg : *expr->exprList) { + args.push_back(buildValueExpr(arg)); + } + } + auto func = query::FuncExpr::newWithArgs(str(expr->name), args); + std::string name = str(expr->name); + if (boost::algorithm::iequals(name, "COUNT") || boost::algorithm::iequals(name, "MIN") || + boost::algorithm::iequals(name, "MAX") || boost::algorithm::iequals(name, "SUM") || + boost::algorithm::iequals(name, "AVG")) { + return query::ValueFactor::newAggFactor(func); + } + return query::ValueFactor::newFuncFactor(func); + } + case hsql::kExprOperator: + return query::ValueFactor::newExprFactor(buildValueExpr(expr)); + default: + unsupported("value factor type"); + } +} + +std::shared_ptr buildBoolFactorTerm(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null boolean factor"); + if (expr->type != hsql::kExprOperator) { + return std::make_shared(buildValueExpr(expr)); + } + + std::shared_ptr predicate; + if (expr->opType == hsql::kOpIn) { + if (expr->select != nullptr) unsupported("IN subquery"); + if (expr->exprList == nullptr) unsupported("empty IN list"); + query::ValueExprPtrVector values; + for (auto const* value : *expr->exprList) { + values.push_back(buildValueExpr(value)); + } + predicate = std::make_shared(buildValueExpr(expr->expr), values, false); + } else if (expr->opType == hsql::kOpBetween) { + if (expr->exprList == nullptr || expr->exprList->size() != 2) unsupported("BETWEEN bounds"); + predicate = std::make_shared(buildValueExpr(expr->expr), + buildValueExpr(expr->exprList->at(0)), + buildValueExpr(expr->exprList->at(1)), false); + } else if (expr->opType == hsql::kOpLike || expr->opType == hsql::kOpNotLike) { + predicate = std::make_shared( + buildValueExpr(expr->expr), buildValueExpr(expr->expr2), expr->opType == hsql::kOpNotLike); + } else if (expr->opType == hsql::kOpIsNull) { + predicate = std::make_shared(buildValueExpr(expr->expr), false); + } else { + predicate = std::make_shared(buildValueExpr(expr->expr), compOp(expr->opType), + buildValueExpr(expr->expr2)); + } + return predicate; +} + +std::string restrictorArg(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null qserv area restrictor argument"); + switch (expr->type) { + case hsql::kExprLiteralInt: + return std::to_string(expr->ival); + case hsql::kExprLiteralIntString: + return str(expr->name); + case hsql::kExprLiteralFloat: + return formatFloat(expr->fval); + case hsql::kExprOperator: + if (expr->opType == hsql::kOpUnaryMinus) { + return "-" + restrictorArg(expr->expr); + } + break; + default: + break; + } + unsupported("non-constant qserv area restrictor argument"); +} + +std::shared_ptr buildAreaRestrictor(hsql::Expr const* expr) { + if (expr == nullptr) return nullptr; + // ANTLR's grammar fires a dedicated QservFunctionSpec rule for qserv_areaspec_* functions regardless + // of surrounding context, so it also handles forms like "qserv_areaspec_box(...) = 1" and + // "1 = qserv_areaspec_box(...)". Replicate that by unwrapping equality comparisons here. + if (expr->type == hsql::kExprOperator && expr->opType == hsql::kOpEquals) { + if (auto r = buildAreaRestrictor(expr->expr)) return r; + if (auto r = buildAreaRestrictor(expr->expr2)) return r; + } + if (expr->type != hsql::kExprFunctionRef) return nullptr; + std::string name = str(expr->name); + if (!boost::algorithm::iequals(name, "qserv_areaspec_box") && + !boost::algorithm::iequals(name, "qserv_areaspec_circle") && + !boost::algorithm::iequals(name, "qserv_areaspec_ellipse") && + !boost::algorithm::iequals(name, "qserv_areaspec_poly")) { + return nullptr; + } + if (expr->exprList == nullptr) unsupported("empty qserv area restrictor argument list"); + std::vector args; + for (auto const* arg : *expr->exprList) { + args.push_back(restrictorArg(arg)); + } + try { + if (boost::algorithm::iequals(name, "qserv_areaspec_box")) { + return std::make_shared(args); + } + if (boost::algorithm::iequals(name, "qserv_areaspec_circle")) { + return std::make_shared(args); + } + if (boost::algorithm::iequals(name, "qserv_areaspec_ellipse")) { + return std::make_shared(args); + } + if (boost::algorithm::iequals(name, "qserv_areaspec_poly")) { + return std::make_shared(args); + } + } catch (std::logic_error const& err) { + throw parser::ParseException(err.what()); + } + unsupported("qserv area restrictor function"); +} + +std::shared_ptr buildValueExpr(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null value expression"); + if (expr->type == hsql::kExprOperator) { + if (expr->opType == hsql::kOpUnaryMinus) { + if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralInt) { + return query::ValueExpr::newSimple( + query::ValueFactor::newConstFactor("-" + std::to_string(expr->expr->ival))); + } + if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralIntString) { + return query::ValueExpr::newSimple( + query::ValueFactor::newConstFactor("-" + str(expr->expr->name))); + } + if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralFloat) { + return query::ValueExpr::newSimple( + query::ValueFactor::newConstFactor("-" + formatFloat(expr->expr->fval))); + } + auto value = std::make_shared(); + value->addValueFactor(query::ValueFactor::newConstFactor("0")); + value->addOp(query::ValueExpr::MINUS); + value->addValueFactor(buildValueFactor(expr->expr)); + return value; + } + auto value = std::make_shared(); + value->addValueFactor(buildValueFactor(expr->expr)); + value->addOp(valueOp(expr->opType)); + value->addValueFactor(buildValueFactor(expr->expr2)); + return value; + } + return query::ValueExpr::newSimple(buildValueFactor(expr)); +} + +WhereTerm buildWhereTerm(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null boolean expression"); + if (auto restrictor = buildAreaRestrictor(expr)) { + return {nullptr, {restrictor}}; + } + if (expr->type == hsql::kExprOperator && (expr->opType == hsql::kOpAnd || expr->opType == hsql::kOpOr)) { + auto left = buildWhereTerm(expr->expr); + auto right = buildWhereTerm(expr->expr2); + WhereTerm result; + appendRestrictors(result.restrictors, left.restrictors); + appendRestrictors(result.restrictors, right.restrictors); + + query::BoolTerm::PtrVector terms; + if (left.term != nullptr) terms.push_back(left.term); + if (right.term != nullptr) terms.push_back(right.term); + if (terms.empty()) return result; + if (terms.size() == 1) { + result.term = std::dynamic_pointer_cast(terms.front()); + if (result.term == nullptr) { + result.term = std::make_shared(terms); + } + return result; + } + if (expr->opType == hsql::kOpAnd) { + auto andTerm = std::make_shared(); + for (auto const& term : terms) { + if (!andTerm->merge(*term)) { + andTerm->addBoolTerm(term); + } + } + result.term = andTerm; + } else { + auto orTerm = std::make_shared(); + for (auto const& term : terms) { + if (!orTerm->merge(*term)) { + orTerm->addBoolTerm(std::make_shared(term)); + } + } + result.term = orTerm; + } + return result; + } + return {buildBoolTerm(expr), {}}; +} + +std::shared_ptr buildBoolTerm(hsql::Expr const* expr) { + if (expr == nullptr) unsupported("null boolean expression"); + if (expr->type != hsql::kExprOperator) { + return buildSimpleBoolTerm(buildBoolFactorTerm(expr)); + } + if (expr->opType == hsql::kOpAnd || expr->opType == hsql::kOpOr) { + std::shared_ptr left = buildBoolTerm(expr->expr); + if (auto reduced = left->getReduced()) left = reduced; + std::shared_ptr right = buildBoolTerm(expr->expr2); + if (auto reduced = right->getReduced()) right = reduced; + query::BoolTerm::PtrVector terms{left, right}; + if (expr->opType == hsql::kOpAnd) { + return std::make_shared(terms); + } + return std::make_shared(terms); + } + if (expr->opType == hsql::kOpNot) { + if (expr->expr == nullptr) unsupported("NOT expression"); + if (expr->expr->type == hsql::kExprOperator) { + if (expr->expr->opType == hsql::kOpAnd || expr->expr->opType == hsql::kOpOr) { + auto inner = buildBoolTerm(expr->expr); + auto wrapped = std::make_shared( + std::make_shared(inner), true); + wrapped->addParenthesis(); + return std::make_shared(query::BoolTerm::PtrVector{wrapped}); + } + if (expr->expr->opType == hsql::kOpIn) { + if (expr->expr->select != nullptr) unsupported("NOT IN subquery"); + if (expr->expr->exprList == nullptr) unsupported("empty NOT IN list"); + query::ValueExprPtrVector values; + for (auto const* value : *expr->expr->exprList) { + values.push_back(buildValueExpr(value)); + } + return buildSimpleBoolTerm( + std::make_shared(buildValueExpr(expr->expr->expr), values, true)); + } + if (expr->expr->opType == hsql::kOpIsNull) { + return buildSimpleBoolTerm( + std::make_shared(buildValueExpr(expr->expr->expr), true)); + } + if (expr->expr->opType == hsql::kOpBetween) { + if (expr->expr->exprList == nullptr || expr->expr->exprList->size() != 2) { + unsupported("NOT BETWEEN bounds"); + } + return buildSimpleBoolTerm(std::make_shared( + buildValueExpr(expr->expr->expr), buildValueExpr(expr->expr->exprList->at(0)), + buildValueExpr(expr->expr->exprList->at(1)), true)); + } + } + return buildNotTerm(buildBoolFactorTerm(expr->expr)); + } + return buildSimpleBoolTerm(buildBoolFactorTerm(expr)); +} + +std::shared_ptr buildSelectList(hsql::SelectStatement const& stmt) { + auto selectList = std::make_shared(); + if (stmt.selectList == nullptr) unsupported("missing select list"); + for (auto const* expr : *stmt.selectList) { + auto value = buildValueExpr(expr); + if (expr->alias != nullptr) { + value->setAlias(str(expr->alias)); + value->setAliasIsUserDefined(true); + } + selectList->addValueExpr(value); + } + return selectList; +} + +std::string tableAlias(hsql::Alias const* alias) { + return alias == nullptr ? std::string() : str(alias->name); +} + +query::TableRef::Ptr buildSimpleTableRef(hsql::TableRef const* table) { + if (table == nullptr) unsupported("missing from table"); + if (table->type != hsql::kTableName) unsupported("non-simple table reference"); + return std::make_shared(str(table->schema), str(table->name), tableAlias(table->alias)); +} + +query::JoinRef::Type buildJoinType(hsql::JoinType type) { + switch (type) { + case hsql::kJoinInner: + return query::JoinRef::DEFAULT; + case hsql::kJoinLeft: + return query::JoinRef::LEFT; + case hsql::kJoinRight: + return query::JoinRef::RIGHT; + case hsql::kJoinFull: + return query::JoinRef::FULL; + case hsql::kJoinCross: + return query::JoinRef::CROSS; + case hsql::kJoinNatural: + return query::JoinRef::DEFAULT; + default: + unsupported("join type"); + } +} + +std::shared_ptr buildJoinSpec(hsql::JoinDefinition const* join) { + if (join == nullptr) unsupported("missing join definition"); + if (join->namedColumns != nullptr) { + if (join->namedColumns->size() != 1) unsupported("multi-column USING"); + return std::make_shared( + std::make_shared(str(join->namedColumns->front()))); + } + if (join->condition != nullptr) { + return std::make_shared(buildBoolTerm(join->condition)); + } + if (join->natural || join->type == hsql::kJoinNatural || join->type == hsql::kJoinCross) { + return nullptr; + } + unsupported("join without ON or USING"); +} + +query::TableRef::Ptr buildJoinedTableRef(hsql::TableRef const* table) { + if (table == nullptr) unsupported("missing from table"); + if (table->type == hsql::kTableName) return buildSimpleTableRef(table); + if (table->type != hsql::kTableJoin || table->join == nullptr) { + unsupported("non-simple table reference"); + } + auto left = buildJoinedTableRef(table->join->left); + auto right = buildSimpleTableRef(table->join->right); + left->addJoin(std::make_shared( + right, buildJoinType(table->join->type), + table->join->natural || table->join->type == hsql::kJoinNatural, buildJoinSpec(table->join))); + return left; +} + +std::shared_ptr buildFromList(hsql::SelectStatement const& stmt) { + auto tables = std::make_shared(); + if (stmt.fromTable == nullptr) unsupported("missing FROM"); + if (stmt.fromTable->type == hsql::kTableCrossProduct) { + if (stmt.fromTable->list == nullptr) unsupported("empty table list"); + for (auto const* table : *stmt.fromTable->list) { + tables->push_back(buildJoinedTableRef(table)); + } + } else { + tables->push_back(buildJoinedTableRef(stmt.fromTable)); + } + return std::make_shared(tables); +} + +std::shared_ptr buildWhereClause(hsql::SelectStatement const& stmt) { + if (stmt.whereClause == nullptr) return nullptr; + auto where = std::make_shared(); + auto result = buildWhereTerm(stmt.whereClause); + if (result.term != nullptr) { + where->setRootTerm(result.term); + } + for (auto const& restrictor : result.restrictors) { + where->addAreaRestrictor(restrictor); + } + return where; +} + +std::shared_ptr buildOrderBy(hsql::SelectStatement const& stmt) { + if (stmt.order == nullptr || stmt.order->empty()) return nullptr; + auto orderBy = std::make_shared(); + for (auto const* term : *stmt.order) { + if (containsFunction(term->expr)) { + throw parser::ParseException("Error parsing query, near \"" + exprSql(term->expr) + + "\", qserv does not support functions in ORDER BY."); + } + query::OrderByTerm::Order order = query::OrderByTerm::DEFAULT; + if (term->type == hsql::kOrderAsc) order = query::OrderByTerm::ASC; + if (term->type == hsql::kOrderDesc) order = query::OrderByTerm::DESC; + orderBy->addTerm(query::OrderByTerm(buildValueExpr(term->expr), order)); + } + return orderBy; +} + +std::shared_ptr buildGroupBy(hsql::SelectStatement const& stmt) { + if (stmt.groupBy == nullptr || stmt.groupBy->columns == nullptr || stmt.groupBy->columns->empty()) { + return nullptr; + } + auto groupBy = std::make_shared(); + for (auto const* expr : *stmt.groupBy->columns) { + groupBy->addTerm(query::GroupByTerm(buildValueExpr(expr), std::string())); + } + return groupBy; +} + +std::shared_ptr buildHaving(hsql::SelectStatement const& stmt) { + if (stmt.groupBy != nullptr && stmt.groupBy->having != nullptr) { + return std::make_shared(buildBoolTerm(stmt.groupBy->having)); + } + if (stmt.having != nullptr) { + return std::make_shared(buildBoolTerm(stmt.having)); + } + return nullptr; +} + +int buildLimit(hsql::SelectStatement const& stmt) { + if (stmt.limit == nullptr || stmt.limit->limit == nullptr) return lsst::qserv::NOTSET; + auto const* limit = stmt.limit->limit; + if (limit->type != hsql::kExprLiteralInt) unsupported("non-integer LIMIT"); + if (limit->ival > static_cast(std::numeric_limits::max())) unsupported("LIMIT overflow"); + return static_cast(limit->ival); +} + +std::shared_ptr buildSelectStmt(hsql::SQLParserResult const& result) { + if (!result.isValid()) { + throw parser::ParseException(result.errorMsg() == nullptr ? "Hyrise parse failed" + : result.errorMsg()); + } + if (result.size() != 1) unsupported("multiple statements"); + auto const* stmt = dynamic_cast(result.getStatement(0)); + if (stmt == nullptr) unsupported("non-SELECT statement"); + if (stmt->setOperations != nullptr && !stmt->setOperations->empty()) unsupported("set operations"); + if (stmt->withDescriptions != nullptr && !stmt->withDescriptions->empty()) unsupported("WITH"); + + return std::make_shared( + buildSelectList(*stmt), buildFromList(*stmt), buildWhereClause(*stmt), buildOrderBy(*stmt), + buildGroupBy(*stmt), buildHaving(*stmt), stmt->selectDistinct, buildLimit(*stmt)); +} + +} // namespace + +namespace lsst::qserv::ccontrol { + +std::shared_ptr HyriseAdapter::makeSelectStmt(std::string const& sql) { + auto normalized = normalizeSql(sql); + if (containsChunkId(normalized)) { + throw parser::ParseException( + "Error parsing query, near \"_chunkId\", Identifiers in Qserv may not " + "start with an underscore."); + } + if (boost::algorithm::icontains(normalized, "CASE WHEN")) { + throw parser::ParseException("qserv can not parse query, near \"" + caseWhenFragment(normalized) + + "\""); + } + hsql::SQLParserResult result; + hsql::SQLParser::parse(normalized, &result); + if (!result.isValid()) { + throw parser::ParseException(unparseableQueryError(sql)); + } + return buildSelectStmt(result); +} + +} // namespace lsst::qserv::ccontrol diff --git a/src/ccontrol/HyriseAdapter.h b/src/ccontrol/HyriseAdapter.h new file mode 100644 index 0000000000..2acb61ab91 --- /dev/null +++ b/src/ccontrol/HyriseAdapter.h @@ -0,0 +1,47 @@ +// -*- LSST-C++ -*- +/* + * LSST Data Management System + * Copyright 2026 LSST. + * + * This product includes software developed by the + * LSST Project (http://www.lsst.org/). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the LSST License Statement and + * the GNU General Public License along with this program. If not, + * see . + */ + +#ifndef LSST_QSERV_CCONTROL_HYRISEADAPTER_H +#define LSST_QSERV_CCONTROL_HYRISEADAPTER_H + +#include +#include + +namespace lsst::qserv::query { +class SelectStmt; +} // namespace lsst::qserv::query + +namespace lsst::qserv::ccontrol { + +/// Build Qserv's existing query IR from Hyrise parser output. +/// +/// This is intentionally separate from ParseListener/ParseAdapters because those +/// classes are coupled to ANTLR parser context types. +class HyriseAdapter { +public: + static std::shared_ptr makeSelectStmt(std::string const& sql); +}; + +} // namespace lsst::qserv::ccontrol + +#endif // LSST_QSERV_CCONTROL_HYRISEADAPTER_H diff --git a/src/ccontrol/ParseRunner.cc b/src/ccontrol/ParseRunner.cc index 6b7fbfa5bb..d8fe6445ee 100644 --- a/src/ccontrol/ParseRunner.cc +++ b/src/ccontrol/ParseRunner.cc @@ -25,6 +25,7 @@ #include "ccontrol/ParseRunner.h" // Qserv headers +#include "ccontrol/HyriseAdapter.h" #include "ccontrol/UserQuery.h" #include "parser/ParseException.h" #include "query/SelectStmt.h" @@ -126,7 +127,13 @@ void ParseRunner::run() { walker.walk(listener, tree); } -std::shared_ptr ParseRunner::getSelectStmt() { return _listener->getSelectStatement(); } +std::shared_ptr ParseRunner::getSelectStmt() { +#ifdef QSERV_USE_HYRISE_SQL_PARSER + return HyriseAdapter::makeSelectStmt(_statement); +#else + return _listener->getSelectStatement(); +#endif +} std::shared_ptr ParseRunner::getUserQuery() { return _listener->getUserQuery(); } diff --git a/src/ccontrol/testAntlr4GeneratedIR.cc b/src/ccontrol/testAntlr4GeneratedIR.cc index 88e6d79c4b..de8b5b12f7 100644 --- a/src/ccontrol/testAntlr4GeneratedIR.cc +++ b/src/ccontrol/testAntlr4GeneratedIR.cc @@ -1139,6 +1139,29 @@ static const vector ANTLR4_TEST_QUERIES = { nullptr, nullptr, 0, -1); }, "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10) ORDER BY `objectId`"), + // test qserv_areaspec_box wrapped in an equality comparison (form used in some integration tests) + Antlr4TestQueries( + "SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "3", "10")), nullptr, nullptr, + nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10)"), + Antlr4TestQueries( + "SELECT objectId FROM Object WHERE 1 = qserv_areaspec_box(0, 0, 3, 10)", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "3", "10")), nullptr, nullptr, + nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10)"), // test null-safe equals operator <> Antlr4TestQueries( "SELECT o1.objectId AS objId1, o2.objectId AS objId2, scisql_angSep(o1.ra_PS, o1.decl_PS, " diff --git a/src/ccontrol/testHyriseGeneratedIR.cc b/src/ccontrol/testHyriseGeneratedIR.cc new file mode 100644 index 0000000000..89c7eb9460 --- /dev/null +++ b/src/ccontrol/testHyriseGeneratedIR.cc @@ -0,0 +1,2304 @@ +// -*- LSST-C++ -*- +/* + * LSST Data Management System + * Copyright 2019 AURA/LSST. + * + * This product includes software developed by the + * LSST Project (http://www.lsst.org/). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the LSST License Statement and + * the GNU General Public License along with this program. If not, + * see . + */ + +// System headers +#include +#include +#include + +#define BOOST_TEST_MODULE HyriseGeneratedIR + +// Third-party headers +#include +#include + +// Qserv headers +#include "ccontrol/ParseRunner.h" +#include "ccontrol/UserQuerySet.h" +#include "ccontrol/UserQueryType.h" +#include "parser/ParseException.h" +#include "qproc/QuerySession.h" +#include "query/AndTerm.h" +#include "query/BetweenPredicate.h" +#include "query/BoolFactor.h" +#include "query/BoolFactorTerm.h" +#include "query/BoolTerm.h" +#include "query/BoolTermFactor.h" +#include "query/ColumnRef.h" +#include "query/CompPredicate.h" +#include "query/FromList.h" +#include "query/FuncExpr.h" +#include "query/GroupByClause.h" +#include "query/HavingClause.h" +#include "query/InPredicate.h" +#include "query/JoinRef.h" +#include "query/JoinSpec.h" +#include "query/LikePredicate.h" +#include "query/NullPredicate.h" +#include "query/OrTerm.h" +#include "query/PassTerm.h" +#include "query/AreaRestrictor.h" +#include "query/SelectList.h" +#include "query/SelectStmt.h" +#include "query/TableRef.h" +#include "query/ValueExpr.h" +#include "query/ValueFactor.h" +#include "query/WhereClause.h" + +using namespace std; +namespace test = boost::test_tools; +using namespace lsst::qserv; + +BOOST_AUTO_TEST_SUITE(Suite) + +/// Negation is used in class constructors where the class may be negated by 'NOT', where IS_NOT == "NOT", +/// and IS is the explicit absence of "NOT". +enum Negation { IS, IS_NOT }; + +/// InNotIn is used in the case where something may be specified as 'in' or 'not in' another thing (i.e. for +/// the query::InPredicate.) +enum InNotIn { IN, NOT_IN }; + +/// Star is used to indicate a star value, i.e. "*" as in "SELECT *" +enum Star { STAR }; + +/// Natural is used to indicate if a join is natural or not natural, in a JoinRef. +enum Natural { NATURAL, NOT_NATURAL }; + +/// Between is used to indicate if something is between, or not between. +enum Between { BETWEEN, NOT_BETWEEN }; + +/// Like is used to indicate is something is like, or not like. +enum Like { LIKE, NOT_LIKE }; + +/// Null is used to indicate IS_NULL or IS_NOT_NULL +enum IsNull { IS_NULL, IS_NOT_NULL }; + +/** + * @brief Pusher is a set of recursive variadic functions to receive a variable number of arguments and push + * them into a container that has a push_back function. + * + * This form of `pusher` is the last to get called, for the single remaining element. + * + * @tparam Container The type of container + * @tparam Types The template parameters the container accepts (e.g. for a vector it will be the element type + * and the allocator type) + * @tparam T The type of the object to push into the container. + * @tparam TArgs The type of the remaining objects to push onto the vector (this should match T) + * @param container The container to push objects into. + * @param first The object to push into the container. + */ +template +void pusher(Container& container, T&& first) { + container.push_back(forward(first)); +} + +/** + * @brief Pusher is a set of recursive variadic functions to receive a variable number of arguments and push + * them into a container that has a push_back function. + * + * @tparam Container The type of container + * @tparam Types The template parameters the container accepts (e.g. for a vector it will be the element type + * and the allocator type) + * @tparam T The type of the object to push into the container. + * @tparam TArgs The type of the remaining objects to push onto the vector (this should match T) + * @param container The container to push objects into. + * @param first The object to push into the container. + * @param args The rest of the objects to push into the container. + */ +template +void pusher(Container& container, T&& first, TArgs&&... args) { + container.push_back(forward(first)); + pusher(container, forward(args)...); +} + +/// Create a new AndTerm, with terms. Args should be a comma separated list of BoolTermPtr. +template +shared_ptr AndTerm(Targs... args) { + vector> terms; + pusher(terms, args...); + return make_shared(terms); +} + +/// Create a new BetweenPredicate. +shared_ptr BetweenPredicate(shared_ptr const& iValue, + Between between, + shared_ptr const& iMinValue, + shared_ptr const& iMaxValue) { + return make_shared(iValue, iMinValue, iMaxValue, (between == NOT_BETWEEN)); +} + +/// Create a new AndTerm, with terms. Args should be a comma separated list of BoolFactorPtr. +template +shared_ptr BoolFactor(Negation negation, Targs... args) { + vector> terms; + pusher(terms, args...); + return make_shared(terms, negation); +} + +/// Create a new BoolTermFactor with a BoolTerm member term. +shared_ptr BoolTermFactor(shared_ptr const& term) { + return make_shared(term); +} + +/// Create a new ColumnRef with given database, table, and column names. +shared_ptr ColumnRef(string const& db, string const& table, string const& column) { + return make_shared(db, table, column); +} + +/// Create a new ColumnRef with given TableRef and column name. +shared_ptr ColumnRef(shared_ptr const& tableRef, string const& column) { + return make_shared(tableRef, column); +} + +/// Create a new CompPredicate, comparising the `left` and `right` ValueExprPtrs, with an operator +shared_ptr CompPredicate(shared_ptr const& left, + query::CompPredicate::OpType op, + shared_ptr const& right) { + return make_shared(left, op, right); +} + +/// Create a FactorOp with a ValueFactor +query::ValueExpr::FactorOp FactorOp(shared_ptr const& factor, query::ValueExpr::Op op) { + return query::ValueExpr::FactorOp(factor, op); +} + +/// Create a FuncExpr +/// args should be instance of shared_ptr to query::ValueExpr. +template +shared_ptr FuncExpr(string const& name, Targs const&... args) { + vector> valueExprVec; + pusher(valueExprVec, args...); + return make_shared(name, valueExprVec); +} + +/// Create a new FromList. Args should be a comma separated list of TableRefPtr. +template +shared_ptr FromList(Targs... args) { + auto tableRefs = make_shared>>(); + pusher(*tableRefs, args...); + return make_shared(tableRefs); +} + +// No need to write a factory function for GroupByTerm; its cosntructor is named consistently with the +// factory functions here, and its ultimate owner wants an instance, not a shared_ptr. +// The 'using' statement is placed here to put the function (that is, class constructor) in alphabetical +// order with the other factory functions to make it as obvious as possible where the GroupByTerm function +// is coming from. +using query::GroupByTerm; + +/// Create a new GroupByClause. Args should be a comma separated list of GroupByTerm. +template +shared_ptr GroupByClause(Targs... args) { + auto terms = make_shared>(); + pusher(*terms, args...); + return make_shared(terms); +} + +/// Create a new HavingClause +shared_ptr HavingClause(shared_ptr const& term) { + return make_shared(term); +} + +/// Create a new InPredicate. Args should be a comma separated list of ValueExpr. +template +shared_ptr InPredicate(shared_ptr const& left, InNotIn in, + Targs const&... args) { + auto valueExprVec = vector>(); + pusher(valueExprVec, args...); + return make_shared(left, valueExprVec, in == NOT_IN); +} + +/// Create a new JoinRef +shared_ptr JoinRef(shared_ptr right, query::JoinRef::Type joinType, + Natural natural, shared_ptr joinSpec) { + bool isNatural = (NATURAL == natural); + return make_shared(right, joinType, isNatural, joinSpec); +} + +/// Create a new JoinSpec +shared_ptr JoinSpec(shared_ptr ref, + shared_ptr const& onTerm) { + return make_shared(ref, onTerm); +} + +/// Create a new LikePredicate with ValueExprPtrs, where `left LIKE right`. +shared_ptr LikePredicate(shared_ptr const& left, Like like, + shared_ptr const& right) { + return make_shared(left, right, NOT_LIKE == like); +} + +/// Create a new NullPredicate +shared_ptr NullPredicate(shared_ptr const& valueExpr, IsNull isNull) { + return make_shared(valueExpr, IS_NOT_NULL == isNull); +} + +/// Create a new OrderByClause. Args should be a comma separated list of OrderByTerm object instances (not +/// shared_ptr) +template +shared_ptr OrderByClause(Targs... args) { + auto orderByTerms = make_shared>(); + pusher(*orderByTerms, args...); + return make_shared(orderByTerms); +} + +/// Create an OrderByTerm with a ValueExprPtr term. +/// Note this does not new an object or create a shared_ptr, as dictated by the OrderByClause interface. +query::OrderByTerm OrderByTerm(shared_ptr const& term, query::OrderByTerm::Order order, + string collate) { + return query::OrderByTerm(term, order, collate); +} + +/// Create a new OrTerm. Args can be a shared_ptr to any kind of object that inherits from BoolTerm. +template +shared_ptr OrTerm(Targs... args) { + vector> terms; + pusher(terms, args...); + return make_shared(terms); +} + +/// Create a new PassTerm with given text. +shared_ptr PassTerm(string const& text) { return make_shared(text); } + +shared_ptr AreaRestrictorBox(std::string const& lonMinDegree, + std::string const& latMinDegree, + std::string const& lonMaxDegree, + std::string const& latMaxDegree) { + return make_shared(lonMinDegree, latMinDegree, lonMaxDegree, latMaxDegree); +} + +shared_ptr AreaRestrictorCircle(std::string const& centerLonDegree, + std::string const& centerLatDegree, + std::string const& radiusDegree) { + return make_shared(centerLonDegree, centerLatDegree, radiusDegree); +} + +shared_ptr AreaRestrictorEllipse(std::string const& centerLonDegree, + std::string const& centerLatDegree, + std::string const& semiMajorAxisAngleArcsec, + std::string const& semiMinorAxisAngleArcsec, + std::string const& positionAngleDegree) { + return make_shared(centerLonDegree, centerLatDegree, + semiMajorAxisAngleArcsec, semiMinorAxisAngleArcsec, + positionAngleDegree); +} + +shared_ptr AreaRestrictorPoly(std::vector const& parameters) { + return make_shared(parameters); +} + +/// Create a new SelectList. Args should be a comma separated list of shared_ptr to ValueExpr. +template +shared_ptr SelectList(Targs... args) { + auto ptr = make_shared>>(); + pusher(*ptr, args...); + return make_shared(ptr); +} + +/// Create a new SelectList with the given members. +shared_ptr SelectStmt(shared_ptr const& selectList, + shared_ptr const& fromList, + shared_ptr const& whereClause, + shared_ptr const& orderByClause, + shared_ptr const& groupByClause, + shared_ptr const& havingClause, + bool hasDistinct, int limit) { + return make_shared(selectList, fromList, whereClause, orderByClause, groupByClause, + havingClause, hasDistinct, limit); +} + +/// Create a new TableRef with the given database, table, alias name, and JoinRefs. Args should +/// be a comma separated list of shared_ptr to JoinRef. +template +shared_ptr TableRef(string const& db, string const& table, const string& alias, + Targs const&... args) { + vector> joinRefs; + pusher(joinRefs, args...); + auto tableRef = make_shared(db, table, alias); + tableRef->addJoins(joinRefs); + return tableRef; +} + +/// Create a new TableRef with the given database, table, and alias name. +shared_ptr TableRef(string const& db, string const& table, const string& alias) { + return make_shared(db, table, alias); +} + +/// Create a new ValueExpr with a ValueFactorPtr. +template +shared_ptr ValueExpr(string alias, Targs const&... factorOps) { + vector factorOpVec; + pusher(factorOpVec, factorOps...); + auto valueExpr = make_shared(factorOpVec); + if (!alias.empty()) { + valueExpr->setAlias(alias); + } + return valueExpr; +} + +/// Create a ValueFactor with a COLUMNREF value. +shared_ptr ValueFactor(shared_ptr const& columnRef) { + return make_shared(columnRef); +} + +/// Create a ValueFactor with a CONST value. +shared_ptr ValueFactor(string const& constVal) { + return make_shared(constVal); +} + +/// Create a ValueFactor with a FUNCTION value. +shared_ptr ValueFactor(query::ValueFactor::Type type, + shared_ptr const& funcExpr) { + if (query::ValueFactor::AGGFUNC == type) { + return query::ValueFactor::newAggFactor(funcExpr); + } else if (query::ValueFactor::FUNCTION == type) { + return query::ValueFactor::newFuncFactor(funcExpr); + } + BOOST_REQUIRE_MESSAGE(false, "ValueFactor with a FuncExpr may only be of type FUNCTION or AGGFUNC"); + return nullptr; +} + +/// Create a ValueFactor with a STAR value. +shared_ptr ValueFactor(Star star, string const& table) { + return query::ValueFactor::newStarFactor(table); +} + +/// Create a ValueFactor with a ValueExpr value. +shared_ptr ValueFactor(shared_ptr valueExpr) { + return query::ValueFactor::newExprFactor(valueExpr); +} + +/// Create a new WhereClause with a given OrTerm for its root term. +shared_ptr WhereClause( + shared_ptr const& orTerm, + shared_ptr const& areaRestrictor = nullptr) { + auto restrictorVec = make_shared(); + if (nullptr != areaRestrictor) { + restrictorVec->push_back(areaRestrictor); + } + return make_shared(orTerm, restrictorVec); +} + +/** + * @brief holds related test data. + * + */ +struct Antlr4TestQueries { + /** + * @brief Construct a new Antlr 4 Test Queries object + * + * @param iQuery The sql to parse and get generated IR. + * @param iCompareStmt a function that creates IR that should be equivalent to the parser-generated IR. + * @param iSerializedQuery The SQL string that should exactly match the string generated by serializing + * the IR. + */ + Antlr4TestQueries(string const& iQuery, function()> const& iCompareStmt, + string const& iSerializedQuery) + : query(iQuery), compareStmt(iCompareStmt), serializedQuery(iSerializedQuery) {} + + /// query to test, that will be turned into a SelectStmt by the andlr4-based parser. + string query; + + /// comparison query, that will be turned into a SelectStmt by the andlr4-based parser and then that will + /// be modified by modFunc + function()> compareStmt; + + /// the query as it should appear after serialization. + string serializedQuery; +}; + +ostream& operator<<(ostream& os, Antlr4TestQueries const& i) { + os << "Antlr4TestQueries(" << i.query << "...)"; + return os; +} + +static const vector ANTLR4_TEST_QUERIES = { + + // tests NOT LIKE (which is 'NOT LIKE', different than 'NOT' and 'LIKE' operators separately) + Antlr4TestQueries( + "SELECT sce.filterId, sce.filterName " + "FROM Science_Ccd_Exposure AS sce " + "WHERE (sce.visit = 887404831) AND (sce.raftName = '3,3') AND (sce.ccdName LIKE '%') " + "ORDER BY filterId", // case01/queries/0012.1_raftAndCcd.sql + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "sce", "filterId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "sce", "filterName")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Science_Ccd_Exposure", "sce")), + WhereClause(OrTerm(AndTerm( + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "sce", "visit")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor("887404831"), + query::ValueExpr::NONE))))))), + PassTerm(")")), + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "sce", + "raftName")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor("'3,3'"), + query::ValueExpr::NONE))))))), + PassTerm(")")), + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + LikePredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "sce", "ccdName")), + query::ValueExpr::NONE)), + LIKE, + ValueExpr("", + FactorOp(ValueFactor("'%'"), + query::ValueExpr::NONE))))))), + PassTerm(")"))))), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, // Group By Clause + nullptr, 0, -1); + }, + "SELECT `sce`.`filterId`,`sce`.`filterName` " + "FROM `Science_Ccd_Exposure` AS `sce` " + "WHERE `sce`.`visit`=887404831 AND `sce`.`raftName`='3,3' AND `sce`.`ccdName` LIKE '%' " + "ORDER BY `filterId` ASC"), + + // tests a query with 2 items in the GROUP BY expression + Antlr4TestQueries( + "SELECT objectId, filterId FROM Source GROUP BY objectId, filterId;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "")), + nullptr, // WhereClause + nullptr, // OrderByClause + GroupByClause( + GroupByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ""), + GroupByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterId")), + query::ValueExpr::NONE)), + "")), + nullptr, 0, -1); + }, + "SELECT `objectId`,`filterId` FROM `Source` GROUP BY `objectId`,`filterId`"), + // test SELECT MAX... + Antlr4TestQueries( + "select max(filterID) from Filter", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "", + FactorOp(ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("max", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", "filterID")), + query::ValueExpr::NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Filter", "")), nullptr, nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT max(`filterID`) FROM `Filter`"), + // test SELECT MIN... + Antlr4TestQueries( + "select min(filterID) from Filter", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "", + FactorOp(ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("min", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", "filterID")), + query::ValueExpr::NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Filter", "")), nullptr, nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT min(`filterID`) FROM `Filter`"), + // test WHERE a = b + Antlr4TestQueries( + "SELECT objectId,iauId,ra_PS FROM Object WHERE objectId = 430213989148129", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "iauId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("430213989148129"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,`iauId`,`ra_PS` FROM `Object` WHERE `objectId`=430213989148129"), + // test WHERE a IN (...) + Antlr4TestQueries( + "select ra_Ps, decl_PS FROM Object WHERE objectId IN (390034570102582, 396210733076852, " + "393126946553816, 390030275138483)", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_Ps")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "decl_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, InPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", + "objectId")), + query::ValueExpr::NONE)), + IN, + ValueExpr("", FactorOp(ValueFactor("390034570102582"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("396210733076852"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("393126946553816"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("390030275138483"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_Ps`,`decl_PS` FROM `Object` WHERE `objectId` " + "IN(390034570102582,396210733076852,393126946553816,390030275138483)"), + // test SELECT * + Antlr4TestQueries( + "SELECT * FROM Object WHERE objectId = 430213989000", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(STAR, ""), query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("430213989000"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT * FROM `Object` WHERE `objectId`=430213989000"), + // test SELECT a.b + // test JOIN tablename tablealias + // test USING (a) + // test WHERE a.b ... + Antlr4TestQueries( + "SELECT s.ra, s.decl, o.raRange, o.declRange FROM Object o JOIN Source s USING (objectId) " + "WHERE o.objectId = 390034570102582 AND o.latestObsTime = s.taiMidPoint", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s", "ra")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s", "decl")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "o", "raRange")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "o", "declRange")), + query::ValueExpr::NONE))), + FromList(TableRef( + "", "Object", "o", + JoinRef(TableRef("", "Source", "s"), query::JoinRef::DEFAULT, NOT_NATURAL, + JoinSpec(ColumnRef("", "", "objectId"), nullptr)))), + WhereClause(OrTerm(AndTerm( + BoolFactor(IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "o", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("390034570102582"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "o", "latestObsTime")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "s", "taiMidPoint")), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `s`.`ra`,`s`.`decl`,`o`.`raRange`,`o`.`declRange` FROM `Object` AS `o` JOIN `Source` " + "AS `s` USING(`objectId`) " + "WHERE `o`.`objectId`=390034570102582 AND `o`.`latestObsTime`=`s`.`taiMidPoint`"), + // test ORDER BY + Antlr4TestQueries( + "SELECT sourceId, objectId FROM Source WHERE objectId = 386942193651348 ORDER BY sourceId;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "sourceId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("386942193651348"), + query::ValueExpr::NONE))))))), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "sourceId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, nullptr, 0, -1); + }, + "SELECT `sourceId`,`objectId` FROM `Source` WHERE `objectId`=386942193651348 ORDER BY " + "`sourceId` ASC"), + // test COUNT(*) AS alias + Antlr4TestQueries( + "select COUNT(*) AS N FROM Source WHERE objectId IN (386950783579546, 386942193651348)", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "N", + FactorOp(ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("COUNT", + ValueExpr("", + FactorOp(ValueFactor(STAR, ""), + query::ValueExpr::NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, InPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", + "objectId")), + query::ValueExpr::NONE)), + IN, + ValueExpr("", FactorOp(ValueFactor("386950783579546"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("386942193651348"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT COUNT(*) AS `N` FROM `Source` WHERE `objectId` IN(386950783579546,386942193651348)"), + // test LIKE + // test WHERE a and b + Antlr4TestQueries( + "SELECT sce.filterId, sce.filterName FROM Science_Ccd_Exposure AS sce " + "WHERE (sce.visit = 887404831) AND (sce.raftName = '3,3') AND (sce.ccdName LIKE '%') ORDER " + "BY filterId", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "sce", "filterId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "sce", "filterName")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Science_Ccd_Exposure", "sce")), + WhereClause(OrTerm(AndTerm( + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "sce", "visit")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor("887404831"), + query::ValueExpr::NONE))))))), + PassTerm(")")), + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "sce", + "raftName")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor("'3,3'"), + query::ValueExpr::NONE))))))), + PassTerm(")")), + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + LikePredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "sce", "ccdName")), + query::ValueExpr::NONE)), + LIKE, + ValueExpr("", + FactorOp(ValueFactor("'%'"), + query::ValueExpr::NONE))))))), + PassTerm(")"))))), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, nullptr, 0, -1); + }, + "SELECT `sce`.`filterId`,`sce`.`filterName` FROM `Science_Ccd_Exposure` AS `sce` " + "WHERE `sce`.`visit`=887404831 AND `sce`.`raftName`='3,3' AND `sce`.`ccdName` LIKE '%' " + "ORDER BY `filterId` ASC"), + // test LIMIT + Antlr4TestQueries( + "SELECT sce.filterId, sce.filterName FROM Science_Ccd_Exposure AS sce " + "WHERE (sce.visit = 887404831) AND (sce.raftName = '3,3') AND (sce.ccdName LIKE '%') ORDER " + "BY filterId LIMIT 5", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "sce", "filterId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "sce", "filterName")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Science_Ccd_Exposure", "sce")), + WhereClause(OrTerm(AndTerm( + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "sce", "visit")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor("887404831"), + query::ValueExpr::NONE))))))), + PassTerm(")")), + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "sce", + "raftName")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor("'3,3'"), + query::ValueExpr::NONE))))))), + PassTerm(")")), + BoolFactor( + IS, PassTerm("("), + BoolTermFactor(OrTerm(AndTerm(BoolFactor( + IS, + LikePredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "sce", "ccdName")), + query::ValueExpr::NONE)), + LIKE, + ValueExpr("", + FactorOp(ValueFactor("'%'"), + query::ValueExpr::NONE))))))), + PassTerm(")"))))), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, nullptr, 0, 5); + }, + "SELECT `sce`.`filterId`,`sce`.`filterName` " + "FROM `Science_Ccd_Exposure` AS `sce` " + "WHERE `sce`.`visit`=887404831 AND `sce`.`raftName`='3,3' AND `sce`.`ccdName` LIKE '%' " + "ORDER BY `filterId` ASC LIMIT 5"), + // test qserv_areaspec_box + // test scisql UDF + // test BETWEEN a and b + Antlr4TestQueries( + "SELECT COUNT(*) as OBJ_COUNT FROM Object " + "WHERE qserv_areaspec_box(0.1, -6, 4, 6) " + "AND scisql_fluxToAbMag(zFlux_PS) BETWEEN 20 AND 24 " + "AND scisql_fluxToAbMag(gFlux_PS)-scisql_fluxToAbMag(rFlux_PS) BETWEEN 0.1 AND 0.9 " + "AND scisql_fluxToAbMag(iFlux_PS)-scisql_fluxToAbMag(zFlux_PS) BETWEEN 0.1 AND 1.0", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "OBJ_COUNT", + FactorOp(ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("COUNT", + ValueExpr("", + FactorOp(ValueFactor(STAR, ""), + query::ValueExpr::NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause( + OrTerm(AndTerm( + BoolFactor( + IS, + BetweenPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor:: + FUNCTION, + FuncExpr( + "scisql_" + "fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "zFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + BETWEEN, + ValueExpr("", FactorOp(ValueFactor("20"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("24"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + BetweenPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor:: + FUNCTION, + FuncExpr( + "scisql_" + "fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "gFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::MINUS), + FactorOp( + ValueFactor( + query::ValueFactor:: + FUNCTION, + FuncExpr( + "scisql_" + "fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "rFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + BETWEEN, + ValueExpr("", FactorOp(ValueFactor("0.1"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("0.9"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + BetweenPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor:: + FUNCTION, + FuncExpr( + "scisql_" + "fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "iFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::MINUS), + FactorOp( + ValueFactor( + query::ValueFactor:: + FUNCTION, + FuncExpr( + "scisql_" + "fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "zFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + BETWEEN, + ValueExpr("", FactorOp(ValueFactor("0.1"), + query::ValueExpr::NONE)), + ValueExpr("", + FactorOp(ValueFactor("1.0"), + query::ValueExpr::NONE)))))), + AreaRestrictorBox("0.1", "-6", "4", "6")), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT COUNT(*) AS `OBJ_COUNT` " + "FROM `Object` WHERE qserv_areaspec_box(0.1,-6,4,6) scisql_fluxToAbMag(`zFlux_PS`) BETWEEN " + "20 AND 24 " + "AND (scisql_fluxToAbMag(`gFlux_PS`)-scisql_fluxToAbMag(`rFlux_PS`)) BETWEEN 0.1 AND 0.9 " + "AND (scisql_fluxToAbMag(`iFlux_PS`)-scisql_fluxToAbMag(`zFlux_PS`)) BETWEEN 0.1 AND 1"), + // test AVG + Antlr4TestQueries( + "SELECT objectId, AVG(ra_PS) as ra FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) GROUP " + "BY objectId ORDER BY ra", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr( + "ra", + FactorOp( + ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("AVG", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", + "ra_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "3", "10")), + OrderByClause( + OrderByTerm(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + GroupByClause(GroupByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + "")), + nullptr, 0, -1); + }, + "SELECT `objectId`,AVG(`ra_PS`) AS `ra` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10) " + "GROUP BY `objectId` ORDER BY `ra` ASC"), + // test multiple JOIN + // test ASC + Antlr4TestQueries( + "SELECT objectId, taiMidPoint, scisql_fluxToAbMag(psfFlux) " + "FROM Source JOIN Object USING(objectId) JOIN Filter USING(filterId) " + "WHERE qserv_areaspec_box(355, 0, 360, 20) AND filterName = 'g' ORDER BY objectId, " + "taiMidPoint ASC", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "taiMidPoint")), + query::ValueExpr::NONE)), + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr("scisql_fluxToAbMag", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", + "psfFlux")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef( + "", "Source", "", + JoinRef(TableRef("", "Object", ""), query::JoinRef::DEFAULT, NOT_NATURAL, + JoinSpec(ColumnRef("", "", "objectId"), nullptr)), + JoinRef(TableRef("", "Filter", ""), query::JoinRef::DEFAULT, NOT_NATURAL, + JoinSpec(ColumnRef("", "", "filterId"), nullptr)))), + WhereClause( + OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "filterName")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("'g'"), + query::ValueExpr::NONE)))))), + AreaRestrictorBox("355", "0", "360", "20")), + OrderByClause( + OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, ""), + OrderByTerm(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", + "taiMidPoint")), + query::ValueExpr::NONE)), + query::OrderByTerm::ASC, "")), + nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,`taiMidPoint`,scisql_fluxToAbMag(`psfFlux`) " + "FROM `Source` JOIN `Object` USING(`objectId`) JOIN `Filter` USING(`filterId`) WHERE " + "qserv_areaspec_box(355,0,360,20)`filterName`='g' ORDER BY `objectId` ASC, `taiMidPoint` " + "ASC"), + // test hex + Antlr4TestQueries( + "SELECT scienceCcdExposureId, hex(poly) as hexPoly FROM Science_Ccd_Exposure;", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "scienceCcdExposureId")), + query::ValueExpr::NONE)), + ValueExpr( + "hexPoly", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr("hex", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", + "poly")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Science_Ccd_Exposure", "")), nullptr, nullptr, nullptr, + nullptr, 0, -1); + }, + "SELECT `scienceCcdExposureId`,hex(`poly`) AS `hexPoly` FROM `Science_Ccd_Exposure`"), + // test case insensitivity + Antlr4TestQueries( + "SELECT objectId FROM Object WHERE QsErV_ArEaSpEc_BoX(0, 0, 3, 10) ORDER BY objectId", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "3", "10")), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10) ORDER BY `objectId` ASC"), + // test qserv_areaspec_box wrapped in an equality comparison (form used in some integration tests) + Antlr4TestQueries( + "SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "3", "10")), nullptr, nullptr, + nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10)"), + Antlr4TestQueries( + "SELECT objectId FROM Object WHERE 1 = qserv_areaspec_box(0, 0, 3, 10)", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "3", "10")), nullptr, nullptr, + nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10)"), + // test null-safe equals operator <> + Antlr4TestQueries( + "SELECT o1.objectId AS objId1, o2.objectId AS objId2, scisql_angSep(o1.ra_PS, o1.decl_PS, " + "o2.ra_PS, o2.decl_PS) AS distance FROM Object o1, Object o2 WHERE qserv_areaspec_box(1.2, " + "3.3, 1.3, 3.4) AND scisql_angSep(o1.ra_PS, o1.decl_PS, o2.ra_PS, o2.decl_PS) < 0.016 AND " + "o1.objectId <> o2.objectId", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("objId1", FactorOp(ValueFactor(ColumnRef("", "o1", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("objId2", FactorOp(ValueFactor(ColumnRef("", "o2", "objectId")), + query::ValueExpr::NONE)), + ValueExpr( + "distance", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_angSep", + ValueExpr( + "", + FactorOp(ValueFactor(ColumnRef( + "", "o1", + "ra_PS")), + query::ValueExpr::NONE)), + ValueExpr( + "", + FactorOp(ValueFactor(ColumnRef( + "", "o1", + "decl_PS")), + query::ValueExpr::NONE)), + ValueExpr( + "", + FactorOp(ValueFactor(ColumnRef( + "", "o2", + "ra_PS")), + query::ValueExpr::NONE)), + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "o2", + "decl_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "o1"), TableRef("", "Object", "o2")), + WhereClause( + OrTerm(AndTerm( + BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor:: + FUNCTION, + FuncExpr( + "scisql_angSep", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "o1", + "ra_PS")), + query::ValueExpr:: + NONE)), + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "o1", + "decl_PS")), + query::ValueExpr:: + NONE)), + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "o2", + "ra_PS")), + query::ValueExpr:: + NONE)), + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "o2", + "decl_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("0.016"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "o1", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::NOT_EQUALS_OP, + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "o2", "objectId")), + query::ValueExpr::NONE)))))), + AreaRestrictorBox("1.2", "3.3", "1.3", "3.4")), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `o1`.`objectId` AS `objId1`,`o2`.`objectId` AS " + "`objId2`,scisql_angSep(`o1`.`ra_PS`,`o1`.`decl_PS`,`o2`.`ra_PS`,`o2`.`decl_PS`) AS " + "`distance` " + "FROM `Object` AS `o1`,`Object` AS `o2` WHERE qserv_areaspec_box(1.2,3.3,1.3,3.4) " + "scisql_angSep(`o1`.`ra_PS`,`o1`.`decl_PS`,`o2`.`ra_PS`,`o2`.`decl_PS`)<0.016 " + "AND `o1`.`objectId`<>`o2`.`objectId`"), + // test less-than operator + Antlr4TestQueries( + "SELECT objectId FROM Object WHERE " + "scisql_fluxToAbMag(uFlux_PS)-scisql_fluxToAbMag(gFlux_PS) < 2.0 AND " + "scisql_fluxToAbMag(gFlux_PS)-scisql_fluxToAbMag(rFlux_PS) < 0.1 AND " + "scisql_fluxToAbMag(rFlux_PS)-scisql_fluxToAbMag(iFlux_PS) > -0.8 AND " + "scisql_fluxToAbMag(iFlux_PS)-scisql_fluxToAbMag(zFlux_PS) < 1.4", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm( + BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "uFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::MINUS), + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "gFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("2.0"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "gFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::MINUS), + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "rFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("0.1"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "rFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::MINUS), + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "iFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("-0.8"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "iFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::MINUS), + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr( + "scisql_fluxToAbMag", + ValueExpr( + "", + FactorOp( + ValueFactor(ColumnRef( + "", + "", + "zFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1.4"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` " + "WHERE (scisql_fluxToAbMag(`uFlux_PS`)-scisql_fluxToAbMag(`gFlux_PS`))<2 " + "AND (scisql_fluxToAbMag(`gFlux_PS`)-scisql_fluxToAbMag(`rFlux_PS`))<0.1 " + "AND (scisql_fluxToAbMag(`rFlux_PS`)-scisql_fluxToAbMag(`iFlux_PS`))>-0.8 " + "AND (scisql_fluxToAbMag(`iFlux_PS`)-scisql_fluxToAbMag(`zFlux_PS`))<1.4"), + // test greater-than operator + Antlr4TestQueries( + "SELECT COUNT(*) AS OBJ_COUNT FROM Object WHERE gFlux_PS>1e-25", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "OBJ_COUNT", + FactorOp(ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("COUNT", + ValueExpr("", + FactorOp(ValueFactor(STAR, ""), + query::ValueExpr::NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "gFlux_PS")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1e-25"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT COUNT(*) AS `OBJ_COUNT` FROM `Object` WHERE `gFlux_PS`>1e-25"), + // test DISTINCT + Antlr4TestQueries( + "SELECT DISTINCT tract,patch,filterName FROM DeepCoadd ;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "tract")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "patch")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterName")), + query::ValueExpr::NONE))), + FromList(TableRef("", "DeepCoadd", "")), nullptr, nullptr, nullptr, nullptr, 1, + -1); + }, + "SELECT DISTINCT `tract`,`patch`,`filterName` FROM `DeepCoadd`"), + // test value + int + Antlr4TestQueries( + "SELECT s.ra, s.decl FROM Object o JOIN Source s USING (objectId) WHERE o.objectId = " + "433327840429024 AND o.latestObsTime BETWEEN s.taiMidPoint - 300 AND s.taiMidPoint + 300", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s", "ra")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s", "decl")), + query::ValueExpr::NONE))), + FromList(TableRef( + "", "Object", "o", + JoinRef(TableRef("", "Source", "s"), query::JoinRef::DEFAULT, NOT_NATURAL, + JoinSpec(ColumnRef("", "", "objectId"), nullptr)))), + WhereClause(OrTerm(AndTerm( + BoolFactor(IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "o", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("433327840429024"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + BetweenPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "o", "latestObsTime")), + query::ValueExpr::NONE)), + BETWEEN, + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "s", + "taiMidPoint")), + query::ValueExpr::MINUS), + FactorOp(ValueFactor("300"), + query::ValueExpr::NONE)), + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "s", + "taiMidPoint")), + query::ValueExpr::PLUS), + FactorOp(ValueFactor("300"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `s`.`ra`,`s`.`decl` " + "FROM `Object` AS `o` JOIN `Source` AS `s` USING(`objectId`) " + "WHERE `o`.`objectId`=433327840429024 AND `o`.`latestObsTime` BETWEEN(`s`.`taiMidPoint`-300) " + "AND (`s`.`taiMidPoint`+300)"), + // test function in select list + Antlr4TestQueries( + "SELECT f(one)/f2(two) FROM Object where qserv_areaspec_box(0,0,1,1);", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "", + FactorOp(ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr("f", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", "one")), + query::ValueExpr::NONE)))), + query::ValueExpr::DIVIDE), + FactorOp(ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr("f2", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", "two")), + query::ValueExpr::NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(nullptr, AreaRestrictorBox("0", "0", "1", "1")), nullptr, nullptr, + nullptr, 0, -1); + }, + "SELECT (f(`one`)/f2(`two`)) FROM `Object` WHERE qserv_areaspec_box(0,0,1,1)"), + // test NATURAL LEFT JOIN + Antlr4TestQueries( + "SELECT s1.foo, s2.foo AS s2_foo FROM Source s1 NATURAL LEFT JOIN Source s2 WHERE s1.bar = " + "s2.bar;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "foo")), + query::ValueExpr::NONE)), + ValueExpr("s2_foo", FactorOp(ValueFactor(ColumnRef("", "s2", "foo")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "s1", + JoinRef(TableRef("", "Source", "s2"), query::JoinRef::LEFT, + NATURAL, nullptr))), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "bar")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s2", "bar")), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `s1`.`foo`,`s2`.`foo` AS `s2_foo` FROM `Source` AS `s1` NATURAL LEFT OUTER JOIN " + "`Source` AS `s2` WHERE `s1`.`bar`=`s2`.`bar`"), + // test NATURAL RIGHT JOIN + Antlr4TestQueries( + "SELECT s1.foo, s2.foo AS s2_foo FROM Source s1 NATURAL RIGHT JOIN Source s2 WHERE s1.bar = " + "s2.bar;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "foo")), + query::ValueExpr::NONE)), + ValueExpr("s2_foo", FactorOp(ValueFactor(ColumnRef("", "s2", "foo")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "s1", + JoinRef(TableRef("", "Source", "s2"), query::JoinRef::RIGHT, + NATURAL, nullptr))), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "bar")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s2", "bar")), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `s1`.`foo`,`s2`.`foo` AS `s2_foo` FROM `Source` AS `s1` NATURAL RIGHT OUTER JOIN " + "`Source` AS `s2` WHERE `s1`.`bar`=`s2`.`bar`"), + // test NATURAL JOIN + Antlr4TestQueries( + "SELECT s1.foo, s2.foo AS s2_foo FROM Source s1 NATURAL JOIN Source s2 WHERE s1.bar = " + "s2.bar;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "foo")), + query::ValueExpr::NONE)), + ValueExpr("s2_foo", FactorOp(ValueFactor(ColumnRef("", "s2", "foo")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "s1", + JoinRef(TableRef("", "Source", "s2"), query::JoinRef::DEFAULT, + NATURAL, nullptr))), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "bar")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s2", "bar")), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `s1`.`foo`,`s2`.`foo` AS `s2_foo` FROM `Source` AS `s1` NATURAL JOIN `Source` AS " + "`s2` WHERE `s1`.`bar`=`s2`.`bar`"), + // test CROSS JOIN + Antlr4TestQueries( + "SELECT * FROM Source s1 CROSS JOIN Source s2 WHERE s1.bar = s2.bar;", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(STAR, ""), query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "s1", + JoinRef(TableRef("", "Source", "s2"), query::JoinRef::CROSS, + NOT_NATURAL, nullptr))), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s1", "bar")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "s2", "bar")), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT * FROM `Source` AS `s1` CROSS JOIN `Source` AS `s2` WHERE `s1`.`bar`=`s2`.`bar`"), + // test = operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId = 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`=417857368235490"), + // test <> operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId <> 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::NOT_EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`<>417857368235490"), + // test != operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId != 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::NOT_EQUALS_OP_ALT, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`<>417857368235490"), + // test < operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId < 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`<417857368235490"), + // test <= operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId <= 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OR_EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`<=417857368235490"), + // test >= operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId >= 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OR_EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`>=417857368235490"), + // test >= operator + Antlr4TestQueries( + "SELECT ra_PS FROM Object WHERE objectId > 417857368235490;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `ra_PS` FROM `Object` WHERE `objectId`>417857368235490"), + // test IS NULL + Antlr4TestQueries( + "select objectId from Object where zFlags is NULL;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, NullPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", + "zFlags")), + query::ValueExpr::NONE)), + IS_NULL))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE `zFlags` IS NULL"), + // test IS NOT NULL + Antlr4TestQueries( + "select objectId from Object where zFlags is NOT NULL;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, NullPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", + "zFlags")), + query::ValueExpr::NONE)), + IS_NOT_NULL))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE `zFlags` IS NOT NULL"), + // tests NOT LIKE (which is 'NOT LIKE', different than 'NOT' and 'LIKE' operators separately) + Antlr4TestQueries( + "SELECT filterId FROM Filter WHERE filterName NOT LIKE 'Z'", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "filterId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Filter", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, LikePredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "filterName")), + query::ValueExpr::NONE)), + NOT_LIKE, + ValueExpr("", FactorOp(ValueFactor("'Z'"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `filterId` FROM `Filter` WHERE `filterName` NOT LIKE 'Z'"), + // tests quoted IDs + Antlr4TestQueries( + "SELECT `Source`.`sourceId`, `Source`.`objectId` From Source WHERE `Source`.`objectId` IN " + "(386942193651348) ORDER BY `Source`.`sourceId`", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "Source", "sourceId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "Source", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Source", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, InPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "Source", + "objectId")), + query::ValueExpr::NONE)), + IN, + ValueExpr("", FactorOp(ValueFactor("386942193651348"), + query::ValueExpr::NONE))))))), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "Source", "sourceId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, nullptr, 0, -1); + }, + "SELECT `Source`.`sourceId`,`Source`.`objectId` FROM `Source` WHERE `Source`.`objectId` " + "IN(386942193651348) ORDER BY `Source`.`sourceId` ASC"), + + // tests the NOT BETWEEN operator + Antlr4TestQueries( + "SELECT objectId,ra_PS FROM Object WHERE objectId NOT BETWEEN 417857368235490 AND " + "420949744686724", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + BetweenPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + NOT_BETWEEN, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("420949744686724"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,`ra_PS` FROM `Object` WHERE `objectId` NOT BETWEEN 417857368235490 AND " + "420949744686724"), + + // tests the && operator. + // The Qserv IR converts && to AND as a result of the IR structure and how it serializes it to string. + Antlr4TestQueries( + "select objectId, iRadius_SG, ra_PS, decl_PS from Object where iRadius_SG > .5 && ra_PS < 2 " + "&& decl_PS < 3;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "iRadius_SG")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "decl_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm( + BoolFactor(IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "iRadius_SG")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor(".5"), + query::ValueExpr::NONE)))), + BoolFactor(IS, CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "ra_PS")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("2"), + query::ValueExpr::NONE)))), + BoolFactor(IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "decl_PS")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("3"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,`iRadius_SG`,`ra_PS`,`decl_PS` FROM `Object` WHERE `iRadius_SG`>0.5 AND " + "`ra_PS`<2 AND `decl_PS`<3"), + + // tests the || operator. + // The Qserv IR converts || to OR as a result of the IR structure and how it serializes it to string. + Antlr4TestQueries( + "select objectId from Object where objectId < 400000000000000 || objectId > 430000000000000 " + "ORDER BY objectId;", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm( + AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("400000000000000"), + query::ValueExpr::NONE))))), + AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "objectId")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("430000000000000"), + query::ValueExpr::NONE))))))), + OrderByClause(OrderByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE `objectId`<400000000000000 OR " + "`objectId`>430000000000000 ORDER BY `objectId` ASC"), + + // tests NOT IN in the InPredicate + Antlr4TestQueries( + "SELECT objectId, ra_PS FROM Object WHERE objectId NOT IN (417857368235490, 420949744686724, " + "420954039650823);", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, InPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", + "objectId")), + query::ValueExpr::NONE)), + NOT_IN, + ValueExpr("", FactorOp(ValueFactor("417857368235490"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("420949744686724"), + query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor("420954039650823"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,`ra_PS` FROM `Object` WHERE `objectId` NOT " + "IN(417857368235490,420949744686724,420954039650823)"), + + // tests the modulo operator + Antlr4TestQueries( + "select objectId, ra_PS % 3, decl_PS from Object where ra_PS % 3 > 1.5", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::MODULO), + FactorOp(ValueFactor("3"), query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "decl_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::MODULO), + FactorOp(ValueFactor("3"), query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1.5"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,(`ra_PS`% 3),`decl_PS` FROM `Object` WHERE (`ra_PS`% 3)>1.5"), + + // tests the MOD operator + Antlr4TestQueries( + "select objectId, ra_PS MOD 3, decl_PS from Object where ra_PS MOD 3 > 1.5", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::MOD), + FactorOp(ValueFactor("3"), query::ValueExpr::NONE)), + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "decl_PS")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::MOD), + FactorOp(ValueFactor("3"), query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1.5"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId`,(`ra_PS` MOD 3),`decl_PS` FROM `Object` WHERE (`ra_PS` MOD 3)>1.5"), + + // tests the DIV operator + Antlr4TestQueries( + "SELECT objectId from Object where ra_PS DIV 2 > 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::DIV), + FactorOp(ValueFactor("2"), query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE (`ra_PS` DIV 2)>1"), + + // tests the & operator + Antlr4TestQueries( + "SELECT objectId from Object where objectID & 1 = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "objectID")), + query::ValueExpr::BIT_AND), + FactorOp(ValueFactor("1"), query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE (`objectID`&1)=1"), + + // tests the | operator + Antlr4TestQueries( + "SELECT objectId from Object where objectID | 1 = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "objectID")), + query::ValueExpr::BIT_OR), + FactorOp(ValueFactor("1"), query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE (`objectID`|1)=1"), + + // tests the << operator + Antlr4TestQueries( + "SELECT objectId from Object where objectID << 10 = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "objectID")), + query::ValueExpr::BIT_SHIFT_LEFT), + FactorOp(ValueFactor("10"), query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE (`objectID`<<10)=1"), + + // tests the >> operator + Antlr4TestQueries( + "SELECT objectId from Object where objectID >> 10 = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "objectID")), + query::ValueExpr::BIT_SHIFT_RIGHT), + FactorOp(ValueFactor("10"), query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE (`objectID`>>10)=1"), + + // tests the ^ operator + Antlr4TestQueries( + "SELECT objectId from Object where objectID ^ 1 = 1", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS, CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef("", "", "objectID")), + query::ValueExpr::BIT_XOR), + FactorOp(ValueFactor("1"), query::ValueExpr::NONE)), + query::CompPredicate::EQUALS_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` WHERE (`objectID`^1)=1"), + + // tests NOT with a BoolFactor + Antlr4TestQueries( + "select * from Filter where NOT filterId > 1 AND filterId < 6", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(STAR, ""), query::ValueExpr::NONE))), + FromList(TableRef("", "Filter", "")), + WhereClause(OrTerm(AndTerm( + BoolFactor( + IS_NOT, + CompPredicate(ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "filterId")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE)))), + BoolFactor(IS, + CompPredicate( + ValueExpr("", FactorOp(ValueFactor(ColumnRef( + "", "", "filterId")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("6"), + query::ValueExpr::NONE))))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT * FROM `Filter` WHERE NOT `filterId`>1 AND `filterId`<6"), + + // tests NOT with an AND term + Antlr4TestQueries( + "select * from Filter where NOT (filterId > 1 AND filterId < 6)", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(STAR, ""), query::ValueExpr::NONE))), + FromList(TableRef("", "Filter", "")), + WhereClause(OrTerm(AndTerm(BoolFactor( + IS_NOT, PassTerm("("), + BoolTermFactor(AndTerm( + BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", "filterId")), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE)))), + BoolFactor( + IS, + CompPredicate( + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", "filterId")), + query::ValueExpr::NONE)), + query::CompPredicate::LESS_THAN_OP, + ValueExpr("", + FactorOp(ValueFactor("6"), + query::ValueExpr::NONE)))))), + PassTerm(")"))))), + nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT * FROM `Filter` WHERE NOT(`filterId`>1 AND `filterId`<6)"), + + // tests expression with alias in select list + Antlr4TestQueries( + "SELECT objectId - 1 AS o FROM Object", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr( + "o", + FactorOp(ValueFactor(ColumnRef(TableRef("", "", ""), "objectId")), + query::ValueExpr::MINUS), + FactorOp(ValueFactor("1"), query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), nullptr, nullptr, nullptr, nullptr, 0, -1); + }, + "SELECT (`objectId`-1) AS `o` FROM `Object`"), +}; + +BOOST_DATA_TEST_CASE(hyrise_test, ANTLR4_TEST_QUERIES, queryInfo) { + query::SelectStmt::Ptr selectStatement; + BOOST_REQUIRE_NO_THROW(selectStatement = ccontrol::ParseRunner::makeSelectStmt(queryInfo.query)); + BOOST_REQUIRE(selectStatement != nullptr); + // Verify the Hyrise parser renders the SQL form we expect. + std::string serializedQuery; + BOOST_REQUIRE_NO_THROW(serializedQuery = selectStatement->getQueryTemplate().sqlFragment()); + std::string expectedSerializedQuery = + (queryInfo.serializedQuery != "" ? queryInfo.serializedQuery : queryInfo.query); + BOOST_REQUIRE_EQUAL(serializedQuery, expectedSerializedQuery); +} + +BOOST_AUTO_TEST_CASE(set_session_var_test) { + auto parser = ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 0;"); + auto uq = parser.getUserQuery(); + auto setQuery = std::static_pointer_cast(uq); + BOOST_REQUIRE_EQUAL(setQuery->varName(), "QSERV_ROW_COUNTER_OPTIMIZATION"); + BOOST_REQUIRE_EQUAL(setQuery->varValue(), "0"); + + auto parser1 = ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 1;"); + uq = parser1.getUserQuery(); + setQuery = std::static_pointer_cast(uq); + BOOST_REQUIRE_EQUAL(setQuery->varName(), "QSERV_ROW_COUNTER_OPTIMIZATION"); + BOOST_REQUIRE_EQUAL(setQuery->varValue(), "1"); + + // Verify that bool vals (not handled) are explicity rejected (to prevent a case where a + // non-zero value "FALSE" evaluates to ON) + BOOST_CHECK_THROW(ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = FALSE;"), + parser::adapter_order_error); + BOOST_CHECK_THROW(ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = TRUE;"), + parser::adapter_order_error); +} + +BOOST_AUTO_TEST_SUITE_END() From 892c3c3c568a6440fbdf76278864b85f2af6935e Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Wed, 17 Jun 2026 13:27:44 -0700 Subject: [PATCH 04/19] Add parser stress test and .sql corpus --- src/ccontrol/CMakeLists.txt | 5 + src/ccontrol/testParserCorpus.cc | 87 + src/ccontrol/testdata/parser-corpus/README.md | 9 + .../testdata/parser-corpus/q01_small.sql | 3 + .../testdata/parser-corpus/q02_medium.sql | 111 ++ .../testdata/parser-corpus/q03_original.sql | 1 + .../testdata/parser-corpus/q03_stripped.sql | 1 + .../parser-corpus/q04_object_table_wide.sql | 859 ++++++++ .../q05_q3_wider_expressions.sql | 1721 +++++++++++++++++ .../q06_object_table_aggregates.sql | 703 +++++++ .../q07_object_table_predicate_stress.sql | 504 +++++ .../q08_object_source_join_wide.sql | 610 ++++++ .../parser-corpus/q09_q3_expression_dense.sql | 265 +++ .../parser-corpus/q10_having_limit.sql | 17 + .../q11_join_using_time_window.sql | 22 + .../q12_spatial_operator_mix.sql | 19 + 16 files changed, 4937 insertions(+) create mode 100644 src/ccontrol/testParserCorpus.cc create mode 100644 src/ccontrol/testdata/parser-corpus/README.md create mode 100644 src/ccontrol/testdata/parser-corpus/q01_small.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q02_medium.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q03_original.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q03_stripped.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q04_object_table_wide.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q05_q3_wider_expressions.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q06_object_table_aggregates.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q07_object_table_predicate_stress.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q08_object_source_join_wide.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q09_q3_expression_dense.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q10_having_limit.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q11_join_using_time_window.sql create mode 100644 src/ccontrol/testdata/parser-corpus/q12_spatial_operator_mix.sql diff --git a/src/ccontrol/CMakeLists.txt b/src/ccontrol/CMakeLists.txt index 8db0301324..4b8bc681e2 100644 --- a/src/ccontrol/CMakeLists.txt +++ b/src/ccontrol/CMakeLists.txt @@ -65,9 +65,14 @@ ENDFUNCTION() ccontrol_tests( testCControl + testParserCorpus testUserQueryType ) +target_compile_definitions(testParserCorpus PRIVATE + QSERV_PARSER_CORPUS_DIR="${CMAKE_CURRENT_SOURCE_DIR}/testdata/parser-corpus" +) + if(QSERV_USE_HYRISE_SQL_PARSER) ccontrol_tests( testHyriseGeneratedIR diff --git a/src/ccontrol/testParserCorpus.cc b/src/ccontrol/testParserCorpus.cc new file mode 100644 index 0000000000..2afbf3a08f --- /dev/null +++ b/src/ccontrol/testParserCorpus.cc @@ -0,0 +1,87 @@ +// -*- LSST-C++ -*- +/* + * LSST Data Management System + * Copyright 2026 LSST. + * + * This product includes software developed by the + * LSST Project (http://www.lsst.org/). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the LSST License Statement and + * the GNU General Public License along with this program. If not, + * see . + */ + +// System headers +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BOOST_TEST_MODULE ParserCorpus + +// Third-party headers +#include +#include + +// Qserv headers +#include "ccontrol/ParseRunner.h" + +using namespace std; +namespace fs = std::filesystem; +using namespace lsst::qserv; + +namespace { + +string readFile(fs::path const& path) { + ifstream input(path); + BOOST_REQUIRE_MESSAGE(input.is_open(), "Failed to open file: " << path); + ostringstream content; + content << input.rdbuf(); + return content.str(); +} + +} // namespace + +BOOST_AUTO_TEST_SUITE(Suite) + +BOOST_AUTO_TEST_CASE(parseCorpus) { + auto corpusDir = QSERV_PARSER_CORPUS_DIR; + BOOST_REQUIRE_MESSAGE(fs::exists(corpusDir), "Parser corpus directory does not exist: " << corpusDir); + BOOST_REQUIRE_MESSAGE(fs::is_directory(corpusDir), "Parser corpus path not a directory: " << corpusDir); + + uint corpusSize = 0; + auto const start = chrono::steady_clock::now(); + for (auto const& entry : fs::recursive_directory_iterator(corpusDir)) { + if (entry.is_regular_file() && entry.path().extension() == ".sql") { + ++corpusSize; + cout << entry.path() << "\n"; + BOOST_TEST_CONTEXT("file=" << entry.path()) { + auto testSql = readFile(entry.path()); + auto selectStmt = ccontrol::ParseRunner::makeSelectStmt(testSql); + BOOST_REQUIRE_MESSAGE(selectStmt != nullptr, + "Test produced null Qserv IR: " << entry.path() << " -> " << testSql); + } + } + } + + auto const stop = chrono::steady_clock::now(); + auto const elapsed = chrono::duration(stop - start).count(); + cout << "testParserCorpus: parsed " << corpusSize << " statement(s) in " << elapsed << "s\n"; +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/ccontrol/testdata/parser-corpus/README.md b/src/ccontrol/testdata/parser-corpus/README.md new file mode 100644 index 0000000000..e1cc2acdbd --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/README.md @@ -0,0 +1,9 @@ +Place parser corpus SQL files in this directory. + +testParserCorpus reads files ending in `.sql`, parses each statement, and +verifies that Qserv IR can be built. It assumes that there is ONE statement +per file. + +The two main ideas behind this test: + * Stress test the parser and Qserv IR adapter + * Catch parse speed regressions \ No newline at end of file diff --git a/src/ccontrol/testdata/parser-corpus/q01_small.sql b/src/ccontrol/testdata/parser-corpus/q01_small.sql new file mode 100644 index 0000000000..1ab451ef71 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q01_small.sql @@ -0,0 +1,3 @@ +SELECT dp1.Object.objectId, dp1.Object.coord_ra, dp1.Object.coord_dec +FROM dp1.Object +WHERE dp1.Object.objectId = 0 diff --git a/src/ccontrol/testdata/parser-corpus/q02_medium.sql b/src/ccontrol/testdata/parser-corpus/q02_medium.sql new file mode 100644 index 0000000000..64bdfd2335 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q02_medium.sql @@ -0,0 +1,111 @@ +SELECT + dp1.Object.qserv_trans_id AS qserv_trans_id_raw, + dp1.Object.objectId AS objectId_raw, + dp1.Object.iauId AS iauId_raw, + dp1.Object.ra_PS AS ra_PS_raw, + dp1.Object.ra_PS_Sigma AS ra_PS_Sigma_raw, + dp1.Object.decl_PS AS decl_PS_raw, + dp1.Object.decl_PS_Sigma AS decl_PS_Sigma_raw, + dp1.Object.radecl_PS_Cov AS radecl_PS_Cov_raw, + dp1.Object.htmId20 AS htmId20_raw, + dp1.Object.ra_SG AS ra_SG_raw, + dp1.Object.ra_SG_Sigma AS ra_SG_Sigma_raw, + dp1.Object.decl_SG AS decl_SG_raw, + dp1.Object.decl_SG_Sigma AS decl_SG_Sigma_raw, + dp1.Object.radecl_SG_Cov AS radecl_SG_Cov_raw, + dp1.Object.raRange AS raRange_raw, + dp1.Object.declRange AS declRange_raw, + dp1.Object.muRa_PS AS muRa_PS_raw, + dp1.Object.muRa_PS_Sigma AS muRa_PS_Sigma_raw, + dp1.Object.muDecl_PS AS muDecl_PS_raw, + dp1.Object.muDecl_PS_Sigma AS muDecl_PS_Sigma_raw, + dp1.Object.muRaDecl_PS_Cov AS muRaDecl_PS_Cov_raw, + dp1.Object.parallax_PS AS parallax_PS_raw, + dp1.Object.parallax_PS_Sigma AS parallax_PS_Sigma_raw, + dp1.Object.canonicalFilterId AS canonicalFilterId_raw, + dp1.Object.extendedness AS extendedness_raw, + dp1.Object.varProb AS varProb_raw, + dp1.Object.earliestObsTime AS earliestObsTime_raw, + dp1.Object.latestObsTime AS latestObsTime_raw, + dp1.Object.meanObsTime AS meanObsTime_raw, + dp1.Object.flags AS flags_raw, + dp1.Object.uNumObs AS uNumObs_raw, + dp1.Object.uExtendedness AS uExtendedness_raw, + dp1.Object.uVarProb AS uVarProb_raw, + dp1.Object.uRaOffset_PS AS uRaOffset_PS_raw, + dp1.Object.uRaOffset_PS_Sigma AS uRaOffset_PS_Sigma_raw, + dp1.Object.uDeclOffset_PS AS uDeclOffset_PS_raw, + dp1.Object.uDeclOffset_PS_Sigma AS uDeclOffset_PS_Sigma_raw, + dp1.Object.uRaDeclOffset_PS_Cov AS uRaDeclOffset_PS_Cov_raw, + dp1.Object.uRaOffset_SG AS uRaOffset_SG_raw, + dp1.Object.uRaOffset_SG_Sigma AS uRaOffset_SG_Sigma_raw, + dp1.Object.uDeclOffset_SG AS uDeclOffset_SG_raw, + dp1.Object.uDeclOffset_SG_Sigma AS uDeclOffset_SG_Sigma_raw, + dp1.Object.uRaDeclOffset_SG_Cov AS uRaDeclOffset_SG_Cov_raw, + dp1.Object.uLnL_PS AS uLnL_PS_raw, + dp1.Object.uLnL_SG AS uLnL_SG_raw, + dp1.Object.coord_dec AS coord_dec_raw, + dp1.Object.coord_decErr AS coord_decErr_raw, + dp1.Object.coord_ra AS coord_ra_raw, + dp1.Object.coord_ra_dec_Cov AS coord_ra_dec_Cov_raw, + dp1.Object.coord_raErr AS coord_raErr_raw, + dp1.Object.deblend_failed AS deblend_failed_raw, + dp1.Object.deblend_incompleteData AS deblend_incompleteData_raw, + dp1.Object.deblend_isolatedParent AS deblend_isolatedParent_raw, + dp1.Object.deblend_iterations AS deblend_iterations_raw, + dp1.Object.deblend_logL AS deblend_logL_raw, + dp1.Object.deblend_masked AS deblend_masked_raw, + dp1.Object.deblend_nChild AS deblend_nChild_raw, + dp1.Object.deblend_nPeaks AS deblend_nPeaks_raw, + dp1.Object.deblend_parentTooBig AS deblend_parentTooBig_raw, + dp1.Object.deblend_peak_center_x AS deblend_peak_center_x_raw, + ((dp1.Object.qserv_trans_id + dp1.Object.decl_SG) * 1) AS expr_0_qserv_trans_id, + ((dp1.Object.objectId + dp1.Object.decl_SG_Sigma) * 2) AS expr_1_objectId, + ((dp1.Object.iauId + dp1.Object.radecl_SG_Cov) * 3) AS expr_2_iauId, + ((dp1.Object.ra_PS + dp1.Object.raRange) * 4) AS expr_3_ra_PS, + ((dp1.Object.ra_PS_Sigma + dp1.Object.declRange) * 5) AS expr_4_ra_PS_Sigma, + ((dp1.Object.decl_PS + dp1.Object.muRa_PS) * 1) AS expr_5_decl_PS, + ((dp1.Object.decl_PS_Sigma + dp1.Object.muRa_PS_Sigma) * 2) AS expr_6_decl_PS_Sigma, + ((dp1.Object.radecl_PS_Cov + dp1.Object.muDecl_PS) * 3) AS expr_7_radecl_PS_Cov, + ((dp1.Object.htmId20 + dp1.Object.muDecl_PS_Sigma) * 4) AS expr_8_htmId20, + ((dp1.Object.ra_SG + dp1.Object.muRaDecl_PS_Cov) * 5) AS expr_9_ra_SG, + ((dp1.Object.ra_SG_Sigma + dp1.Object.parallax_PS) * 1) AS expr_10_ra_SG_Sigma, + ((dp1.Object.decl_SG + dp1.Object.parallax_PS_Sigma) * 2) AS expr_11_decl_SG, + ((dp1.Object.decl_SG_Sigma + dp1.Object.canonicalFilterId) * 3) AS expr_12_decl_SG_Sigma, + ((dp1.Object.radecl_SG_Cov + dp1.Object.extendedness) * 4) AS expr_13_radecl_SG_Cov, + ((dp1.Object.raRange + dp1.Object.varProb) * 5) AS expr_14_raRange, + ((dp1.Object.declRange + dp1.Object.earliestObsTime) * 1) AS expr_15_declRange, + ((dp1.Object.muRa_PS + dp1.Object.latestObsTime) * 2) AS expr_16_muRa_PS, + ((dp1.Object.muRa_PS_Sigma + dp1.Object.meanObsTime) * 3) AS expr_17_muRa_PS_Sigma, + ((dp1.Object.muDecl_PS + dp1.Object.flags) * 4) AS expr_18_muDecl_PS, + ((dp1.Object.muDecl_PS_Sigma + dp1.Object.uNumObs) * 5) AS expr_19_muDecl_PS_Sigma, + ((dp1.Object.muRaDecl_PS_Cov + dp1.Object.uExtendedness) * 1) AS expr_20_muRaDecl_PS_Cov, + ((dp1.Object.parallax_PS + dp1.Object.uVarProb) * 2) AS expr_21_parallax_PS, + ((dp1.Object.parallax_PS_Sigma + dp1.Object.uRaOffset_PS) * 3) AS expr_22_parallax_PS_Sigma, + ((dp1.Object.canonicalFilterId + dp1.Object.uRaOffset_PS_Sigma) * 4) AS expr_23_canonicalFilterId, + ((dp1.Object.extendedness + dp1.Object.uDeclOffset_PS) * 5) AS expr_24_extendedness, + ((dp1.Object.varProb + dp1.Object.uDeclOffset_PS_Sigma) * 1) AS expr_25_varProb, + ((dp1.Object.earliestObsTime + dp1.Object.uRaDeclOffset_PS_Cov) * 2) AS expr_26_earliestObsTime, + ((dp1.Object.latestObsTime + dp1.Object.uRaOffset_SG) * 3) AS expr_27_latestObsTime, + ((dp1.Object.meanObsTime + dp1.Object.uRaOffset_SG_Sigma) * 4) AS expr_28_meanObsTime, + ((dp1.Object.flags + dp1.Object.uDeclOffset_SG) * 5) AS expr_29_flags, + ((dp1.Object.uNumObs + dp1.Object.uDeclOffset_SG_Sigma) * 1) AS expr_30_uNumObs, + ((dp1.Object.uExtendedness + dp1.Object.uRaDeclOffset_SG_Cov) * 2) AS expr_31_uExtendedness, + ((dp1.Object.uVarProb + dp1.Object.uLnL_PS) * 3) AS expr_32_uVarProb, + ((dp1.Object.uRaOffset_PS + dp1.Object.uLnL_SG) * 4) AS expr_33_uRaOffset_PS, + ((dp1.Object.uRaOffset_PS_Sigma + dp1.Object.coord_dec) * 5) AS expr_34_uRaOffset_PS_Sigma +FROM dp1.Object +WHERE + (dp1.Object.qserv_trans_id > 0 AND dp1.Object.objectId < 1 AND dp1.Object.iauId >= 2) + OR (dp1.Object.ra_PS > 3 AND dp1.Object.ra_PS_Sigma < 4 AND dp1.Object.decl_PS >= 5) + OR (dp1.Object.decl_PS_Sigma > 6 AND dp1.Object.radecl_PS_Cov < 7 AND dp1.Object.htmId20 >= 8) + OR (dp1.Object.ra_SG > 9 AND dp1.Object.ra_SG_Sigma < 10 AND dp1.Object.decl_SG >= 11) + OR (dp1.Object.decl_SG_Sigma > 12 AND dp1.Object.radecl_SG_Cov < 13 AND dp1.Object.raRange >= 14) + OR (dp1.Object.declRange > 15 AND dp1.Object.muRa_PS < 16 AND dp1.Object.muRa_PS_Sigma >= 17) + OR (dp1.Object.muDecl_PS > 18 AND dp1.Object.muDecl_PS_Sigma < 19 AND dp1.Object.muRaDecl_PS_Cov >= 0) + OR (dp1.Object.parallax_PS > 1 AND dp1.Object.parallax_PS_Sigma < 2 AND dp1.Object.canonicalFilterId >= 3) + OR (dp1.Object.extendedness > 4 AND dp1.Object.varProb < 5 AND dp1.Object.earliestObsTime >= 6) + OR (dp1.Object.latestObsTime > 7 AND dp1.Object.meanObsTime < 8 AND dp1.Object.flags >= 9) + OR (dp1.Object.uNumObs > 10 AND dp1.Object.uExtendedness < 11 AND dp1.Object.uVarProb >= 12) + OR (dp1.Object.uRaOffset_PS > 13 AND dp1.Object.uRaOffset_PS_Sigma < 14 AND dp1.Object.uDeclOffset_PS >= 15) +ORDER BY dp1.Object.objectId diff --git a/src/ccontrol/testdata/parser-corpus/q03_original.sql b/src/ccontrol/testdata/parser-corpus/q03_original.sql new file mode 100644 index 0000000000..2258c3b0dd --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q03_original.sql @@ -0,0 +1 @@ +SELECT dp1.Object.coord_dec, dp1.Object.coord_decErr, dp1.Object.coord_ra, dp1.Object.coord_ra_dec_Cov, dp1.Object.coord_raErr, dp1.Object.deblend_failed, dp1.Object.deblend_incompleteData, dp1.Object.deblend_isolatedParent, dp1.Object.deblend_iterations, dp1.Object.deblend_logL, dp1.Object.deblend_masked, dp1.Object.deblend_nChild, dp1.Object.deblend_nPeaks, dp1.Object.deblend_parentTooBig, dp1.Object.deblend_peak_center_x, dp1.Object.deblend_peak_center_y, dp1.Object.deblend_skipped, dp1.Object.deblend_tooManyPeaks, dp1.Object.detect_fromBlend, dp1.Object.detect_isDeblendedModelSource, dp1.Object.detect_isIsolated, dp1.Object.ebv, dp1.Object.footprintArea, dp1.Object.g_ap03Flux, dp1.Object.g_ap03Flux_flag, dp1.Object.g_ap03FluxErr, dp1.Object.g_ap06Flux, dp1.Object.g_ap06Flux_flag, dp1.Object.g_ap06FluxErr, dp1.Object.g_ap09Flux, dp1.Object.g_ap09Flux_flag, dp1.Object.g_ap09FluxErr, dp1.Object.g_ap12Flux, dp1.Object.g_ap12Flux_flag, dp1.Object.g_ap12FluxErr, dp1.Object.g_ap17Flux, dp1.Object.g_ap17Flux_flag, dp1.Object.g_ap17FluxErr, dp1.Object.g_ap25Flux, dp1.Object.g_ap25Flux_flag, dp1.Object.g_ap25FluxErr, dp1.Object.g_ap35Flux, dp1.Object.g_ap35Flux_flag, dp1.Object.g_ap35FluxErr, dp1.Object.g_ap50Flux, dp1.Object.g_ap50Flux_flag, dp1.Object.g_ap50FluxErr, dp1.Object.g_ap70Flux, dp1.Object.g_ap70Flux_flag, dp1.Object.g_ap70FluxErr, dp1.Object.g_apFlux_flag, dp1.Object.g_apFlux_flag_apertureTruncated, dp1.Object.g_apFlux_flag_sincCoeffsTruncated, dp1.Object.g_bdChi2, dp1.Object.g_bdE1, dp1.Object.g_bdE2, dp1.Object.g_bdFluxB, dp1.Object.g_bdFluxBErr, dp1.Object.g_bdFluxD, dp1.Object.g_bdFluxDErr, dp1.Object.g_bdReB, dp1.Object.g_bdReD, dp1.Object.g_blendedness, dp1.Object.g_blendedness_flag, dp1.Object.g_calib_astrometry_used, dp1.Object.g_calib_photometry_reserved, dp1.Object.g_calib_photometry_used, dp1.Object.g_calib_psf_candidate, dp1.Object.g_calib_psf_reserved, dp1.Object.g_calib_psf_used, dp1.Object.g_calibFlux, dp1.Object.g_calibFlux_flag, dp1.Object.g_calibFlux_flag_apertureTruncated, dp1.Object.g_calibFlux_flag_sincCoeffsTruncated, dp1.Object.g_calibFluxErr, dp1.Object.g_centroid_flag, dp1.Object.g_centroid_x, dp1.Object.g_centroid_xErr, dp1.Object.g_centroid_y, dp1.Object.g_centroid_yErr, dp1.Object.g_cModel_flag, dp1.Object.g_cModel_flag_apCorr, dp1.Object.g_cModelFlux, dp1.Object.g_cModelFlux_inner, dp1.Object.g_cModelFluxErr, dp1.Object.g_cModelMag, dp1.Object.g_cModelMagErr, dp1.Object.g_deblend_blendedness, dp1.Object.g_deblend_dataCoverage, dp1.Object.g_deblend_fluxOverlap, dp1.Object.g_deblend_fluxOverlapFraction, dp1.Object.g_deblend_zeroFlux, dp1.Object.g_dec, dp1.Object.g_decErr, dp1.Object.g_epoch, dp1.Object.g_extendedness, dp1.Object.g_extendedness_flag, dp1.Object.g_free_cModelFlux, dp1.Object.g_free_cModelFlux_flag, dp1.Object.g_free_cModelFlux_inner, dp1.Object.g_free_cModelFluxErr, dp1.Object.g_free_psfFlux, dp1.Object.g_free_psfFlux_flag, dp1.Object.g_free_psfFluxErr, dp1.Object.g_gaap0p7Flux, dp1.Object.g_gaap0p7Flux_flag_bigPsf, dp1.Object.g_gaap0p7FluxErr, dp1.Object.g_gaap1p0Flux, dp1.Object.g_gaap1p0Flux_flag_bigPsf, dp1.Object.g_gaap1p0FluxErr, dp1.Object.g_gaap1p5Flux, dp1.Object.g_gaap1p5Flux_flag_bigPsf, dp1.Object.g_gaap1p5FluxErr, dp1.Object.g_gaap2p5Flux, dp1.Object.g_gaap2p5Flux_flag_bigPsf, dp1.Object.g_gaap2p5FluxErr, dp1.Object.g_gaap3p0Flux, dp1.Object.g_gaap3p0Flux_flag_bigPsf, dp1.Object.g_gaap3p0FluxErr, dp1.Object.g_gaapFlux_flag, dp1.Object.g_gaapFlux_flag_edge, dp1.Object.g_gaapFlux_flag_gaussianization, dp1.Object.g_gaapOptimalFlux, dp1.Object.g_gaapOptimalFlux_flag_bigPsf, dp1.Object.g_gaapOptimalFluxErr, dp1.Object.g_gaapPsfFlux, dp1.Object.g_gaapPsfFluxErr, dp1.Object.g_hsm_moments_03, dp1.Object.g_hsm_moments_04, dp1.Object.g_hsm_moments_12, dp1.Object.g_hsm_moments_13, dp1.Object.g_hsm_moments_21, dp1.Object.g_hsm_moments_22, dp1.Object.g_hsm_moments_30, dp1.Object.g_hsm_moments_31, dp1.Object.g_hsm_moments_40, dp1.Object.g_hsm_moments_flag, dp1.Object.g_hsm_momentsPsf_03, dp1.Object.g_hsm_momentsPsf_04, dp1.Object.g_hsm_momentsPsf_12, dp1.Object.g_hsm_momentsPsf_13, dp1.Object.g_hsm_momentsPsf_21, dp1.Object.g_hsm_momentsPsf_22, dp1.Object.g_hsm_momentsPsf_30, dp1.Object.g_hsm_momentsPsf_31, dp1.Object.g_hsm_momentsPsf_40, dp1.Object.g_hsm_momentsPsf_flag, dp1.Object.g_hsmShapeRegauss_e1, dp1.Object.g_hsmShapeRegauss_e2, dp1.Object.g_hsmShapeRegauss_flag, dp1.Object.g_hsmShapeRegauss_sigma, dp1.Object.g_i_flag, dp1.Object.g_iDebiasedPSF_flag, dp1.Object.g_inputCount, dp1.Object.g_inputCount_flag, dp1.Object.g_inputCount_flag_noInputs, dp1.Object.g_invalidPsfFlag, dp1.Object.g_iPSF_flag, dp1.Object.g_iRound_flag, dp1.Object.g_ixx, dp1.Object.g_ixxDebiasedPSF, dp1.Object.g_ixxPSF, dp1.Object.g_ixxRound, dp1.Object.g_ixy, dp1.Object.g_ixyDebiasedPSF, dp1.Object.g_ixyPSF, dp1.Object.g_ixyRound, dp1.Object.g_iyy, dp1.Object.g_iyyDebiasedPSF, dp1.Object.g_iyyPSF, dp1.Object.g_iyyRound, dp1.Object.g_kronFlux, dp1.Object.g_kronFlux_flag, dp1.Object.g_kronFlux_flag_bad_radius, dp1.Object.g_kronFlux_flag_bad_shape, dp1.Object.g_kronFlux_flag_bad_shape_no_psf, dp1.Object.g_kronFlux_flag_edge, dp1.Object.g_kronFlux_flag_no_fallback_radius, dp1.Object.g_kronFlux_flag_no_minimum_radius, dp1.Object.g_kronFlux_flag_small_radius, dp1.Object.g_kronFlux_flag_used_minimum_radius, dp1.Object.g_kronFlux_flag_used_psf_radius, dp1.Object.g_kronFluxErr, dp1.Object.g_kronRad, dp1.Object.g_pixelFlags_bad, dp1.Object.g_pixelFlags_clipped, dp1.Object.g_pixelFlags_clippedCenter, dp1.Object.g_pixelFlags_cr, dp1.Object.g_pixelFlags_crCenter, dp1.Object.g_pixelFlags_edge, dp1.Object.g_pixelFlags_inexact_psf, dp1.Object.g_pixelFlags_inexact_psfCenter, dp1.Object.g_pixelFlags_interpolated, dp1.Object.g_pixelFlags_interpolatedCenter, dp1.Object.g_pixelFlags_nodata, dp1.Object.g_pixelFlags_offimage, dp1.Object.g_pixelFlags_saturated, dp1.Object.g_pixelFlags_saturatedCenter, dp1.Object.g_pixelFlags_sensor_edge, dp1.Object.g_pixelFlags_sensor_edgeCenter, dp1.Object.g_pixelFlags_suspect, dp1.Object.g_pixelFlags_suspectCenter, dp1.Object.g_psfFlux, dp1.Object.g_psfFlux_area, dp1.Object.g_psfFlux_flag, dp1.Object.g_psfFlux_flag_apCorr, dp1.Object.g_psfFlux_flag_edge, dp1.Object.g_psfFlux_flag_noGoodPixels, dp1.Object.g_psfFluxErr, dp1.Object.g_psfMag, dp1.Object.g_psfMagErr, dp1.Object.g_psfModel_TwoGaussian_chisq_reduced, dp1.Object.g_psfModel_TwoGaussian_gauss1_fluxfrac, dp1.Object.g_psfModel_TwoGaussian_gauss1_rho, dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_x, dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_y, dp1.Object.g_psfModel_TwoGaussian_gauss2_rho, dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_x, dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_y, dp1.Object.g_psfModel_TwoGaussian_n_iter, dp1.Object.g_psfModel_TwoGaussian_no_inputs_flag, dp1.Object.g_psfModel_TwoGaussian_unknown_flag, dp1.Object.g_ra, dp1.Object.g_ra_dec_Cov, dp1.Object.g_raErr, dp1.Object.g_sersicFlux, dp1.Object.g_sersicFluxErr, dp1.Object.g_sizeExtendedness, dp1.Object.g_sizeExtendedness_flag, dp1.Object.i_ap03Flux, dp1.Object.i_ap03Flux_flag, dp1.Object.i_ap03FluxErr, dp1.Object.i_ap06Flux, dp1.Object.i_ap06Flux_flag, dp1.Object.i_ap06FluxErr, dp1.Object.i_ap09Flux, dp1.Object.i_ap09Flux_flag, dp1.Object.i_ap09FluxErr, dp1.Object.i_ap12Flux, dp1.Object.i_ap12Flux_flag, dp1.Object.i_ap12FluxErr, dp1.Object.i_ap17Flux, dp1.Object.i_ap17Flux_flag, dp1.Object.i_ap17FluxErr, dp1.Object.i_ap25Flux, dp1.Object.i_ap25Flux_flag, dp1.Object.i_ap25FluxErr, dp1.Object.i_ap35Flux, dp1.Object.i_ap35Flux_flag, dp1.Object.i_ap35FluxErr, dp1.Object.i_ap50Flux, dp1.Object.i_ap50Flux_flag, dp1.Object.i_ap50FluxErr, dp1.Object.i_ap70Flux, dp1.Object.i_ap70Flux_flag, dp1.Object.i_ap70FluxErr, dp1.Object.i_apFlux_flag, dp1.Object.i_apFlux_flag_apertureTruncated, dp1.Object.i_apFlux_flag_sincCoeffsTruncated, dp1.Object.i_bdChi2, dp1.Object.i_bdE1, dp1.Object.i_bdE2, dp1.Object.i_bdFluxB, dp1.Object.i_bdFluxBErr, dp1.Object.i_bdFluxD, dp1.Object.i_bdFluxDErr, dp1.Object.i_bdReB, dp1.Object.i_bdReD, dp1.Object.i_blendedness, dp1.Object.i_blendedness_flag, dp1.Object.i_calib_astrometry_used, dp1.Object.i_calib_photometry_reserved, dp1.Object.i_calib_photometry_used, dp1.Object.i_calib_psf_candidate, dp1.Object.i_calib_psf_reserved, dp1.Object.i_calib_psf_used, dp1.Object.i_calibFlux, dp1.Object.i_calibFlux_flag, dp1.Object.i_calibFlux_flag_apertureTruncated, dp1.Object.i_calibFlux_flag_sincCoeffsTruncated, dp1.Object.i_calibFluxErr, dp1.Object.i_centroid_flag, dp1.Object.i_centroid_x, dp1.Object.i_centroid_xErr, dp1.Object.i_centroid_y, dp1.Object.i_centroid_yErr, dp1.Object.i_cModel_flag, dp1.Object.i_cModel_flag_apCorr, dp1.Object.i_cModelFlux, dp1.Object.i_cModelFlux_inner, dp1.Object.i_cModelFluxErr, dp1.Object.i_cModelMag, dp1.Object.i_cModelMagErr, dp1.Object.i_deblend_blendedness, dp1.Object.i_deblend_dataCoverage, dp1.Object.i_deblend_fluxOverlap, dp1.Object.i_deblend_fluxOverlapFraction, dp1.Object.i_deblend_zeroFlux, dp1.Object.i_dec, dp1.Object.i_decErr, dp1.Object.i_epoch, dp1.Object.i_extendedness, dp1.Object.i_extendedness_flag, dp1.Object.i_free_cModelFlux, dp1.Object.i_free_cModelFlux_flag, dp1.Object.i_free_cModelFlux_inner, dp1.Object.i_free_cModelFluxErr, dp1.Object.i_free_psfFlux, dp1.Object.i_free_psfFlux_flag, dp1.Object.i_free_psfFluxErr, dp1.Object.i_gaap0p7Flux, dp1.Object.i_gaap0p7Flux_flag_bigPsf, dp1.Object.i_gaap0p7FluxErr, dp1.Object.i_gaap1p0Flux, dp1.Object.i_gaap1p0Flux_flag_bigPsf, dp1.Object.i_gaap1p0FluxErr, dp1.Object.i_gaap1p5Flux, dp1.Object.i_gaap1p5Flux_flag_bigPsf, dp1.Object.i_gaap1p5FluxErr, dp1.Object.i_gaap2p5Flux, dp1.Object.i_gaap2p5Flux_flag_bigPsf, dp1.Object.i_gaap2p5FluxErr, dp1.Object.i_gaap3p0Flux, dp1.Object.i_gaap3p0Flux_flag_bigPsf, dp1.Object.i_gaap3p0FluxErr, dp1.Object.i_gaapFlux_flag, dp1.Object.i_gaapFlux_flag_edge, dp1.Object.i_gaapFlux_flag_gaussianization, dp1.Object.i_gaapOptimalFlux, dp1.Object.i_gaapOptimalFlux_flag_bigPsf, dp1.Object.i_gaapOptimalFluxErr, dp1.Object.i_gaapPsfFlux, dp1.Object.i_gaapPsfFluxErr, dp1.Object.i_hsm_moments_03, dp1.Object.i_hsm_moments_04, dp1.Object.i_hsm_moments_12, dp1.Object.i_hsm_moments_13, dp1.Object.i_hsm_moments_21, dp1.Object.i_hsm_moments_22, dp1.Object.i_hsm_moments_30, dp1.Object.i_hsm_moments_31, dp1.Object.i_hsm_moments_40, dp1.Object.i_hsm_moments_flag, dp1.Object.i_hsm_momentsPsf_03, dp1.Object.i_hsm_momentsPsf_04, dp1.Object.i_hsm_momentsPsf_12, dp1.Object.i_hsm_momentsPsf_13, dp1.Object.i_hsm_momentsPsf_21, dp1.Object.i_hsm_momentsPsf_22, dp1.Object.i_hsm_momentsPsf_30, dp1.Object.i_hsm_momentsPsf_31, dp1.Object.i_hsm_momentsPsf_40, dp1.Object.i_hsm_momentsPsf_flag, dp1.Object.i_hsmShapeRegauss_e1, dp1.Object.i_hsmShapeRegauss_e2, dp1.Object.i_hsmShapeRegauss_flag, dp1.Object.i_hsmShapeRegauss_sigma, dp1.Object.i_i_flag, dp1.Object.i_iDebiasedPSF_flag, dp1.Object.i_inputCount, dp1.Object.i_inputCount_flag, dp1.Object.i_inputCount_flag_noInputs, dp1.Object.i_invalidPsfFlag, dp1.Object.i_iPSF_flag, dp1.Object.i_iRound_flag, dp1.Object.i_ixx, dp1.Object.i_ixxDebiasedPSF, dp1.Object.i_ixxPSF, dp1.Object.i_ixxRound, dp1.Object.i_ixy, dp1.Object.i_ixyDebiasedPSF, dp1.Object.i_ixyPSF, dp1.Object.i_ixyRound, dp1.Object.i_iyy, dp1.Object.i_iyyDebiasedPSF, dp1.Object.i_iyyPSF, dp1.Object.i_iyyRound, dp1.Object.i_kronFlux, dp1.Object.i_kronFlux_flag, dp1.Object.i_kronFlux_flag_bad_radius, dp1.Object.i_kronFlux_flag_bad_shape, dp1.Object.i_kronFlux_flag_bad_shape_no_psf, dp1.Object.i_kronFlux_flag_edge, dp1.Object.i_kronFlux_flag_no_fallback_radius, dp1.Object.i_kronFlux_flag_no_minimum_radius, dp1.Object.i_kronFlux_flag_small_radius, dp1.Object.i_kronFlux_flag_used_minimum_radius, dp1.Object.i_kronFlux_flag_used_psf_radius, dp1.Object.i_kronFluxErr, dp1.Object.i_kronRad, dp1.Object.i_pixelFlags_bad, dp1.Object.i_pixelFlags_clipped, dp1.Object.i_pixelFlags_clippedCenter, dp1.Object.i_pixelFlags_cr, dp1.Object.i_pixelFlags_crCenter, dp1.Object.i_pixelFlags_edge, dp1.Object.i_pixelFlags_inexact_psf, dp1.Object.i_pixelFlags_inexact_psfCenter, dp1.Object.i_pixelFlags_interpolated, dp1.Object.i_pixelFlags_interpolatedCenter, dp1.Object.i_pixelFlags_nodata, dp1.Object.i_pixelFlags_offimage, dp1.Object.i_pixelFlags_saturated, dp1.Object.i_pixelFlags_saturatedCenter, dp1.Object.i_pixelFlags_sensor_edge, dp1.Object.i_pixelFlags_sensor_edgeCenter, dp1.Object.i_pixelFlags_suspect, dp1.Object.i_pixelFlags_suspectCenter, dp1.Object.i_psfFlux, dp1.Object.i_psfFlux_area, dp1.Object.i_psfFlux_flag, dp1.Object.i_psfFlux_flag_apCorr, dp1.Object.i_psfFlux_flag_edge, dp1.Object.i_psfFlux_flag_noGoodPixels, dp1.Object.i_psfFluxErr, dp1.Object.i_psfMag, dp1.Object.i_psfMagErr, dp1.Object.i_psfModel_TwoGaussian_chisq_reduced, dp1.Object.i_psfModel_TwoGaussian_gauss1_fluxfrac, dp1.Object.i_psfModel_TwoGaussian_gauss1_rho, dp1.Object.i_psfModel_TwoGaussian_gauss1_sigma_x, dp1.Object.i_psfModel_TwoGaussian_gauss1_sigma_y, dp1.Object.i_psfModel_TwoGaussian_gauss2_rho, dp1.Object.i_psfModel_TwoGaussian_gauss2_sigma_x, dp1.Object.i_psfModel_TwoGaussian_gauss2_sigma_y, dp1.Object.i_psfModel_TwoGaussian_n_iter, dp1.Object.i_psfModel_TwoGaussian_no_inputs_flag, dp1.Object.i_psfModel_TwoGaussian_unknown_flag, dp1.Object.i_ra, dp1.Object.i_ra_dec_Cov, dp1.Object.i_raErr, dp1.Object.i_sersicFlux, dp1.Object.i_sersicFluxErr, dp1.Object.i_sizeExtendedness, dp1.Object.i_sizeExtendedness_flag, dp1.Object.objectId, dp1.Object.parentObjectId, dp1.Object.patch, dp1.Object.r_ap03Flux, dp1.Object.r_ap03Flux_flag, dp1.Object.r_ap03FluxErr, dp1.Object.r_ap06Flux, dp1.Object.r_ap06Flux_flag, dp1.Object.r_ap06FluxErr, dp1.Object.r_ap09Flux, dp1.Object.r_ap09Flux_flag, dp1.Object.r_ap09FluxErr, dp1.Object.r_ap12Flux, dp1.Object.r_ap12Flux_flag, dp1.Object.r_ap12FluxErr, dp1.Object.r_ap17Flux, dp1.Object.r_ap17Flux_flag, dp1.Object.r_ap17FluxErr, dp1.Object.r_ap25Flux, dp1.Object.r_ap25Flux_flag, dp1.Object.r_ap25FluxErr, dp1.Object.r_ap35Flux, dp1.Object.r_ap35Flux_flag, dp1.Object.r_ap35FluxErr, dp1.Object.r_ap50Flux, dp1.Object.r_ap50Flux_flag, dp1.Object.r_ap50FluxErr, dp1.Object.r_ap70Flux, dp1.Object.r_ap70Flux_flag, dp1.Object.r_ap70FluxErr, dp1.Object.r_apFlux_flag, dp1.Object.r_apFlux_flag_apertureTruncated, dp1.Object.r_apFlux_flag_sincCoeffsTruncated, dp1.Object.r_bdChi2, dp1.Object.r_bdE1, dp1.Object.r_bdE2, dp1.Object.r_bdFluxB, dp1.Object.r_bdFluxBErr, dp1.Object.r_bdFluxD, dp1.Object.r_bdFluxDErr, dp1.Object.r_bdReB, dp1.Object.r_bdReD, dp1.Object.r_blendedness, dp1.Object.r_blendedness_flag, dp1.Object.r_calib_astrometry_used, dp1.Object.r_calib_photometry_reserved, dp1.Object.r_calib_photometry_used, dp1.Object.r_calib_psf_candidate, dp1.Object.r_calib_psf_reserved, dp1.Object.r_calib_psf_used, dp1.Object.r_calibFlux, dp1.Object.r_calibFlux_flag, dp1.Object.r_calibFlux_flag_apertureTruncated, dp1.Object.r_calibFlux_flag_sincCoeffsTruncated, dp1.Object.r_calibFluxErr, dp1.Object.r_centroid_flag, dp1.Object.r_centroid_x, dp1.Object.r_centroid_xErr, dp1.Object.r_centroid_y, dp1.Object.r_centroid_yErr, dp1.Object.r_cModel_flag, dp1.Object.r_cModel_flag_apCorr, dp1.Object.r_cModelFlux, dp1.Object.r_cModelFlux_inner, dp1.Object.r_cModelFluxErr, dp1.Object.r_cModelMag, dp1.Object.r_cModelMagErr, dp1.Object.r_deblend_blendedness, dp1.Object.r_deblend_dataCoverage, dp1.Object.r_deblend_fluxOverlap, dp1.Object.r_deblend_fluxOverlapFraction, dp1.Object.r_deblend_zeroFlux, dp1.Object.r_dec, dp1.Object.r_decErr, dp1.Object.r_epoch, dp1.Object.r_extendedness, dp1.Object.r_extendedness_flag, dp1.Object.r_free_cModelFlux, dp1.Object.r_free_cModelFlux_flag, dp1.Object.r_free_cModelFlux_inner, dp1.Object.r_free_cModelFluxErr, dp1.Object.r_free_psfFlux, dp1.Object.r_free_psfFlux_flag, dp1.Object.r_free_psfFluxErr, dp1.Object.r_gaap0p7Flux, dp1.Object.r_gaap0p7Flux_flag_bigPsf, dp1.Object.r_gaap0p7FluxErr, dp1.Object.r_gaap1p0Flux, dp1.Object.r_gaap1p0Flux_flag_bigPsf, dp1.Object.r_gaap1p0FluxErr, dp1.Object.r_gaap1p5Flux, dp1.Object.r_gaap1p5Flux_flag_bigPsf, dp1.Object.r_gaap1p5FluxErr, dp1.Object.r_gaap2p5Flux, dp1.Object.r_gaap2p5Flux_flag_bigPsf, dp1.Object.r_gaap2p5FluxErr, dp1.Object.r_gaap3p0Flux, dp1.Object.r_gaap3p0Flux_flag_bigPsf, dp1.Object.r_gaap3p0FluxErr, dp1.Object.r_gaapFlux_flag, dp1.Object.r_gaapFlux_flag_edge, dp1.Object.r_gaapFlux_flag_gaussianization, dp1.Object.r_gaapOptimalFlux, dp1.Object.r_gaapOptimalFlux_flag_bigPsf, dp1.Object.r_gaapOptimalFluxErr, dp1.Object.r_gaapPsfFlux, dp1.Object.r_gaapPsfFluxErr, dp1.Object.r_hsm_moments_03, dp1.Object.r_hsm_moments_04, dp1.Object.r_hsm_moments_12, dp1.Object.r_hsm_moments_13, dp1.Object.r_hsm_moments_21, dp1.Object.r_hsm_moments_22, dp1.Object.r_hsm_moments_30, dp1.Object.r_hsm_moments_31, dp1.Object.r_hsm_moments_40, dp1.Object.r_hsm_moments_flag, dp1.Object.r_hsm_momentsPsf_03, dp1.Object.r_hsm_momentsPsf_04, dp1.Object.r_hsm_momentsPsf_12, dp1.Object.r_hsm_momentsPsf_13, dp1.Object.r_hsm_momentsPsf_21, dp1.Object.r_hsm_momentsPsf_22, dp1.Object.r_hsm_momentsPsf_30, dp1.Object.r_hsm_momentsPsf_31, dp1.Object.r_hsm_momentsPsf_40, dp1.Object.r_hsm_momentsPsf_flag, dp1.Object.r_hsmShapeRegauss_e1, dp1.Object.r_hsmShapeRegauss_e2, dp1.Object.r_hsmShapeRegauss_flag, dp1.Object.r_hsmShapeRegauss_sigma, dp1.Object.r_i_flag, dp1.Object.r_iDebiasedPSF_flag, dp1.Object.r_inputCount, dp1.Object.r_inputCount_flag, dp1.Object.r_inputCount_flag_noInputs, dp1.Object.r_invalidPsfFlag, dp1.Object.r_iPSF_flag, dp1.Object.r_iRound_flag, dp1.Object.r_ixx, dp1.Object.r_ixxDebiasedPSF, dp1.Object.r_ixxPSF, dp1.Object.r_ixxRound, dp1.Object.r_ixy, dp1.Object.r_ixyDebiasedPSF, dp1.Object.r_ixyPSF, dp1.Object.r_ixyRound, dp1.Object.r_iyy, dp1.Object.r_iyyDebiasedPSF, dp1.Object.r_iyyPSF, dp1.Object.r_iyyRound, dp1.Object.r_kronFlux, dp1.Object.r_kronFlux_flag, dp1.Object.r_kronFlux_flag_bad_radius, dp1.Object.r_kronFlux_flag_bad_shape, dp1.Object.r_kronFlux_flag_bad_shape_no_psf, dp1.Object.r_kronFlux_flag_edge, dp1.Object.r_kronFlux_flag_no_fallback_radius, dp1.Object.r_kronFlux_flag_no_minimum_radius, dp1.Object.r_kronFlux_flag_small_radius, dp1.Object.r_kronFlux_flag_used_minimum_radius, dp1.Object.r_kronFlux_flag_used_psf_radius, dp1.Object.r_kronFluxErr, dp1.Object.r_kronRad, dp1.Object.r_pixelFlags_bad, dp1.Object.r_pixelFlags_clipped, dp1.Object.r_pixelFlags_clippedCenter, dp1.Object.r_pixelFlags_cr, dp1.Object.r_pixelFlags_crCenter, dp1.Object.r_pixelFlags_edge, dp1.Object.r_pixelFlags_inexact_psf, dp1.Object.r_pixelFlags_inexact_psfCenter, dp1.Object.r_pixelFlags_interpolated, dp1.Object.r_pixelFlags_interpolatedCenter, dp1.Object.r_pixelFlags_nodata, dp1.Object.r_pixelFlags_offimage, dp1.Object.r_pixelFlags_saturated, dp1.Object.r_pixelFlags_saturatedCenter, dp1.Object.r_pixelFlags_sensor_edge, dp1.Object.r_pixelFlags_sensor_edgeCenter, dp1.Object.r_pixelFlags_suspect, dp1.Object.r_pixelFlags_suspectCenter, dp1.Object.r_psfFlux, dp1.Object.r_psfFlux_area, dp1.Object.r_psfFlux_flag, dp1.Object.r_psfFlux_flag_apCorr, dp1.Object.r_psfFlux_flag_edge, dp1.Object.r_psfFlux_flag_noGoodPixels, dp1.Object.r_psfFluxErr, dp1.Object.r_psfMag, dp1.Object.r_psfMagErr, dp1.Object.r_psfModel_TwoGaussian_chisq_reduced, dp1.Object.r_psfModel_TwoGaussian_gauss1_fluxfrac, dp1.Object.r_psfModel_TwoGaussian_gauss1_rho, dp1.Object.r_psfModel_TwoGaussian_gauss1_sigma_x, dp1.Object.r_psfModel_TwoGaussian_gauss1_sigma_y, dp1.Object.r_psfModel_TwoGaussian_gauss2_rho, dp1.Object.r_psfModel_TwoGaussian_gauss2_sigma_x, dp1.Object.r_psfModel_TwoGaussian_gauss2_sigma_y, dp1.Object.r_psfModel_TwoGaussian_n_iter, dp1.Object.r_psfModel_TwoGaussian_no_inputs_flag, dp1.Object.r_psfModel_TwoGaussian_unknown_flag, dp1.Object.r_ra, dp1.Object.r_ra_dec_Cov, dp1.Object.r_raErr, dp1.Object.r_sersicFlux, dp1.Object.r_sersicFluxErr, dp1.Object.r_sizeExtendedness, dp1.Object.r_sizeExtendedness_flag, dp1.Object.refBand, dp1.Object.refExtendedness, dp1.Object.refSizeExtendedness, dp1.Object.sersic_chisq_reduced, dp1.Object.sersic_dec, dp1.Object.sersic_decErr, dp1.Object.sersic_index, dp1.Object.sersic_indexErr, dp1.Object.sersic_n_eval_jac, dp1.Object.sersic_n_iter, dp1.Object.sersic_no_data_flag, dp1.Object.sersic_ra, dp1.Object.sersic_raErr, dp1.Object.sersic_reff_x, dp1.Object.sersic_reff_xErr, dp1.Object.sersic_reff_y, dp1.Object.sersic_reff_yErr, dp1.Object.sersic_rho, dp1.Object.sersic_rhoErr, dp1.Object.sersic_unknown_flag, dp1.Object.sersic_x, dp1.Object.sersic_xErr, dp1.Object.sersic_y, dp1.Object.sersic_yErr, dp1.Object.shape_flag, dp1.Object.shape_xx, dp1.Object.shape_xy, dp1.Object.shape_yy, dp1.Object.tract, dp1.Object.u_ap03Flux, dp1.Object.u_ap03Flux_flag, dp1.Object.u_ap03FluxErr, dp1.Object.u_ap06Flux, dp1.Object.u_ap06Flux_flag, dp1.Object.u_ap06FluxErr, dp1.Object.u_ap09Flux, dp1.Object.u_ap09Flux_flag, dp1.Object.u_ap09FluxErr, dp1.Object.u_ap12Flux, dp1.Object.u_ap12Flux_flag, dp1.Object.u_ap12FluxErr, dp1.Object.u_ap17Flux, dp1.Object.u_ap17Flux_flag, dp1.Object.u_ap17FluxErr, dp1.Object.u_ap25Flux, dp1.Object.u_ap25Flux_flag, dp1.Object.u_ap25FluxErr, dp1.Object.u_ap35Flux, dp1.Object.u_ap35Flux_flag, dp1.Object.u_ap35FluxErr, dp1.Object.u_ap50Flux, dp1.Object.u_ap50Flux_flag, dp1.Object.u_ap50FluxErr, dp1.Object.u_ap70Flux, dp1.Object.u_ap70Flux_flag, dp1.Object.u_ap70FluxErr, dp1.Object.u_apFlux_flag, dp1.Object.u_apFlux_flag_apertureTruncated, dp1.Object.u_apFlux_flag_sincCoeffsTruncated, dp1.Object.u_bdChi2, dp1.Object.u_bdE1, dp1.Object.u_bdE2, dp1.Object.u_bdFluxB, dp1.Object.u_bdFluxBErr, dp1.Object.u_bdFluxD, dp1.Object.u_bdFluxDErr, dp1.Object.u_bdReB, dp1.Object.u_bdReD, dp1.Object.u_blendedness, dp1.Object.u_blendedness_flag, dp1.Object.u_calib_astrometry_used, dp1.Object.u_calib_photometry_reserved, dp1.Object.u_calib_photometry_used, dp1.Object.u_calib_psf_candidate, dp1.Object.u_calib_psf_reserved, dp1.Object.u_calib_psf_used, dp1.Object.u_calibFlux, dp1.Object.u_calibFlux_flag, dp1.Object.u_calibFlux_flag_apertureTruncated, dp1.Object.u_calibFlux_flag_sincCoeffsTruncated, dp1.Object.u_calibFluxErr, dp1.Object.u_centroid_flag, dp1.Object.u_centroid_x, dp1.Object.u_centroid_xErr, dp1.Object.u_centroid_y, dp1.Object.u_centroid_yErr, dp1.Object.u_cModel_flag, dp1.Object.u_cModel_flag_apCorr, dp1.Object.u_cModelFlux, dp1.Object.u_cModelFlux_inner, dp1.Object.u_cModelFluxErr, dp1.Object.u_cModelMag, dp1.Object.u_cModelMagErr, dp1.Object.u_deblend_blendedness, dp1.Object.u_deblend_dataCoverage, dp1.Object.u_deblend_fluxOverlap, dp1.Object.u_deblend_fluxOverlapFraction, dp1.Object.u_deblend_zeroFlux, dp1.Object.u_dec, dp1.Object.u_decErr, dp1.Object.u_epoch, dp1.Object.u_extendedness, dp1.Object.u_extendedness_flag, dp1.Object.u_free_cModelFlux, dp1.Object.u_free_cModelFlux_flag, dp1.Object.u_free_cModelFlux_inner, dp1.Object.u_free_cModelFluxErr, dp1.Object.u_free_psfFlux, dp1.Object.u_free_psfFlux_flag, dp1.Object.u_free_psfFluxErr, dp1.Object.u_gaap0p7Flux, dp1.Object.u_gaap0p7Flux_flag_bigPsf, dp1.Object.u_gaap0p7FluxErr, dp1.Object.u_gaap1p0Flux, dp1.Object.u_gaap1p0Flux_flag_bigPsf, dp1.Object.u_gaap1p0FluxErr, dp1.Object.u_gaap1p5Flux, dp1.Object.u_gaap1p5Flux_flag_bigPsf, dp1.Object.u_gaap1p5FluxErr, dp1.Object.u_gaap2p5Flux, dp1.Object.u_gaap2p5Flux_flag_bigPsf, dp1.Object.u_gaap2p5FluxErr, dp1.Object.u_gaap3p0Flux, dp1.Object.u_gaap3p0Flux_flag_bigPsf, dp1.Object.u_gaap3p0FluxErr, dp1.Object.u_gaapFlux_flag, dp1.Object.u_gaapFlux_flag_edge, dp1.Object.u_gaapFlux_flag_gaussianization, dp1.Object.u_gaapOptimalFlux, dp1.Object.u_gaapOptimalFlux_flag_bigPsf, dp1.Object.u_gaapOptimalFluxErr, dp1.Object.u_gaapPsfFlux, dp1.Object.u_gaapPsfFluxErr, dp1.Object.u_hsm_moments_03, dp1.Object.u_hsm_moments_04, dp1.Object.u_hsm_moments_12, dp1.Object.u_hsm_moments_13, dp1.Object.u_hsm_moments_21, dp1.Object.u_hsm_moments_22, dp1.Object.u_hsm_moments_30, dp1.Object.u_hsm_moments_31, dp1.Object.u_hsm_moments_40, dp1.Object.u_hsm_moments_flag, dp1.Object.u_hsm_momentsPsf_03, dp1.Object.u_hsm_momentsPsf_04, dp1.Object.u_hsm_momentsPsf_12, dp1.Object.u_hsm_momentsPsf_13, dp1.Object.u_hsm_momentsPsf_21, dp1.Object.u_hsm_momentsPsf_22, dp1.Object.u_hsm_momentsPsf_30, dp1.Object.u_hsm_momentsPsf_31, dp1.Object.u_hsm_momentsPsf_40, dp1.Object.u_hsm_momentsPsf_flag, dp1.Object.u_hsmShapeRegauss_e1, dp1.Object.u_hsmShapeRegauss_e2, dp1.Object.u_hsmShapeRegauss_flag, dp1.Object.u_hsmShapeRegauss_sigma, dp1.Object.u_i_flag, dp1.Object.u_iDebiasedPSF_flag, dp1.Object.u_inputCount, dp1.Object.u_inputCount_flag, dp1.Object.u_inputCount_flag_noInputs, dp1.Object.u_invalidPsfFlag, dp1.Object.u_iPSF_flag, dp1.Object.u_iRound_flag, dp1.Object.u_ixx, dp1.Object.u_ixxDebiasedPSF, dp1.Object.u_ixxPSF, dp1.Object.u_ixxRound, dp1.Object.u_ixy, dp1.Object.u_ixyDebiasedPSF, dp1.Object.u_ixyPSF, dp1.Object.u_ixyRound, dp1.Object.u_iyy, dp1.Object.u_iyyDebiasedPSF, dp1.Object.u_iyyPSF, dp1.Object.u_iyyRound, dp1.Object.u_kronFlux, dp1.Object.u_kronFlux_flag, dp1.Object.u_kronFlux_flag_bad_radius, dp1.Object.u_kronFlux_flag_bad_shape, dp1.Object.u_kronFlux_flag_bad_shape_no_psf, dp1.Object.u_kronFlux_flag_edge, dp1.Object.u_kronFlux_flag_no_fallback_radius, dp1.Object.u_kronFlux_flag_no_minimum_radius, dp1.Object.u_kronFlux_flag_small_radius, dp1.Object.u_kronFlux_flag_used_minimum_radius, dp1.Object.u_kronFlux_flag_used_psf_radius, dp1.Object.u_kronFluxErr, dp1.Object.u_kronRad, dp1.Object.u_pixelFlags_bad, dp1.Object.u_pixelFlags_clipped, dp1.Object.u_pixelFlags_clippedCenter, dp1.Object.u_pixelFlags_cr, dp1.Object.u_pixelFlags_crCenter, dp1.Object.u_pixelFlags_edge, dp1.Object.u_pixelFlags_inexact_psf, dp1.Object.u_pixelFlags_inexact_psfCenter, dp1.Object.u_pixelFlags_interpolated, dp1.Object.u_pixelFlags_interpolatedCenter, dp1.Object.u_pixelFlags_nodata, dp1.Object.u_pixelFlags_offimage, dp1.Object.u_pixelFlags_saturated, dp1.Object.u_pixelFlags_saturatedCenter, dp1.Object.u_pixelFlags_sensor_edge, dp1.Object.u_pixelFlags_sensor_edgeCenter, dp1.Object.u_pixelFlags_suspect, dp1.Object.u_pixelFlags_suspectCenter, dp1.Object.u_psfFlux, dp1.Object.u_psfFlux_area, dp1.Object.u_psfFlux_flag, dp1.Object.u_psfFlux_flag_apCorr, dp1.Object.u_psfFlux_flag_edge, dp1.Object.u_psfFlux_flag_noGoodPixels, dp1.Object.u_psfFluxErr, dp1.Object.u_psfMag, dp1.Object.u_psfMagErr, dp1.Object.u_psfModel_TwoGaussian_chisq_reduced, dp1.Object.u_psfModel_TwoGaussian_gauss1_fluxfrac, dp1.Object.u_psfModel_TwoGaussian_gauss1_rho, dp1.Object.u_psfModel_TwoGaussian_gauss1_sigma_x, dp1.Object.u_psfModel_TwoGaussian_gauss1_sigma_y, dp1.Object.u_psfModel_TwoGaussian_gauss2_rho, dp1.Object.u_psfModel_TwoGaussian_gauss2_sigma_x, dp1.Object.u_psfModel_TwoGaussian_gauss2_sigma_y, dp1.Object.u_psfModel_TwoGaussian_n_iter, dp1.Object.u_psfModel_TwoGaussian_no_inputs_flag, dp1.Object.u_psfModel_TwoGaussian_unknown_flag, dp1.Object.u_ra, dp1.Object.u_ra_dec_Cov, dp1.Object.u_raErr, dp1.Object.u_sersicFlux, dp1.Object.u_sersicFluxErr, dp1.Object.u_sizeExtendedness, dp1.Object.u_sizeExtendedness_flag, dp1.Object.x, dp1.Object.xErr, dp1.Object.xy_flag, dp1.Object.y, dp1.Object.y_ap03Flux, dp1.Object.y_ap03Flux_flag, dp1.Object.y_ap03FluxErr, dp1.Object.y_ap06Flux, dp1.Object.y_ap06Flux_flag, dp1.Object.y_ap06FluxErr, dp1.Object.y_ap09Flux, dp1.Object.y_ap09Flux_flag, dp1.Object.y_ap09FluxErr, dp1.Object.y_ap12Flux, dp1.Object.y_ap12Flux_flag, dp1.Object.y_ap12FluxErr, dp1.Object.y_ap17Flux, dp1.Object.y_ap17Flux_flag, dp1.Object.y_ap17FluxErr, dp1.Object.y_ap25Flux, dp1.Object.y_ap25Flux_flag, dp1.Object.y_ap25FluxErr, dp1.Object.y_ap35Flux, dp1.Object.y_ap35Flux_flag, dp1.Object.y_ap35FluxErr, dp1.Object.y_ap50Flux, dp1.Object.y_ap50Flux_flag, dp1.Object.y_ap50FluxErr, dp1.Object.y_ap70Flux, dp1.Object.y_ap70Flux_flag, dp1.Object.y_ap70FluxErr, dp1.Object.y_apFlux_flag, dp1.Object.y_apFlux_flag_apertureTruncated, dp1.Object.y_apFlux_flag_sincCoeffsTruncated, dp1.Object.y_bdChi2, dp1.Object.y_bdE1, dp1.Object.y_bdE2, dp1.Object.y_bdFluxB, dp1.Object.y_bdFluxBErr, dp1.Object.y_bdFluxD, dp1.Object.y_bdFluxDErr, dp1.Object.y_bdReB, dp1.Object.y_bdReD, dp1.Object.y_blendedness, dp1.Object.y_blendedness_flag, dp1.Object.y_calib_astrometry_used, dp1.Object.y_calib_photometry_reserved, dp1.Object.y_calib_photometry_used, dp1.Object.y_calib_psf_candidate, dp1.Object.y_calib_psf_reserved, dp1.Object.y_calib_psf_used, dp1.Object.y_calibFlux, dp1.Object.y_calibFlux_flag, dp1.Object.y_calibFlux_flag_apertureTruncated, dp1.Object.y_calibFlux_flag_sincCoeffsTruncated, dp1.Object.y_calibFluxErr, dp1.Object.y_centroid_flag, dp1.Object.y_centroid_x, dp1.Object.y_centroid_xErr, dp1.Object.y_centroid_y, dp1.Object.y_centroid_yErr, dp1.Object.y_cModel_flag, dp1.Object.y_cModel_flag_apCorr, dp1.Object.y_cModelFlux, dp1.Object.y_cModelFlux_inner, dp1.Object.y_cModelFluxErr, dp1.Object.y_cModelMag, dp1.Object.y_cModelMagErr, dp1.Object.y_deblend_blendedness, dp1.Object.y_deblend_dataCoverage, dp1.Object.y_deblend_fluxOverlap, dp1.Object.y_deblend_fluxOverlapFraction, dp1.Object.y_deblend_zeroFlux, dp1.Object.y_dec, dp1.Object.y_decErr, dp1.Object.y_epoch, dp1.Object.y_extendedness, dp1.Object.y_extendedness_flag, dp1.Object.y_free_cModelFlux, dp1.Object.y_free_cModelFlux_flag, dp1.Object.y_free_cModelFlux_inner, dp1.Object.y_free_cModelFluxErr, dp1.Object.y_free_psfFlux, dp1.Object.y_free_psfFlux_flag, dp1.Object.y_free_psfFluxErr, dp1.Object.y_gaap0p7Flux, dp1.Object.y_gaap0p7Flux_flag_bigPsf, dp1.Object.y_gaap0p7FluxErr, dp1.Object.y_gaap1p0Flux, dp1.Object.y_gaap1p0Flux_flag_bigPsf, dp1.Object.y_gaap1p0FluxErr, dp1.Object.y_gaap1p5Flux, dp1.Object.y_gaap1p5Flux_flag_bigPsf, dp1.Object.y_gaap1p5FluxErr, dp1.Object.y_gaap2p5Flux, dp1.Object.y_gaap2p5Flux_flag_bigPsf, dp1.Object.y_gaap2p5FluxErr, dp1.Object.y_gaap3p0Flux, dp1.Object.y_gaap3p0Flux_flag_bigPsf, dp1.Object.y_gaap3p0FluxErr, dp1.Object.y_gaapFlux_flag, dp1.Object.y_gaapFlux_flag_edge, dp1.Object.y_gaapFlux_flag_gaussianization, dp1.Object.y_gaapOptimalFlux, dp1.Object.y_gaapOptimalFlux_flag_bigPsf, dp1.Object.y_gaapOptimalFluxErr, dp1.Object.y_gaapPsfFlux, dp1.Object.y_gaapPsfFluxErr, dp1.Object.y_hsm_moments_03, dp1.Object.y_hsm_moments_04, dp1.Object.y_hsm_moments_12, dp1.Object.y_hsm_moments_13, dp1.Object.y_hsm_moments_21, dp1.Object.y_hsm_moments_22, dp1.Object.y_hsm_moments_30, dp1.Object.y_hsm_moments_31, dp1.Object.y_hsm_moments_40, dp1.Object.y_hsm_moments_flag, dp1.Object.y_hsm_momentsPsf_03, dp1.Object.y_hsm_momentsPsf_04, dp1.Object.y_hsm_momentsPsf_12, dp1.Object.y_hsm_momentsPsf_13, dp1.Object.y_hsm_momentsPsf_21, dp1.Object.y_hsm_momentsPsf_22, dp1.Object.y_hsm_momentsPsf_30, dp1.Object.y_hsm_momentsPsf_31, dp1.Object.y_hsm_momentsPsf_40, dp1.Object.y_hsm_momentsPsf_flag, dp1.Object.y_hsmShapeRegauss_e1, dp1.Object.y_hsmShapeRegauss_e2, dp1.Object.y_hsmShapeRegauss_flag, dp1.Object.y_hsmShapeRegauss_sigma, dp1.Object.y_i_flag, dp1.Object.y_iDebiasedPSF_flag, dp1.Object.y_inputCount, dp1.Object.y_inputCount_flag, dp1.Object.y_inputCount_flag_noInputs, dp1.Object.y_invalidPsfFlag, dp1.Object.y_iPSF_flag, dp1.Object.y_iRound_flag, dp1.Object.y_ixx, dp1.Object.y_ixxDebiasedPSF, dp1.Object.y_ixxPSF, dp1.Object.y_ixxRound, dp1.Object.y_ixy, dp1.Object.y_ixyDebiasedPSF, dp1.Object.y_ixyPSF, dp1.Object.y_ixyRound, dp1.Object.y_iyy, dp1.Object.y_iyyDebiasedPSF, dp1.Object.y_iyyPSF, dp1.Object.y_iyyRound, dp1.Object.y_kronFlux, dp1.Object.y_kronFlux_flag, dp1.Object.y_kronFlux_flag_bad_radius, dp1.Object.y_kronFlux_flag_bad_shape, dp1.Object.y_kronFlux_flag_bad_shape_no_psf, dp1.Object.y_kronFlux_flag_edge, dp1.Object.y_kronFlux_flag_no_fallback_radius, dp1.Object.y_kronFlux_flag_no_minimum_radius, dp1.Object.y_kronFlux_flag_small_radius, dp1.Object.y_kronFlux_flag_used_minimum_radius, dp1.Object.y_kronFlux_flag_used_psf_radius, dp1.Object.y_kronFluxErr, dp1.Object.y_kronRad, dp1.Object.y_pixelFlags_bad, dp1.Object.y_pixelFlags_clipped, dp1.Object.y_pixelFlags_clippedCenter, dp1.Object.y_pixelFlags_cr, dp1.Object.y_pixelFlags_crCenter, dp1.Object.y_pixelFlags_edge, dp1.Object.y_pixelFlags_inexact_psf, dp1.Object.y_pixelFlags_inexact_psfCenter, dp1.Object.y_pixelFlags_interpolated, dp1.Object.y_pixelFlags_interpolatedCenter, dp1.Object.y_pixelFlags_nodata, dp1.Object.y_pixelFlags_offimage, dp1.Object.y_pixelFlags_saturated, dp1.Object.y_pixelFlags_saturatedCenter, dp1.Object.y_pixelFlags_sensor_edge, dp1.Object.y_pixelFlags_sensor_edgeCenter, dp1.Object.y_pixelFlags_suspect, dp1.Object.y_pixelFlags_suspectCenter, dp1.Object.y_psfFlux, dp1.Object.y_psfFlux_area, dp1.Object.y_psfFlux_flag, dp1.Object.y_psfFlux_flag_apCorr, dp1.Object.y_psfFlux_flag_edge, dp1.Object.y_psfFlux_flag_noGoodPixels, dp1.Object.y_psfFluxErr, dp1.Object.y_psfMag, dp1.Object.y_psfMagErr, dp1.Object.y_psfModel_TwoGaussian_chisq_reduced, dp1.Object.y_psfModel_TwoGaussian_gauss1_fluxfrac, dp1.Object.y_psfModel_TwoGaussian_gauss1_rho, dp1.Object.y_psfModel_TwoGaussian_gauss1_sigma_x, dp1.Object.y_psfModel_TwoGaussian_gauss1_sigma_y, dp1.Object.y_psfModel_TwoGaussian_gauss2_rho, dp1.Object.y_psfModel_TwoGaussian_gauss2_sigma_x, dp1.Object.y_psfModel_TwoGaussian_gauss2_sigma_y, dp1.Object.y_psfModel_TwoGaussian_n_iter, dp1.Object.y_psfModel_TwoGaussian_no_inputs_flag, dp1.Object.y_psfModel_TwoGaussian_unknown_flag, dp1.Object.y_ra, dp1.Object.y_ra_dec_Cov, dp1.Object.y_raErr, dp1.Object.y_sersicFlux, dp1.Object.y_sersicFluxErr, dp1.Object.y_sizeExtendedness, dp1.Object.y_sizeExtendedness_flag, dp1.Object.yErr, dp1.Object.z_ap03Flux, dp1.Object.z_ap03Flux_flag, dp1.Object.z_ap03FluxErr, dp1.Object.z_ap06Flux, dp1.Object.z_ap06Flux_flag, dp1.Object.z_ap06FluxErr, dp1.Object.z_ap09Flux, dp1.Object.z_ap09Flux_flag, dp1.Object.z_ap09FluxErr, dp1.Object.z_ap12Flux, dp1.Object.z_ap12Flux_flag, dp1.Object.z_ap12FluxErr, dp1.Object.z_ap17Flux, dp1.Object.z_ap17Flux_flag, dp1.Object.z_ap17FluxErr, dp1.Object.z_ap25Flux, dp1.Object.z_ap25Flux_flag, dp1.Object.z_ap25FluxErr, dp1.Object.z_ap35Flux, dp1.Object.z_ap35Flux_flag, dp1.Object.z_ap35FluxErr, dp1.Object.z_ap50Flux, dp1.Object.z_ap50Flux_flag, dp1.Object.z_ap50FluxErr, dp1.Object.z_ap70Flux, dp1.Object.z_ap70Flux_flag, dp1.Object.z_ap70FluxErr, dp1.Object.z_apFlux_flag, dp1.Object.z_apFlux_flag_apertureTruncated, dp1.Object.z_apFlux_flag_sincCoeffsTruncated, dp1.Object.z_bdChi2, dp1.Object.z_bdE1, dp1.Object.z_bdE2, dp1.Object.z_bdFluxB, dp1.Object.z_bdFluxBErr, dp1.Object.z_bdFluxD, dp1.Object.z_bdFluxDErr, dp1.Object.z_bdReB, dp1.Object.z_bdReD, dp1.Object.z_blendedness, dp1.Object.z_blendedness_flag, dp1.Object.z_calib_astrometry_used, dp1.Object.z_calib_photometry_reserved, dp1.Object.z_calib_photometry_used, dp1.Object.z_calib_psf_candidate, dp1.Object.z_calib_psf_reserved, dp1.Object.z_calib_psf_used, dp1.Object.z_calibFlux, dp1.Object.z_calibFlux_flag, dp1.Object.z_calibFlux_flag_apertureTruncated, dp1.Object.z_calibFlux_flag_sincCoeffsTruncated, dp1.Object.z_calibFluxErr, dp1.Object.z_centroid_flag, dp1.Object.z_centroid_x, dp1.Object.z_centroid_xErr, dp1.Object.z_centroid_y, dp1.Object.z_centroid_yErr, dp1.Object.z_cModel_flag, dp1.Object.z_cModel_flag_apCorr, dp1.Object.z_cModelFlux, dp1.Object.z_cModelFlux_inner, dp1.Object.z_cModelFluxErr, dp1.Object.z_cModelMag, dp1.Object.z_cModelMagErr, dp1.Object.z_deblend_blendedness, dp1.Object.z_deblend_dataCoverage, dp1.Object.z_deblend_fluxOverlap, dp1.Object.z_deblend_fluxOverlapFraction, dp1.Object.z_deblend_zeroFlux, dp1.Object.z_dec, dp1.Object.z_decErr, dp1.Object.z_epoch, dp1.Object.z_extendedness, dp1.Object.z_extendedness_flag, dp1.Object.z_free_cModelFlux, dp1.Object.z_free_cModelFlux_flag, dp1.Object.z_free_cModelFlux_inner, dp1.Object.z_free_cModelFluxErr, dp1.Object.z_free_psfFlux, dp1.Object.z_free_psfFlux_flag, dp1.Object.z_free_psfFluxErr, dp1.Object.z_gaap0p7Flux, dp1.Object.z_gaap0p7Flux_flag_bigPsf, dp1.Object.z_gaap0p7FluxErr, dp1.Object.z_gaap1p0Flux, dp1.Object.z_gaap1p0Flux_flag_bigPsf, dp1.Object.z_gaap1p0FluxErr, dp1.Object.z_gaap1p5Flux, dp1.Object.z_gaap1p5Flux_flag_bigPsf, dp1.Object.z_gaap1p5FluxErr, dp1.Object.z_gaap2p5Flux, dp1.Object.z_gaap2p5Flux_flag_bigPsf, dp1.Object.z_gaap2p5FluxErr, dp1.Object.z_gaap3p0Flux, dp1.Object.z_gaap3p0Flux_flag_bigPsf, dp1.Object.z_gaap3p0FluxErr, dp1.Object.z_gaapFlux_flag, dp1.Object.z_gaapFlux_flag_edge, dp1.Object.z_gaapFlux_flag_gaussianization, dp1.Object.z_gaapOptimalFlux, dp1.Object.z_gaapOptimalFlux_flag_bigPsf, dp1.Object.z_gaapOptimalFluxErr, dp1.Object.z_gaapPsfFlux, dp1.Object.z_gaapPsfFluxErr, dp1.Object.z_hsm_moments_03, dp1.Object.z_hsm_moments_04, dp1.Object.z_hsm_moments_12, dp1.Object.z_hsm_moments_13, dp1.Object.z_hsm_moments_21, dp1.Object.z_hsm_moments_22, dp1.Object.z_hsm_moments_30, dp1.Object.z_hsm_moments_31, dp1.Object.z_hsm_moments_40, dp1.Object.z_hsm_moments_flag, dp1.Object.z_hsm_momentsPsf_03, dp1.Object.z_hsm_momentsPsf_04, dp1.Object.z_hsm_momentsPsf_12, dp1.Object.z_hsm_momentsPsf_13, dp1.Object.z_hsm_momentsPsf_21, dp1.Object.z_hsm_momentsPsf_22, dp1.Object.z_hsm_momentsPsf_30, dp1.Object.z_hsm_momentsPsf_31, dp1.Object.z_hsm_momentsPsf_40, dp1.Object.z_hsm_momentsPsf_flag, dp1.Object.z_hsmShapeRegauss_e1, dp1.Object.z_hsmShapeRegauss_e2, dp1.Object.z_hsmShapeRegauss_flag, dp1.Object.z_hsmShapeRegauss_sigma, dp1.Object.z_i_flag, dp1.Object.z_iDebiasedPSF_flag, dp1.Object.z_inputCount, dp1.Object.z_inputCount_flag, dp1.Object.z_inputCount_flag_noInputs, dp1.Object.z_invalidPsfFlag, dp1.Object.z_iPSF_flag, dp1.Object.z_iRound_flag, dp1.Object.z_ixx, dp1.Object.z_ixxDebiasedPSF, dp1.Object.z_ixxPSF, dp1.Object.z_ixxRound, dp1.Object.z_ixy, dp1.Object.z_ixyDebiasedPSF, dp1.Object.z_ixyPSF, dp1.Object.z_ixyRound, dp1.Object.z_iyy, dp1.Object.z_iyyDebiasedPSF, dp1.Object.z_iyyPSF, dp1.Object.z_iyyRound, dp1.Object.z_kronFlux, dp1.Object.z_kronFlux_flag, dp1.Object.z_kronFlux_flag_bad_radius, dp1.Object.z_kronFlux_flag_bad_shape, dp1.Object.z_kronFlux_flag_bad_shape_no_psf, dp1.Object.z_kronFlux_flag_edge, dp1.Object.z_kronFlux_flag_no_fallback_radius, dp1.Object.z_kronFlux_flag_no_minimum_radius, dp1.Object.z_kronFlux_flag_small_radius, dp1.Object.z_kronFlux_flag_used_minimum_radius, dp1.Object.z_kronFlux_flag_used_psf_radius, dp1.Object.z_kronFluxErr, dp1.Object.z_kronRad, dp1.Object.z_pixelFlags_bad, dp1.Object.z_pixelFlags_clipped, dp1.Object.z_pixelFlags_clippedCenter, dp1.Object.z_pixelFlags_cr, dp1.Object.z_pixelFlags_crCenter, dp1.Object.z_pixelFlags_edge, dp1.Object.z_pixelFlags_inexact_psf, dp1.Object.z_pixelFlags_inexact_psfCenter, dp1.Object.z_pixelFlags_interpolated, dp1.Object.z_pixelFlags_interpolatedCenter, dp1.Object.z_pixelFlags_nodata, dp1.Object.z_pixelFlags_offimage, dp1.Object.z_pixelFlags_saturated, dp1.Object.z_pixelFlags_saturatedCenter, dp1.Object.z_pixelFlags_sensor_edge, dp1.Object.z_pixelFlags_sensor_edgeCenter, dp1.Object.z_pixelFlags_suspect, dp1.Object.z_pixelFlags_suspectCenter, dp1.Object.z_psfFlux, dp1.Object.z_psfFlux_area, dp1.Object.z_psfFlux_flag, dp1.Object.z_psfFlux_flag_apCorr, dp1.Object.z_psfFlux_flag_edge, dp1.Object.z_psfFlux_flag_noGoodPixels, dp1.Object.z_psfFluxErr, dp1.Object.z_psfMag, dp1.Object.z_psfMagErr, dp1.Object.z_psfModel_TwoGaussian_chisq_reduced, dp1.Object.z_psfModel_TwoGaussian_gauss1_fluxfrac, dp1.Object.z_psfModel_TwoGaussian_gauss1_rho, dp1.Object.z_psfModel_TwoGaussian_gauss1_sigma_x, dp1.Object.z_psfModel_TwoGaussian_gauss1_sigma_y, dp1.Object.z_psfModel_TwoGaussian_gauss2_rho, dp1.Object.z_psfModel_TwoGaussian_gauss2_sigma_x, dp1.Object.z_psfModel_TwoGaussian_gauss2_sigma_y, dp1.Object.z_psfModel_TwoGaussian_n_iter, dp1.Object.z_psfModel_TwoGaussian_no_inputs_flag, dp1.Object.z_psfModel_TwoGaussian_unknown_flag, dp1.Object.z_ra, dp1.Object.z_ra_dec_Cov, dp1.Object.z_raErr, dp1.Object.z_sersicFlux, dp1.Object.z_sersicFluxErr, dp1.Object.z_sizeExtendedness, dp1.Object.z_sizeExtendedness_flag FROM dp1.Object WHERE objectId=0 diff --git a/src/ccontrol/testdata/parser-corpus/q03_stripped.sql b/src/ccontrol/testdata/parser-corpus/q03_stripped.sql new file mode 100644 index 0000000000..345d78159e --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q03_stripped.sql @@ -0,0 +1 @@ +SELECT Object.coord_dec, Object.coord_decErr, Object.coord_ra, Object.coord_ra_dec_Cov, Object.coord_raErr, Object.deblend_failed, Object.deblend_incompleteData, Object.deblend_isolatedParent, Object.deblend_iterations, Object.deblend_logL, Object.deblend_masked, Object.deblend_nChild, Object.deblend_nPeaks, Object.deblend_parentTooBig, Object.deblend_peak_center_x, Object.deblend_peak_center_y, Object.deblend_skipped, Object.deblend_tooManyPeaks, Object.detect_fromBlend, Object.detect_isDeblendedModelSource, Object.detect_isIsolated, Object.ebv, Object.footprintArea, Object.g_ap03Flux, Object.g_ap03Flux_flag, Object.g_ap03FluxErr, Object.g_ap06Flux, Object.g_ap06Flux_flag, Object.g_ap06FluxErr, Object.g_ap09Flux, Object.g_ap09Flux_flag, Object.g_ap09FluxErr, Object.g_ap12Flux, Object.g_ap12Flux_flag, Object.g_ap12FluxErr, Object.g_ap17Flux, Object.g_ap17Flux_flag, Object.g_ap17FluxErr, Object.g_ap25Flux, Object.g_ap25Flux_flag, Object.g_ap25FluxErr, Object.g_ap35Flux, Object.g_ap35Flux_flag, Object.g_ap35FluxErr, Object.g_ap50Flux, Object.g_ap50Flux_flag, Object.g_ap50FluxErr, Object.g_ap70Flux, Object.g_ap70Flux_flag, Object.g_ap70FluxErr, Object.g_apFlux_flag, Object.g_apFlux_flag_apertureTruncated, Object.g_apFlux_flag_sincCoeffsTruncated, Object.g_bdChi2, Object.g_bdE1, Object.g_bdE2, Object.g_bdFluxB, Object.g_bdFluxBErr, Object.g_bdFluxD, Object.g_bdFluxDErr, Object.g_bdReB, Object.g_bdReD, Object.g_blendedness, Object.g_blendedness_flag, Object.g_calib_astrometry_used, Object.g_calib_photometry_reserved, Object.g_calib_photometry_used, Object.g_calib_psf_candidate, Object.g_calib_psf_reserved, Object.g_calib_psf_used, Object.g_calibFlux, Object.g_calibFlux_flag, Object.g_calibFlux_flag_apertureTruncated, Object.g_calibFlux_flag_sincCoeffsTruncated, Object.g_calibFluxErr, Object.g_centroid_flag, Object.g_centroid_x, Object.g_centroid_xErr, Object.g_centroid_y, Object.g_centroid_yErr, Object.g_cModel_flag, Object.g_cModel_flag_apCorr, Object.g_cModelFlux, Object.g_cModelFlux_inner, Object.g_cModelFluxErr, Object.g_cModelMag, Object.g_cModelMagErr, Object.g_deblend_blendedness, Object.g_deblend_dataCoverage, Object.g_deblend_fluxOverlap, Object.g_deblend_fluxOverlapFraction, Object.g_deblend_zeroFlux, Object.g_dec, Object.g_decErr, Object.g_epoch, Object.g_extendedness, Object.g_extendedness_flag, Object.g_free_cModelFlux, Object.g_free_cModelFlux_flag, Object.g_free_cModelFlux_inner, Object.g_free_cModelFluxErr, Object.g_free_psfFlux, Object.g_free_psfFlux_flag, Object.g_free_psfFluxErr, Object.g_gaap0p7Flux, Object.g_gaap0p7Flux_flag_bigPsf, Object.g_gaap0p7FluxErr, Object.g_gaap1p0Flux, Object.g_gaap1p0Flux_flag_bigPsf, Object.g_gaap1p0FluxErr, Object.g_gaap1p5Flux, Object.g_gaap1p5Flux_flag_bigPsf, Object.g_gaap1p5FluxErr, Object.g_gaap2p5Flux, Object.g_gaap2p5Flux_flag_bigPsf, Object.g_gaap2p5FluxErr, Object.g_gaap3p0Flux, Object.g_gaap3p0Flux_flag_bigPsf, Object.g_gaap3p0FluxErr, Object.g_gaapFlux_flag, Object.g_gaapFlux_flag_edge, Object.g_gaapFlux_flag_gaussianization, Object.g_gaapOptimalFlux, Object.g_gaapOptimalFlux_flag_bigPsf, Object.g_gaapOptimalFluxErr, Object.g_gaapPsfFlux, Object.g_gaapPsfFluxErr, Object.g_hsm_moments_03, Object.g_hsm_moments_04, Object.g_hsm_moments_12, Object.g_hsm_moments_13, Object.g_hsm_moments_21, Object.g_hsm_moments_22, Object.g_hsm_moments_30, Object.g_hsm_moments_31, Object.g_hsm_moments_40, Object.g_hsm_moments_flag, Object.g_hsm_momentsPsf_03, Object.g_hsm_momentsPsf_04, Object.g_hsm_momentsPsf_12, Object.g_hsm_momentsPsf_13, Object.g_hsm_momentsPsf_21, Object.g_hsm_momentsPsf_22, Object.g_hsm_momentsPsf_30, Object.g_hsm_momentsPsf_31, Object.g_hsm_momentsPsf_40, Object.g_hsm_momentsPsf_flag, Object.g_hsmShapeRegauss_e1, Object.g_hsmShapeRegauss_e2, Object.g_hsmShapeRegauss_flag, Object.g_hsmShapeRegauss_sigma, Object.g_i_flag, Object.g_iDebiasedPSF_flag, Object.g_inputCount, Object.g_inputCount_flag, Object.g_inputCount_flag_noInputs, Object.g_invalidPsfFlag, Object.g_iPSF_flag, Object.g_iRound_flag, Object.g_ixx, Object.g_ixxDebiasedPSF, Object.g_ixxPSF, Object.g_ixxRound, Object.g_ixy, Object.g_ixyDebiasedPSF, Object.g_ixyPSF, Object.g_ixyRound, Object.g_iyy, Object.g_iyyDebiasedPSF, Object.g_iyyPSF, Object.g_iyyRound, Object.g_kronFlux, Object.g_kronFlux_flag, Object.g_kronFlux_flag_bad_radius, Object.g_kronFlux_flag_bad_shape, Object.g_kronFlux_flag_bad_shape_no_psf, Object.g_kronFlux_flag_edge, Object.g_kronFlux_flag_no_fallback_radius, Object.g_kronFlux_flag_no_minimum_radius, Object.g_kronFlux_flag_small_radius, Object.g_kronFlux_flag_used_minimum_radius, Object.g_kronFlux_flag_used_psf_radius, Object.g_kronFluxErr, Object.g_kronRad, Object.g_pixelFlags_bad, Object.g_pixelFlags_clipped, Object.g_pixelFlags_clippedCenter, Object.g_pixelFlags_cr, Object.g_pixelFlags_crCenter, Object.g_pixelFlags_edge, Object.g_pixelFlags_inexact_psf, Object.g_pixelFlags_inexact_psfCenter, Object.g_pixelFlags_interpolated, Object.g_pixelFlags_interpolatedCenter, Object.g_pixelFlags_nodata, Object.g_pixelFlags_offimage, Object.g_pixelFlags_saturated, Object.g_pixelFlags_saturatedCenter, Object.g_pixelFlags_sensor_edge, Object.g_pixelFlags_sensor_edgeCenter, Object.g_pixelFlags_suspect, Object.g_pixelFlags_suspectCenter, Object.g_psfFlux, Object.g_psfFlux_area, Object.g_psfFlux_flag, Object.g_psfFlux_flag_apCorr, Object.g_psfFlux_flag_edge, Object.g_psfFlux_flag_noGoodPixels, Object.g_psfFluxErr, Object.g_psfMag, Object.g_psfMagErr, Object.g_psfModel_TwoGaussian_chisq_reduced, Object.g_psfModel_TwoGaussian_gauss1_fluxfrac, Object.g_psfModel_TwoGaussian_gauss1_rho, Object.g_psfModel_TwoGaussian_gauss1_sigma_x, Object.g_psfModel_TwoGaussian_gauss1_sigma_y, Object.g_psfModel_TwoGaussian_gauss2_rho, Object.g_psfModel_TwoGaussian_gauss2_sigma_x, Object.g_psfModel_TwoGaussian_gauss2_sigma_y, Object.g_psfModel_TwoGaussian_n_iter, Object.g_psfModel_TwoGaussian_no_inputs_flag, Object.g_psfModel_TwoGaussian_unknown_flag, Object.g_ra, Object.g_ra_dec_Cov, Object.g_raErr, Object.g_sersicFlux, Object.g_sersicFluxErr, Object.g_sizeExtendedness, Object.g_sizeExtendedness_flag, Object.i_ap03Flux, Object.i_ap03Flux_flag, Object.i_ap03FluxErr, Object.i_ap06Flux, Object.i_ap06Flux_flag, Object.i_ap06FluxErr, Object.i_ap09Flux, Object.i_ap09Flux_flag, Object.i_ap09FluxErr, Object.i_ap12Flux, Object.i_ap12Flux_flag, Object.i_ap12FluxErr, Object.i_ap17Flux, Object.i_ap17Flux_flag, Object.i_ap17FluxErr, Object.i_ap25Flux, Object.i_ap25Flux_flag, Object.i_ap25FluxErr, Object.i_ap35Flux, Object.i_ap35Flux_flag, Object.i_ap35FluxErr, Object.i_ap50Flux, Object.i_ap50Flux_flag, Object.i_ap50FluxErr, Object.i_ap70Flux, Object.i_ap70Flux_flag, Object.i_ap70FluxErr, Object.i_apFlux_flag, Object.i_apFlux_flag_apertureTruncated, Object.i_apFlux_flag_sincCoeffsTruncated, Object.i_bdChi2, Object.i_bdE1, Object.i_bdE2, Object.i_bdFluxB, Object.i_bdFluxBErr, Object.i_bdFluxD, Object.i_bdFluxDErr, Object.i_bdReB, Object.i_bdReD, Object.i_blendedness, Object.i_blendedness_flag, Object.i_calib_astrometry_used, Object.i_calib_photometry_reserved, Object.i_calib_photometry_used, Object.i_calib_psf_candidate, Object.i_calib_psf_reserved, Object.i_calib_psf_used, Object.i_calibFlux, Object.i_calibFlux_flag, Object.i_calibFlux_flag_apertureTruncated, Object.i_calibFlux_flag_sincCoeffsTruncated, Object.i_calibFluxErr, Object.i_centroid_flag, Object.i_centroid_x, Object.i_centroid_xErr, Object.i_centroid_y, Object.i_centroid_yErr, Object.i_cModel_flag, Object.i_cModel_flag_apCorr, Object.i_cModelFlux, Object.i_cModelFlux_inner, Object.i_cModelFluxErr, Object.i_cModelMag, Object.i_cModelMagErr, Object.i_deblend_blendedness, Object.i_deblend_dataCoverage, Object.i_deblend_fluxOverlap, Object.i_deblend_fluxOverlapFraction, Object.i_deblend_zeroFlux, Object.i_dec, Object.i_decErr, Object.i_epoch, Object.i_extendedness, Object.i_extendedness_flag, Object.i_free_cModelFlux, Object.i_free_cModelFlux_flag, Object.i_free_cModelFlux_inner, Object.i_free_cModelFluxErr, Object.i_free_psfFlux, Object.i_free_psfFlux_flag, Object.i_free_psfFluxErr, Object.i_gaap0p7Flux, Object.i_gaap0p7Flux_flag_bigPsf, Object.i_gaap0p7FluxErr, Object.i_gaap1p0Flux, Object.i_gaap1p0Flux_flag_bigPsf, Object.i_gaap1p0FluxErr, Object.i_gaap1p5Flux, Object.i_gaap1p5Flux_flag_bigPsf, Object.i_gaap1p5FluxErr, Object.i_gaap2p5Flux, Object.i_gaap2p5Flux_flag_bigPsf, Object.i_gaap2p5FluxErr, Object.i_gaap3p0Flux, Object.i_gaap3p0Flux_flag_bigPsf, Object.i_gaap3p0FluxErr, Object.i_gaapFlux_flag, Object.i_gaapFlux_flag_edge, Object.i_gaapFlux_flag_gaussianization, Object.i_gaapOptimalFlux, Object.i_gaapOptimalFlux_flag_bigPsf, Object.i_gaapOptimalFluxErr, Object.i_gaapPsfFlux, Object.i_gaapPsfFluxErr, Object.i_hsm_moments_03, Object.i_hsm_moments_04, Object.i_hsm_moments_12, Object.i_hsm_moments_13, Object.i_hsm_moments_21, Object.i_hsm_moments_22, Object.i_hsm_moments_30, Object.i_hsm_moments_31, Object.i_hsm_moments_40, Object.i_hsm_moments_flag, Object.i_hsm_momentsPsf_03, Object.i_hsm_momentsPsf_04, Object.i_hsm_momentsPsf_12, Object.i_hsm_momentsPsf_13, Object.i_hsm_momentsPsf_21, Object.i_hsm_momentsPsf_22, Object.i_hsm_momentsPsf_30, Object.i_hsm_momentsPsf_31, Object.i_hsm_momentsPsf_40, Object.i_hsm_momentsPsf_flag, Object.i_hsmShapeRegauss_e1, Object.i_hsmShapeRegauss_e2, Object.i_hsmShapeRegauss_flag, Object.i_hsmShapeRegauss_sigma, Object.i_i_flag, Object.i_iDebiasedPSF_flag, Object.i_inputCount, Object.i_inputCount_flag, Object.i_inputCount_flag_noInputs, Object.i_invalidPsfFlag, Object.i_iPSF_flag, Object.i_iRound_flag, Object.i_ixx, Object.i_ixxDebiasedPSF, Object.i_ixxPSF, Object.i_ixxRound, Object.i_ixy, Object.i_ixyDebiasedPSF, Object.i_ixyPSF, Object.i_ixyRound, Object.i_iyy, Object.i_iyyDebiasedPSF, Object.i_iyyPSF, Object.i_iyyRound, Object.i_kronFlux, Object.i_kronFlux_flag, Object.i_kronFlux_flag_bad_radius, Object.i_kronFlux_flag_bad_shape, Object.i_kronFlux_flag_bad_shape_no_psf, Object.i_kronFlux_flag_edge, Object.i_kronFlux_flag_no_fallback_radius, Object.i_kronFlux_flag_no_minimum_radius, Object.i_kronFlux_flag_small_radius, Object.i_kronFlux_flag_used_minimum_radius, Object.i_kronFlux_flag_used_psf_radius, Object.i_kronFluxErr, Object.i_kronRad, Object.i_pixelFlags_bad, Object.i_pixelFlags_clipped, Object.i_pixelFlags_clippedCenter, Object.i_pixelFlags_cr, Object.i_pixelFlags_crCenter, Object.i_pixelFlags_edge, Object.i_pixelFlags_inexact_psf, Object.i_pixelFlags_inexact_psfCenter, Object.i_pixelFlags_interpolated, Object.i_pixelFlags_interpolatedCenter, Object.i_pixelFlags_nodata, Object.i_pixelFlags_offimage, Object.i_pixelFlags_saturated, Object.i_pixelFlags_saturatedCenter, Object.i_pixelFlags_sensor_edge, Object.i_pixelFlags_sensor_edgeCenter, Object.i_pixelFlags_suspect, Object.i_pixelFlags_suspectCenter, Object.i_psfFlux, Object.i_psfFlux_area, Object.i_psfFlux_flag, Object.i_psfFlux_flag_apCorr, Object.i_psfFlux_flag_edge, Object.i_psfFlux_flag_noGoodPixels, Object.i_psfFluxErr, Object.i_psfMag, Object.i_psfMagErr, Object.i_psfModel_TwoGaussian_chisq_reduced, Object.i_psfModel_TwoGaussian_gauss1_fluxfrac, Object.i_psfModel_TwoGaussian_gauss1_rho, Object.i_psfModel_TwoGaussian_gauss1_sigma_x, Object.i_psfModel_TwoGaussian_gauss1_sigma_y, Object.i_psfModel_TwoGaussian_gauss2_rho, Object.i_psfModel_TwoGaussian_gauss2_sigma_x, Object.i_psfModel_TwoGaussian_gauss2_sigma_y, Object.i_psfModel_TwoGaussian_n_iter, Object.i_psfModel_TwoGaussian_no_inputs_flag, Object.i_psfModel_TwoGaussian_unknown_flag, Object.i_ra, Object.i_ra_dec_Cov, Object.i_raErr, Object.i_sersicFlux, Object.i_sersicFluxErr, Object.i_sizeExtendedness, Object.i_sizeExtendedness_flag, Object.objectId, Object.parentObjectId, Object.patch, Object.r_ap03Flux, Object.r_ap03Flux_flag, Object.r_ap03FluxErr, Object.r_ap06Flux, Object.r_ap06Flux_flag, Object.r_ap06FluxErr, Object.r_ap09Flux, Object.r_ap09Flux_flag, Object.r_ap09FluxErr, Object.r_ap12Flux, Object.r_ap12Flux_flag, Object.r_ap12FluxErr, Object.r_ap17Flux, Object.r_ap17Flux_flag, Object.r_ap17FluxErr, Object.r_ap25Flux, Object.r_ap25Flux_flag, Object.r_ap25FluxErr, Object.r_ap35Flux, Object.r_ap35Flux_flag, Object.r_ap35FluxErr, Object.r_ap50Flux, Object.r_ap50Flux_flag, Object.r_ap50FluxErr, Object.r_ap70Flux, Object.r_ap70Flux_flag, Object.r_ap70FluxErr, Object.r_apFlux_flag, Object.r_apFlux_flag_apertureTruncated, Object.r_apFlux_flag_sincCoeffsTruncated, Object.r_bdChi2, Object.r_bdE1, Object.r_bdE2, Object.r_bdFluxB, Object.r_bdFluxBErr, Object.r_bdFluxD, Object.r_bdFluxDErr, Object.r_bdReB, Object.r_bdReD, Object.r_blendedness, Object.r_blendedness_flag, Object.r_calib_astrometry_used, Object.r_calib_photometry_reserved, Object.r_calib_photometry_used, Object.r_calib_psf_candidate, Object.r_calib_psf_reserved, Object.r_calib_psf_used, Object.r_calibFlux, Object.r_calibFlux_flag, Object.r_calibFlux_flag_apertureTruncated, Object.r_calibFlux_flag_sincCoeffsTruncated, Object.r_calibFluxErr, Object.r_centroid_flag, Object.r_centroid_x, Object.r_centroid_xErr, Object.r_centroid_y, Object.r_centroid_yErr, Object.r_cModel_flag, Object.r_cModel_flag_apCorr, Object.r_cModelFlux, Object.r_cModelFlux_inner, Object.r_cModelFluxErr, Object.r_cModelMag, Object.r_cModelMagErr, Object.r_deblend_blendedness, Object.r_deblend_dataCoverage, Object.r_deblend_fluxOverlap, Object.r_deblend_fluxOverlapFraction, Object.r_deblend_zeroFlux, Object.r_dec, Object.r_decErr, Object.r_epoch, Object.r_extendedness, Object.r_extendedness_flag, Object.r_free_cModelFlux, Object.r_free_cModelFlux_flag, Object.r_free_cModelFlux_inner, Object.r_free_cModelFluxErr, Object.r_free_psfFlux, Object.r_free_psfFlux_flag, Object.r_free_psfFluxErr, Object.r_gaap0p7Flux, Object.r_gaap0p7Flux_flag_bigPsf, Object.r_gaap0p7FluxErr, Object.r_gaap1p0Flux, Object.r_gaap1p0Flux_flag_bigPsf, Object.r_gaap1p0FluxErr, Object.r_gaap1p5Flux, Object.r_gaap1p5Flux_flag_bigPsf, Object.r_gaap1p5FluxErr, Object.r_gaap2p5Flux, Object.r_gaap2p5Flux_flag_bigPsf, Object.r_gaap2p5FluxErr, Object.r_gaap3p0Flux, Object.r_gaap3p0Flux_flag_bigPsf, Object.r_gaap3p0FluxErr, Object.r_gaapFlux_flag, Object.r_gaapFlux_flag_edge, Object.r_gaapFlux_flag_gaussianization, Object.r_gaapOptimalFlux, Object.r_gaapOptimalFlux_flag_bigPsf, Object.r_gaapOptimalFluxErr, Object.r_gaapPsfFlux, Object.r_gaapPsfFluxErr, Object.r_hsm_moments_03, Object.r_hsm_moments_04, Object.r_hsm_moments_12, Object.r_hsm_moments_13, Object.r_hsm_moments_21, Object.r_hsm_moments_22, Object.r_hsm_moments_30, Object.r_hsm_moments_31, Object.r_hsm_moments_40, Object.r_hsm_moments_flag, Object.r_hsm_momentsPsf_03, Object.r_hsm_momentsPsf_04, Object.r_hsm_momentsPsf_12, Object.r_hsm_momentsPsf_13, Object.r_hsm_momentsPsf_21, Object.r_hsm_momentsPsf_22, Object.r_hsm_momentsPsf_30, Object.r_hsm_momentsPsf_31, Object.r_hsm_momentsPsf_40, Object.r_hsm_momentsPsf_flag, Object.r_hsmShapeRegauss_e1, Object.r_hsmShapeRegauss_e2, Object.r_hsmShapeRegauss_flag, Object.r_hsmShapeRegauss_sigma, Object.r_i_flag, Object.r_iDebiasedPSF_flag, Object.r_inputCount, Object.r_inputCount_flag, Object.r_inputCount_flag_noInputs, Object.r_invalidPsfFlag, Object.r_iPSF_flag, Object.r_iRound_flag, Object.r_ixx, Object.r_ixxDebiasedPSF, Object.r_ixxPSF, Object.r_ixxRound, Object.r_ixy, Object.r_ixyDebiasedPSF, Object.r_ixyPSF, Object.r_ixyRound, Object.r_iyy, Object.r_iyyDebiasedPSF, Object.r_iyyPSF, Object.r_iyyRound, Object.r_kronFlux, Object.r_kronFlux_flag, Object.r_kronFlux_flag_bad_radius, Object.r_kronFlux_flag_bad_shape, Object.r_kronFlux_flag_bad_shape_no_psf, Object.r_kronFlux_flag_edge, Object.r_kronFlux_flag_no_fallback_radius, Object.r_kronFlux_flag_no_minimum_radius, Object.r_kronFlux_flag_small_radius, Object.r_kronFlux_flag_used_minimum_radius, Object.r_kronFlux_flag_used_psf_radius, Object.r_kronFluxErr, Object.r_kronRad, Object.r_pixelFlags_bad, Object.r_pixelFlags_clipped, Object.r_pixelFlags_clippedCenter, Object.r_pixelFlags_cr, Object.r_pixelFlags_crCenter, Object.r_pixelFlags_edge, Object.r_pixelFlags_inexact_psf, Object.r_pixelFlags_inexact_psfCenter, Object.r_pixelFlags_interpolated, Object.r_pixelFlags_interpolatedCenter, Object.r_pixelFlags_nodata, Object.r_pixelFlags_offimage, Object.r_pixelFlags_saturated, Object.r_pixelFlags_saturatedCenter, Object.r_pixelFlags_sensor_edge, Object.r_pixelFlags_sensor_edgeCenter, Object.r_pixelFlags_suspect, Object.r_pixelFlags_suspectCenter, Object.r_psfFlux, Object.r_psfFlux_area, Object.r_psfFlux_flag, Object.r_psfFlux_flag_apCorr, Object.r_psfFlux_flag_edge, Object.r_psfFlux_flag_noGoodPixels, Object.r_psfFluxErr, Object.r_psfMag, Object.r_psfMagErr, Object.r_psfModel_TwoGaussian_chisq_reduced, Object.r_psfModel_TwoGaussian_gauss1_fluxfrac, Object.r_psfModel_TwoGaussian_gauss1_rho, Object.r_psfModel_TwoGaussian_gauss1_sigma_x, Object.r_psfModel_TwoGaussian_gauss1_sigma_y, Object.r_psfModel_TwoGaussian_gauss2_rho, Object.r_psfModel_TwoGaussian_gauss2_sigma_x, Object.r_psfModel_TwoGaussian_gauss2_sigma_y, Object.r_psfModel_TwoGaussian_n_iter, Object.r_psfModel_TwoGaussian_no_inputs_flag, Object.r_psfModel_TwoGaussian_unknown_flag, Object.r_ra, Object.r_ra_dec_Cov, Object.r_raErr, Object.r_sersicFlux, Object.r_sersicFluxErr, Object.r_sizeExtendedness, Object.r_sizeExtendedness_flag, Object.refBand, Object.refExtendedness, Object.refSizeExtendedness, Object.sersic_chisq_reduced, Object.sersic_dec, Object.sersic_decErr, Object.sersic_index, Object.sersic_indexErr, Object.sersic_n_eval_jac, Object.sersic_n_iter, Object.sersic_no_data_flag, Object.sersic_ra, Object.sersic_raErr, Object.sersic_reff_x, Object.sersic_reff_xErr, Object.sersic_reff_y, Object.sersic_reff_yErr, Object.sersic_rho, Object.sersic_rhoErr, Object.sersic_unknown_flag, Object.sersic_x, Object.sersic_xErr, Object.sersic_y, Object.sersic_yErr, Object.shape_flag, Object.shape_xx, Object.shape_xy, Object.shape_yy, Object.tract, Object.u_ap03Flux, Object.u_ap03Flux_flag, Object.u_ap03FluxErr, Object.u_ap06Flux, Object.u_ap06Flux_flag, Object.u_ap06FluxErr, Object.u_ap09Flux, Object.u_ap09Flux_flag, Object.u_ap09FluxErr, Object.u_ap12Flux, Object.u_ap12Flux_flag, Object.u_ap12FluxErr, Object.u_ap17Flux, Object.u_ap17Flux_flag, Object.u_ap17FluxErr, Object.u_ap25Flux, Object.u_ap25Flux_flag, Object.u_ap25FluxErr, Object.u_ap35Flux, Object.u_ap35Flux_flag, Object.u_ap35FluxErr, Object.u_ap50Flux, Object.u_ap50Flux_flag, Object.u_ap50FluxErr, Object.u_ap70Flux, Object.u_ap70Flux_flag, Object.u_ap70FluxErr, Object.u_apFlux_flag, Object.u_apFlux_flag_apertureTruncated, Object.u_apFlux_flag_sincCoeffsTruncated, Object.u_bdChi2, Object.u_bdE1, Object.u_bdE2, Object.u_bdFluxB, Object.u_bdFluxBErr, Object.u_bdFluxD, Object.u_bdFluxDErr, Object.u_bdReB, Object.u_bdReD, Object.u_blendedness, Object.u_blendedness_flag, Object.u_calib_astrometry_used, Object.u_calib_photometry_reserved, Object.u_calib_photometry_used, Object.u_calib_psf_candidate, Object.u_calib_psf_reserved, Object.u_calib_psf_used, Object.u_calibFlux, Object.u_calibFlux_flag, Object.u_calibFlux_flag_apertureTruncated, Object.u_calibFlux_flag_sincCoeffsTruncated, Object.u_calibFluxErr, Object.u_centroid_flag, Object.u_centroid_x, Object.u_centroid_xErr, Object.u_centroid_y, Object.u_centroid_yErr, Object.u_cModel_flag, Object.u_cModel_flag_apCorr, Object.u_cModelFlux, Object.u_cModelFlux_inner, Object.u_cModelFluxErr, Object.u_cModelMag, Object.u_cModelMagErr, Object.u_deblend_blendedness, Object.u_deblend_dataCoverage, Object.u_deblend_fluxOverlap, Object.u_deblend_fluxOverlapFraction, Object.u_deblend_zeroFlux, Object.u_dec, Object.u_decErr, Object.u_epoch, Object.u_extendedness, Object.u_extendedness_flag, Object.u_free_cModelFlux, Object.u_free_cModelFlux_flag, Object.u_free_cModelFlux_inner, Object.u_free_cModelFluxErr, Object.u_free_psfFlux, Object.u_free_psfFlux_flag, Object.u_free_psfFluxErr, Object.u_gaap0p7Flux, Object.u_gaap0p7Flux_flag_bigPsf, Object.u_gaap0p7FluxErr, Object.u_gaap1p0Flux, Object.u_gaap1p0Flux_flag_bigPsf, Object.u_gaap1p0FluxErr, Object.u_gaap1p5Flux, Object.u_gaap1p5Flux_flag_bigPsf, Object.u_gaap1p5FluxErr, Object.u_gaap2p5Flux, Object.u_gaap2p5Flux_flag_bigPsf, Object.u_gaap2p5FluxErr, Object.u_gaap3p0Flux, Object.u_gaap3p0Flux_flag_bigPsf, Object.u_gaap3p0FluxErr, Object.u_gaapFlux_flag, Object.u_gaapFlux_flag_edge, Object.u_gaapFlux_flag_gaussianization, Object.u_gaapOptimalFlux, Object.u_gaapOptimalFlux_flag_bigPsf, Object.u_gaapOptimalFluxErr, Object.u_gaapPsfFlux, Object.u_gaapPsfFluxErr, Object.u_hsm_moments_03, Object.u_hsm_moments_04, Object.u_hsm_moments_12, Object.u_hsm_moments_13, Object.u_hsm_moments_21, Object.u_hsm_moments_22, Object.u_hsm_moments_30, Object.u_hsm_moments_31, Object.u_hsm_moments_40, Object.u_hsm_moments_flag, Object.u_hsm_momentsPsf_03, Object.u_hsm_momentsPsf_04, Object.u_hsm_momentsPsf_12, Object.u_hsm_momentsPsf_13, Object.u_hsm_momentsPsf_21, Object.u_hsm_momentsPsf_22, Object.u_hsm_momentsPsf_30, Object.u_hsm_momentsPsf_31, Object.u_hsm_momentsPsf_40, Object.u_hsm_momentsPsf_flag, Object.u_hsmShapeRegauss_e1, Object.u_hsmShapeRegauss_e2, Object.u_hsmShapeRegauss_flag, Object.u_hsmShapeRegauss_sigma, Object.u_i_flag, Object.u_iDebiasedPSF_flag, Object.u_inputCount, Object.u_inputCount_flag, Object.u_inputCount_flag_noInputs, Object.u_invalidPsfFlag, Object.u_iPSF_flag, Object.u_iRound_flag, Object.u_ixx, Object.u_ixxDebiasedPSF, Object.u_ixxPSF, Object.u_ixxRound, Object.u_ixy, Object.u_ixyDebiasedPSF, Object.u_ixyPSF, Object.u_ixyRound, Object.u_iyy, Object.u_iyyDebiasedPSF, Object.u_iyyPSF, Object.u_iyyRound, Object.u_kronFlux, Object.u_kronFlux_flag, Object.u_kronFlux_flag_bad_radius, Object.u_kronFlux_flag_bad_shape, Object.u_kronFlux_flag_bad_shape_no_psf, Object.u_kronFlux_flag_edge, Object.u_kronFlux_flag_no_fallback_radius, Object.u_kronFlux_flag_no_minimum_radius, Object.u_kronFlux_flag_small_radius, Object.u_kronFlux_flag_used_minimum_radius, Object.u_kronFlux_flag_used_psf_radius, Object.u_kronFluxErr, Object.u_kronRad, Object.u_pixelFlags_bad, Object.u_pixelFlags_clipped, Object.u_pixelFlags_clippedCenter, Object.u_pixelFlags_cr, Object.u_pixelFlags_crCenter, Object.u_pixelFlags_edge, Object.u_pixelFlags_inexact_psf, Object.u_pixelFlags_inexact_psfCenter, Object.u_pixelFlags_interpolated, Object.u_pixelFlags_interpolatedCenter, Object.u_pixelFlags_nodata, Object.u_pixelFlags_offimage, Object.u_pixelFlags_saturated, Object.u_pixelFlags_saturatedCenter, Object.u_pixelFlags_sensor_edge, Object.u_pixelFlags_sensor_edgeCenter, Object.u_pixelFlags_suspect, Object.u_pixelFlags_suspectCenter, Object.u_psfFlux, Object.u_psfFlux_area, Object.u_psfFlux_flag, Object.u_psfFlux_flag_apCorr, Object.u_psfFlux_flag_edge, Object.u_psfFlux_flag_noGoodPixels, Object.u_psfFluxErr, Object.u_psfMag, Object.u_psfMagErr, Object.u_psfModel_TwoGaussian_chisq_reduced, Object.u_psfModel_TwoGaussian_gauss1_fluxfrac, Object.u_psfModel_TwoGaussian_gauss1_rho, Object.u_psfModel_TwoGaussian_gauss1_sigma_x, Object.u_psfModel_TwoGaussian_gauss1_sigma_y, Object.u_psfModel_TwoGaussian_gauss2_rho, Object.u_psfModel_TwoGaussian_gauss2_sigma_x, Object.u_psfModel_TwoGaussian_gauss2_sigma_y, Object.u_psfModel_TwoGaussian_n_iter, Object.u_psfModel_TwoGaussian_no_inputs_flag, Object.u_psfModel_TwoGaussian_unknown_flag, Object.u_ra, Object.u_ra_dec_Cov, Object.u_raErr, Object.u_sersicFlux, Object.u_sersicFluxErr, Object.u_sizeExtendedness, Object.u_sizeExtendedness_flag, Object.x, Object.xErr, Object.xy_flag, Object.y, Object.y_ap03Flux, Object.y_ap03Flux_flag, Object.y_ap03FluxErr, Object.y_ap06Flux, Object.y_ap06Flux_flag, Object.y_ap06FluxErr, Object.y_ap09Flux, Object.y_ap09Flux_flag, Object.y_ap09FluxErr, Object.y_ap12Flux, Object.y_ap12Flux_flag, Object.y_ap12FluxErr, Object.y_ap17Flux, Object.y_ap17Flux_flag, Object.y_ap17FluxErr, Object.y_ap25Flux, Object.y_ap25Flux_flag, Object.y_ap25FluxErr, Object.y_ap35Flux, Object.y_ap35Flux_flag, Object.y_ap35FluxErr, Object.y_ap50Flux, Object.y_ap50Flux_flag, Object.y_ap50FluxErr, Object.y_ap70Flux, Object.y_ap70Flux_flag, Object.y_ap70FluxErr, Object.y_apFlux_flag, Object.y_apFlux_flag_apertureTruncated, Object.y_apFlux_flag_sincCoeffsTruncated, Object.y_bdChi2, Object.y_bdE1, Object.y_bdE2, Object.y_bdFluxB, Object.y_bdFluxBErr, Object.y_bdFluxD, Object.y_bdFluxDErr, Object.y_bdReB, Object.y_bdReD, Object.y_blendedness, Object.y_blendedness_flag, Object.y_calib_astrometry_used, Object.y_calib_photometry_reserved, Object.y_calib_photometry_used, Object.y_calib_psf_candidate, Object.y_calib_psf_reserved, Object.y_calib_psf_used, Object.y_calibFlux, Object.y_calibFlux_flag, Object.y_calibFlux_flag_apertureTruncated, Object.y_calibFlux_flag_sincCoeffsTruncated, Object.y_calibFluxErr, Object.y_centroid_flag, Object.y_centroid_x, Object.y_centroid_xErr, Object.y_centroid_y, Object.y_centroid_yErr, Object.y_cModel_flag, Object.y_cModel_flag_apCorr, Object.y_cModelFlux, Object.y_cModelFlux_inner, Object.y_cModelFluxErr, Object.y_cModelMag, Object.y_cModelMagErr, Object.y_deblend_blendedness, Object.y_deblend_dataCoverage, Object.y_deblend_fluxOverlap, Object.y_deblend_fluxOverlapFraction, Object.y_deblend_zeroFlux, Object.y_dec, Object.y_decErr, Object.y_epoch, Object.y_extendedness, Object.y_extendedness_flag, Object.y_free_cModelFlux, Object.y_free_cModelFlux_flag, Object.y_free_cModelFlux_inner, Object.y_free_cModelFluxErr, Object.y_free_psfFlux, Object.y_free_psfFlux_flag, Object.y_free_psfFluxErr, Object.y_gaap0p7Flux, Object.y_gaap0p7Flux_flag_bigPsf, Object.y_gaap0p7FluxErr, Object.y_gaap1p0Flux, Object.y_gaap1p0Flux_flag_bigPsf, Object.y_gaap1p0FluxErr, Object.y_gaap1p5Flux, Object.y_gaap1p5Flux_flag_bigPsf, Object.y_gaap1p5FluxErr, Object.y_gaap2p5Flux, Object.y_gaap2p5Flux_flag_bigPsf, Object.y_gaap2p5FluxErr, Object.y_gaap3p0Flux, Object.y_gaap3p0Flux_flag_bigPsf, Object.y_gaap3p0FluxErr, Object.y_gaapFlux_flag, Object.y_gaapFlux_flag_edge, Object.y_gaapFlux_flag_gaussianization, Object.y_gaapOptimalFlux, Object.y_gaapOptimalFlux_flag_bigPsf, Object.y_gaapOptimalFluxErr, Object.y_gaapPsfFlux, Object.y_gaapPsfFluxErr, Object.y_hsm_moments_03, Object.y_hsm_moments_04, Object.y_hsm_moments_12, Object.y_hsm_moments_13, Object.y_hsm_moments_21, Object.y_hsm_moments_22, Object.y_hsm_moments_30, Object.y_hsm_moments_31, Object.y_hsm_moments_40, Object.y_hsm_moments_flag, Object.y_hsm_momentsPsf_03, Object.y_hsm_momentsPsf_04, Object.y_hsm_momentsPsf_12, Object.y_hsm_momentsPsf_13, Object.y_hsm_momentsPsf_21, Object.y_hsm_momentsPsf_22, Object.y_hsm_momentsPsf_30, Object.y_hsm_momentsPsf_31, Object.y_hsm_momentsPsf_40, Object.y_hsm_momentsPsf_flag, Object.y_hsmShapeRegauss_e1, Object.y_hsmShapeRegauss_e2, Object.y_hsmShapeRegauss_flag, Object.y_hsmShapeRegauss_sigma, Object.y_i_flag, Object.y_iDebiasedPSF_flag, Object.y_inputCount, Object.y_inputCount_flag, Object.y_inputCount_flag_noInputs, Object.y_invalidPsfFlag, Object.y_iPSF_flag, Object.y_iRound_flag, Object.y_ixx, Object.y_ixxDebiasedPSF, Object.y_ixxPSF, Object.y_ixxRound, Object.y_ixy, Object.y_ixyDebiasedPSF, Object.y_ixyPSF, Object.y_ixyRound, Object.y_iyy, Object.y_iyyDebiasedPSF, Object.y_iyyPSF, Object.y_iyyRound, Object.y_kronFlux, Object.y_kronFlux_flag, Object.y_kronFlux_flag_bad_radius, Object.y_kronFlux_flag_bad_shape, Object.y_kronFlux_flag_bad_shape_no_psf, Object.y_kronFlux_flag_edge, Object.y_kronFlux_flag_no_fallback_radius, Object.y_kronFlux_flag_no_minimum_radius, Object.y_kronFlux_flag_small_radius, Object.y_kronFlux_flag_used_minimum_radius, Object.y_kronFlux_flag_used_psf_radius, Object.y_kronFluxErr, Object.y_kronRad, Object.y_pixelFlags_bad, Object.y_pixelFlags_clipped, Object.y_pixelFlags_clippedCenter, Object.y_pixelFlags_cr, Object.y_pixelFlags_crCenter, Object.y_pixelFlags_edge, Object.y_pixelFlags_inexact_psf, Object.y_pixelFlags_inexact_psfCenter, Object.y_pixelFlags_interpolated, Object.y_pixelFlags_interpolatedCenter, Object.y_pixelFlags_nodata, Object.y_pixelFlags_offimage, Object.y_pixelFlags_saturated, Object.y_pixelFlags_saturatedCenter, Object.y_pixelFlags_sensor_edge, Object.y_pixelFlags_sensor_edgeCenter, Object.y_pixelFlags_suspect, Object.y_pixelFlags_suspectCenter, Object.y_psfFlux, Object.y_psfFlux_area, Object.y_psfFlux_flag, Object.y_psfFlux_flag_apCorr, Object.y_psfFlux_flag_edge, Object.y_psfFlux_flag_noGoodPixels, Object.y_psfFluxErr, Object.y_psfMag, Object.y_psfMagErr, Object.y_psfModel_TwoGaussian_chisq_reduced, Object.y_psfModel_TwoGaussian_gauss1_fluxfrac, Object.y_psfModel_TwoGaussian_gauss1_rho, Object.y_psfModel_TwoGaussian_gauss1_sigma_x, Object.y_psfModel_TwoGaussian_gauss1_sigma_y, Object.y_psfModel_TwoGaussian_gauss2_rho, Object.y_psfModel_TwoGaussian_gauss2_sigma_x, Object.y_psfModel_TwoGaussian_gauss2_sigma_y, Object.y_psfModel_TwoGaussian_n_iter, Object.y_psfModel_TwoGaussian_no_inputs_flag, Object.y_psfModel_TwoGaussian_unknown_flag, Object.y_ra, Object.y_ra_dec_Cov, Object.y_raErr, Object.y_sersicFlux, Object.y_sersicFluxErr, Object.y_sizeExtendedness, Object.y_sizeExtendedness_flag, Object.yErr, Object.z_ap03Flux, Object.z_ap03Flux_flag, Object.z_ap03FluxErr, Object.z_ap06Flux, Object.z_ap06Flux_flag, Object.z_ap06FluxErr, Object.z_ap09Flux, Object.z_ap09Flux_flag, Object.z_ap09FluxErr, Object.z_ap12Flux, Object.z_ap12Flux_flag, Object.z_ap12FluxErr, Object.z_ap17Flux, Object.z_ap17Flux_flag, Object.z_ap17FluxErr, Object.z_ap25Flux, Object.z_ap25Flux_flag, Object.z_ap25FluxErr, Object.z_ap35Flux, Object.z_ap35Flux_flag, Object.z_ap35FluxErr, Object.z_ap50Flux, Object.z_ap50Flux_flag, Object.z_ap50FluxErr, Object.z_ap70Flux, Object.z_ap70Flux_flag, Object.z_ap70FluxErr, Object.z_apFlux_flag, Object.z_apFlux_flag_apertureTruncated, Object.z_apFlux_flag_sincCoeffsTruncated, Object.z_bdChi2, Object.z_bdE1, Object.z_bdE2, Object.z_bdFluxB, Object.z_bdFluxBErr, Object.z_bdFluxD, Object.z_bdFluxDErr, Object.z_bdReB, Object.z_bdReD, Object.z_blendedness, Object.z_blendedness_flag, Object.z_calib_astrometry_used, Object.z_calib_photometry_reserved, Object.z_calib_photometry_used, Object.z_calib_psf_candidate, Object.z_calib_psf_reserved, Object.z_calib_psf_used, Object.z_calibFlux, Object.z_calibFlux_flag, Object.z_calibFlux_flag_apertureTruncated, Object.z_calibFlux_flag_sincCoeffsTruncated, Object.z_calibFluxErr, Object.z_centroid_flag, Object.z_centroid_x, Object.z_centroid_xErr, Object.z_centroid_y, Object.z_centroid_yErr, Object.z_cModel_flag, Object.z_cModel_flag_apCorr, Object.z_cModelFlux, Object.z_cModelFlux_inner, Object.z_cModelFluxErr, Object.z_cModelMag, Object.z_cModelMagErr, Object.z_deblend_blendedness, Object.z_deblend_dataCoverage, Object.z_deblend_fluxOverlap, Object.z_deblend_fluxOverlapFraction, Object.z_deblend_zeroFlux, Object.z_dec, Object.z_decErr, Object.z_epoch, Object.z_extendedness, Object.z_extendedness_flag, Object.z_free_cModelFlux, Object.z_free_cModelFlux_flag, Object.z_free_cModelFlux_inner, Object.z_free_cModelFluxErr, Object.z_free_psfFlux, Object.z_free_psfFlux_flag, Object.z_free_psfFluxErr, Object.z_gaap0p7Flux, Object.z_gaap0p7Flux_flag_bigPsf, Object.z_gaap0p7FluxErr, Object.z_gaap1p0Flux, Object.z_gaap1p0Flux_flag_bigPsf, Object.z_gaap1p0FluxErr, Object.z_gaap1p5Flux, Object.z_gaap1p5Flux_flag_bigPsf, Object.z_gaap1p5FluxErr, Object.z_gaap2p5Flux, Object.z_gaap2p5Flux_flag_bigPsf, Object.z_gaap2p5FluxErr, Object.z_gaap3p0Flux, Object.z_gaap3p0Flux_flag_bigPsf, Object.z_gaap3p0FluxErr, Object.z_gaapFlux_flag, Object.z_gaapFlux_flag_edge, Object.z_gaapFlux_flag_gaussianization, Object.z_gaapOptimalFlux, Object.z_gaapOptimalFlux_flag_bigPsf, Object.z_gaapOptimalFluxErr, Object.z_gaapPsfFlux, Object.z_gaapPsfFluxErr, Object.z_hsm_moments_03, Object.z_hsm_moments_04, Object.z_hsm_moments_12, Object.z_hsm_moments_13, Object.z_hsm_moments_21, Object.z_hsm_moments_22, Object.z_hsm_moments_30, Object.z_hsm_moments_31, Object.z_hsm_moments_40, Object.z_hsm_moments_flag, Object.z_hsm_momentsPsf_03, Object.z_hsm_momentsPsf_04, Object.z_hsm_momentsPsf_12, Object.z_hsm_momentsPsf_13, Object.z_hsm_momentsPsf_21, Object.z_hsm_momentsPsf_22, Object.z_hsm_momentsPsf_30, Object.z_hsm_momentsPsf_31, Object.z_hsm_momentsPsf_40, Object.z_hsm_momentsPsf_flag, Object.z_hsmShapeRegauss_e1, Object.z_hsmShapeRegauss_e2, Object.z_hsmShapeRegauss_flag, Object.z_hsmShapeRegauss_sigma, Object.z_i_flag, Object.z_iDebiasedPSF_flag, Object.z_inputCount, Object.z_inputCount_flag, Object.z_inputCount_flag_noInputs, Object.z_invalidPsfFlag, Object.z_iPSF_flag, Object.z_iRound_flag, Object.z_ixx, Object.z_ixxDebiasedPSF, Object.z_ixxPSF, Object.z_ixxRound, Object.z_ixy, Object.z_ixyDebiasedPSF, Object.z_ixyPSF, Object.z_ixyRound, Object.z_iyy, Object.z_iyyDebiasedPSF, Object.z_iyyPSF, Object.z_iyyRound, Object.z_kronFlux, Object.z_kronFlux_flag, Object.z_kronFlux_flag_bad_radius, Object.z_kronFlux_flag_bad_shape, Object.z_kronFlux_flag_bad_shape_no_psf, Object.z_kronFlux_flag_edge, Object.z_kronFlux_flag_no_fallback_radius, Object.z_kronFlux_flag_no_minimum_radius, Object.z_kronFlux_flag_small_radius, Object.z_kronFlux_flag_used_minimum_radius, Object.z_kronFlux_flag_used_psf_radius, Object.z_kronFluxErr, Object.z_kronRad, Object.z_pixelFlags_bad, Object.z_pixelFlags_clipped, Object.z_pixelFlags_clippedCenter, Object.z_pixelFlags_cr, Object.z_pixelFlags_crCenter, Object.z_pixelFlags_edge, Object.z_pixelFlags_inexact_psf, Object.z_pixelFlags_inexact_psfCenter, Object.z_pixelFlags_interpolated, Object.z_pixelFlags_interpolatedCenter, Object.z_pixelFlags_nodata, Object.z_pixelFlags_offimage, Object.z_pixelFlags_saturated, Object.z_pixelFlags_saturatedCenter, Object.z_pixelFlags_sensor_edge, Object.z_pixelFlags_sensor_edgeCenter, Object.z_pixelFlags_suspect, Object.z_pixelFlags_suspectCenter, Object.z_psfFlux, Object.z_psfFlux_area, Object.z_psfFlux_flag, Object.z_psfFlux_flag_apCorr, Object.z_psfFlux_flag_edge, Object.z_psfFlux_flag_noGoodPixels, Object.z_psfFluxErr, Object.z_psfMag, Object.z_psfMagErr, Object.z_psfModel_TwoGaussian_chisq_reduced, Object.z_psfModel_TwoGaussian_gauss1_fluxfrac, Object.z_psfModel_TwoGaussian_gauss1_rho, Object.z_psfModel_TwoGaussian_gauss1_sigma_x, Object.z_psfModel_TwoGaussian_gauss1_sigma_y, Object.z_psfModel_TwoGaussian_gauss2_rho, Object.z_psfModel_TwoGaussian_gauss2_sigma_x, Object.z_psfModel_TwoGaussian_gauss2_sigma_y, Object.z_psfModel_TwoGaussian_n_iter, Object.z_psfModel_TwoGaussian_no_inputs_flag, Object.z_psfModel_TwoGaussian_unknown_flag, Object.z_ra, Object.z_ra_dec_Cov, Object.z_raErr, Object.z_sersicFlux, Object.z_sersicFluxErr, Object.z_sizeExtendedness, Object.z_sizeExtendedness_flag FROM Object WHERE Object.objectId=0 diff --git a/src/ccontrol/testdata/parser-corpus/q04_object_table_wide.sql b/src/ccontrol/testdata/parser-corpus/q04_object_table_wide.sql new file mode 100644 index 0000000000..ed0706de2d --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q04_object_table_wide.sql @@ -0,0 +1,859 @@ +SELECT + dp1.Object.qserv_trans_id AS qserv_trans_id_raw, + dp1.Object.objectId AS objectId_raw, + dp1.Object.iauId AS iauId_raw, + dp1.Object.ra_PS AS ra_PS_raw, + dp1.Object.ra_PS_Sigma AS ra_PS_Sigma_raw, + dp1.Object.decl_PS AS decl_PS_raw, + dp1.Object.decl_PS_Sigma AS decl_PS_Sigma_raw, + dp1.Object.radecl_PS_Cov AS radecl_PS_Cov_raw, + dp1.Object.htmId20 AS htmId20_raw, + dp1.Object.ra_SG AS ra_SG_raw, + dp1.Object.ra_SG_Sigma AS ra_SG_Sigma_raw, + dp1.Object.decl_SG AS decl_SG_raw, + dp1.Object.decl_SG_Sigma AS decl_SG_Sigma_raw, + dp1.Object.radecl_SG_Cov AS radecl_SG_Cov_raw, + dp1.Object.raRange AS raRange_raw, + dp1.Object.declRange AS declRange_raw, + dp1.Object.muRa_PS AS muRa_PS_raw, + dp1.Object.muRa_PS_Sigma AS muRa_PS_Sigma_raw, + dp1.Object.muDecl_PS AS muDecl_PS_raw, + dp1.Object.muDecl_PS_Sigma AS muDecl_PS_Sigma_raw, + dp1.Object.muRaDecl_PS_Cov AS muRaDecl_PS_Cov_raw, + dp1.Object.parallax_PS AS parallax_PS_raw, + dp1.Object.parallax_PS_Sigma AS parallax_PS_Sigma_raw, + dp1.Object.canonicalFilterId AS canonicalFilterId_raw, + dp1.Object.extendedness AS extendedness_raw, + dp1.Object.varProb AS varProb_raw, + dp1.Object.earliestObsTime AS earliestObsTime_raw, + dp1.Object.latestObsTime AS latestObsTime_raw, + dp1.Object.meanObsTime AS meanObsTime_raw, + dp1.Object.flags AS flags_raw, + dp1.Object.uNumObs AS uNumObs_raw, + dp1.Object.uExtendedness AS uExtendedness_raw, + dp1.Object.uVarProb AS uVarProb_raw, + dp1.Object.uRaOffset_PS AS uRaOffset_PS_raw, + dp1.Object.uRaOffset_PS_Sigma AS uRaOffset_PS_Sigma_raw, + dp1.Object.uDeclOffset_PS AS uDeclOffset_PS_raw, + dp1.Object.uDeclOffset_PS_Sigma AS uDeclOffset_PS_Sigma_raw, + dp1.Object.uRaDeclOffset_PS_Cov AS uRaDeclOffset_PS_Cov_raw, + dp1.Object.uRaOffset_SG AS uRaOffset_SG_raw, + dp1.Object.uRaOffset_SG_Sigma AS uRaOffset_SG_Sigma_raw, + dp1.Object.uDeclOffset_SG AS uDeclOffset_SG_raw, + dp1.Object.uDeclOffset_SG_Sigma AS uDeclOffset_SG_Sigma_raw, + dp1.Object.uRaDeclOffset_SG_Cov AS uRaDeclOffset_SG_Cov_raw, + dp1.Object.uLnL_PS AS uLnL_PS_raw, + dp1.Object.uLnL_SG AS uLnL_SG_raw, + dp1.Object.uFlux_PS AS uFlux_PS_raw, + dp1.Object.uFlux_PS_Sigma AS uFlux_PS_Sigma_raw, + dp1.Object.uFlux_ESG AS uFlux_ESG_raw, + dp1.Object.uFlux_ESG_Sigma AS uFlux_ESG_Sigma_raw, + dp1.Object.uFlux_Gaussian AS uFlux_Gaussian_raw, + dp1.Object.uFlux_Gaussian_Sigma AS uFlux_Gaussian_Sigma_raw, + dp1.Object.uTimescale AS uTimescale_raw, + dp1.Object.uEarliestObsTime AS uEarliestObsTime_raw, + dp1.Object.uLatestObsTime AS uLatestObsTime_raw, + dp1.Object.uSersicN_SG AS uSersicN_SG_raw, + dp1.Object.uSersicN_SG_Sigma AS uSersicN_SG_Sigma_raw, + dp1.Object.uE1_SG AS uE1_SG_raw, + dp1.Object.uE1_SG_Sigma AS uE1_SG_Sigma_raw, + dp1.Object.uE2_SG AS uE2_SG_raw, + dp1.Object.uE2_SG_Sigma AS uE2_SG_Sigma_raw, + dp1.Object.uRadius_SG AS uRadius_SG_raw, + dp1.Object.uRadius_SG_Sigma AS uRadius_SG_Sigma_raw, + dp1.Object.uFlags AS uFlags_raw, + dp1.Object.gNumObs AS gNumObs_raw, + dp1.Object.gExtendedness AS gExtendedness_raw, + dp1.Object.gVarProb AS gVarProb_raw, + dp1.Object.gRaOffset_PS AS gRaOffset_PS_raw, + dp1.Object.gRaOffset_PS_Sigma AS gRaOffset_PS_Sigma_raw, + dp1.Object.gDeclOffset_PS AS gDeclOffset_PS_raw, + dp1.Object.gDeclOffset_PS_Sigma AS gDeclOffset_PS_Sigma_raw, + dp1.Object.gRaDeclOffset_PS_Cov AS gRaDeclOffset_PS_Cov_raw, + dp1.Object.gRaOffset_SG AS gRaOffset_SG_raw, + dp1.Object.gRaOffset_SG_Sigma AS gRaOffset_SG_Sigma_raw, + dp1.Object.gDeclOffset_SG AS gDeclOffset_SG_raw, + dp1.Object.gDeclOffset_SG_Sigma AS gDeclOffset_SG_Sigma_raw, + dp1.Object.gRaDeclOffset_SG_Cov AS gRaDeclOffset_SG_Cov_raw, + dp1.Object.gLnL_PS AS gLnL_PS_raw, + dp1.Object.gLnL_SG AS gLnL_SG_raw, + dp1.Object.gFlux_PS AS gFlux_PS_raw, + dp1.Object.gFlux_PS_Sigma AS gFlux_PS_Sigma_raw, + dp1.Object.gFlux_ESG AS gFlux_ESG_raw, + dp1.Object.gFlux_ESG_Sigma AS gFlux_ESG_Sigma_raw, + dp1.Object.gFlux_Gaussian AS gFlux_Gaussian_raw, + dp1.Object.gFlux_Gaussian_Sigma AS gFlux_Gaussian_Sigma_raw, + dp1.Object.gTimescale AS gTimescale_raw, + dp1.Object.gEarliestObsTime AS gEarliestObsTime_raw, + dp1.Object.gLatestObsTime AS gLatestObsTime_raw, + dp1.Object.gSersicN_SG AS gSersicN_SG_raw, + dp1.Object.gSersicN_SG_Sigma AS gSersicN_SG_Sigma_raw, + dp1.Object.gE1_SG AS gE1_SG_raw, + dp1.Object.gE1_SG_Sigma AS gE1_SG_Sigma_raw, + dp1.Object.gE2_SG AS gE2_SG_raw, + dp1.Object.gE2_SG_Sigma AS gE2_SG_Sigma_raw, + dp1.Object.gRadius_SG AS gRadius_SG_raw, + dp1.Object.gRadius_SG_Sigma AS gRadius_SG_Sigma_raw, + dp1.Object.gFlags AS gFlags_raw, + dp1.Object.rNumObs AS rNumObs_raw, + dp1.Object.rExtendedness AS rExtendedness_raw, + dp1.Object.rVarProb AS rVarProb_raw, + dp1.Object.rRaOffset_PS AS rRaOffset_PS_raw, + dp1.Object.rRaOffset_PS_Sigma AS rRaOffset_PS_Sigma_raw, + dp1.Object.rDeclOffset_PS AS rDeclOffset_PS_raw, + dp1.Object.rDeclOffset_PS_Sigma AS rDeclOffset_PS_Sigma_raw, + dp1.Object.rRaDeclOffset_PS_Cov AS rRaDeclOffset_PS_Cov_raw, + dp1.Object.rRaOffset_SG AS rRaOffset_SG_raw, + dp1.Object.rRaOffset_SG_Sigma AS rRaOffset_SG_Sigma_raw, + dp1.Object.rDeclOffset_SG AS rDeclOffset_SG_raw, + dp1.Object.rDeclOffset_SG_Sigma AS rDeclOffset_SG_Sigma_raw, + dp1.Object.rRaDeclOffset_SG_Cov AS rRaDeclOffset_SG_Cov_raw, + dp1.Object.rLnL_PS AS rLnL_PS_raw, + dp1.Object.rLnL_SG AS rLnL_SG_raw, + dp1.Object.rFlux_PS AS rFlux_PS_raw, + dp1.Object.rFlux_PS_Sigma AS rFlux_PS_Sigma_raw, + dp1.Object.rFlux_ESG AS rFlux_ESG_raw, + dp1.Object.rFlux_ESG_Sigma AS rFlux_ESG_Sigma_raw, + dp1.Object.rFlux_Gaussian AS rFlux_Gaussian_raw, + dp1.Object.rFlux_Gaussian_Sigma AS rFlux_Gaussian_Sigma_raw, + dp1.Object.rTimescale AS rTimescale_raw, + dp1.Object.rEarliestObsTime AS rEarliestObsTime_raw, + dp1.Object.rLatestObsTime AS rLatestObsTime_raw, + dp1.Object.rSersicN_SG AS rSersicN_SG_raw, + dp1.Object.rSersicN_SG_Sigma AS rSersicN_SG_Sigma_raw, + dp1.Object.rE1_SG AS rE1_SG_raw, + dp1.Object.rE1_SG_Sigma AS rE1_SG_Sigma_raw, + dp1.Object.rE2_SG AS rE2_SG_raw, + dp1.Object.rE2_SG_Sigma AS rE2_SG_Sigma_raw, + dp1.Object.rRadius_SG AS rRadius_SG_raw, + dp1.Object.rRadius_SG_Sigma AS rRadius_SG_Sigma_raw, + dp1.Object.rFlags AS rFlags_raw, + dp1.Object.iNumObs AS iNumObs_raw, + dp1.Object.iExtendedness AS iExtendedness_raw, + dp1.Object.iVarProb AS iVarProb_raw, + dp1.Object.iRaOffset_PS AS iRaOffset_PS_raw, + dp1.Object.iRaOffset_PS_Sigma AS iRaOffset_PS_Sigma_raw, + dp1.Object.iDeclOffset_PS AS iDeclOffset_PS_raw, + dp1.Object.iDeclOffset_PS_Sigma AS iDeclOffset_PS_Sigma_raw, + dp1.Object.iRaDeclOffset_PS_Cov AS iRaDeclOffset_PS_Cov_raw, + dp1.Object.iRaOffset_SG AS iRaOffset_SG_raw, + dp1.Object.iRaOffset_SG_Sigma AS iRaOffset_SG_Sigma_raw, + dp1.Object.iDeclOffset_SG AS iDeclOffset_SG_raw, + dp1.Object.iDeclOffset_SG_Sigma AS iDeclOffset_SG_Sigma_raw, + dp1.Object.iRaDeclOffset_SG_Cov AS iRaDeclOffset_SG_Cov_raw, + dp1.Object.iLnL_PS AS iLnL_PS_raw, + dp1.Object.iLnL_SG AS iLnL_SG_raw, + dp1.Object.iFlux_PS AS iFlux_PS_raw, + dp1.Object.iFlux_PS_Sigma AS iFlux_PS_Sigma_raw, + dp1.Object.iFlux_ESG AS iFlux_ESG_raw, + dp1.Object.iFlux_ESG_Sigma AS iFlux_ESG_Sigma_raw, + dp1.Object.iFlux_Gaussian AS iFlux_Gaussian_raw, + dp1.Object.iFlux_Gaussian_Sigma AS iFlux_Gaussian_Sigma_raw, + dp1.Object.iTimescale AS iTimescale_raw, + dp1.Object.iEarliestObsTime AS iEarliestObsTime_raw, + dp1.Object.iLatestObsTime AS iLatestObsTime_raw, + dp1.Object.iSersicN_SG AS iSersicN_SG_raw, + dp1.Object.iSersicN_SG_Sigma AS iSersicN_SG_Sigma_raw, + dp1.Object.iE1_SG AS iE1_SG_raw, + dp1.Object.iE1_SG_Sigma AS iE1_SG_Sigma_raw, + dp1.Object.iE2_SG AS iE2_SG_raw, + dp1.Object.iE2_SG_Sigma AS iE2_SG_Sigma_raw, + dp1.Object.iRadius_SG AS iRadius_SG_raw, + dp1.Object.iRadius_SG_Sigma AS iRadius_SG_Sigma_raw, + dp1.Object.iFlags AS iFlags_raw, + dp1.Object.zNumObs AS zNumObs_raw, + dp1.Object.zExtendedness AS zExtendedness_raw, + dp1.Object.zVarProb AS zVarProb_raw, + dp1.Object.zRaOffset_PS AS zRaOffset_PS_raw, + dp1.Object.zRaOffset_PS_Sigma AS zRaOffset_PS_Sigma_raw, + dp1.Object.zDeclOffset_PS AS zDeclOffset_PS_raw, + dp1.Object.zDeclOffset_PS_Sigma AS zDeclOffset_PS_Sigma_raw, + dp1.Object.zRaDeclOffset_PS_Cov AS zRaDeclOffset_PS_Cov_raw, + dp1.Object.zRaOffset_SG AS zRaOffset_SG_raw, + dp1.Object.zRaOffset_SG_Sigma AS zRaOffset_SG_Sigma_raw, + dp1.Object.zDeclOffset_SG AS zDeclOffset_SG_raw, + dp1.Object.zDeclOffset_SG_Sigma AS zDeclOffset_SG_Sigma_raw, + dp1.Object.zRaDeclOffset_SG_Cov AS zRaDeclOffset_SG_Cov_raw, + dp1.Object.zLnL_PS AS zLnL_PS_raw, + dp1.Object.zLnL_SG AS zLnL_SG_raw, + dp1.Object.zFlux_PS AS zFlux_PS_raw, + dp1.Object.zFlux_PS_Sigma AS zFlux_PS_Sigma_raw, + dp1.Object.zFlux_ESG AS zFlux_ESG_raw, + dp1.Object.zFlux_ESG_Sigma AS zFlux_ESG_Sigma_raw, + dp1.Object.zFlux_Gaussian AS zFlux_Gaussian_raw, + dp1.Object.zFlux_Gaussian_Sigma AS zFlux_Gaussian_Sigma_raw, + dp1.Object.zTimescale AS zTimescale_raw, + dp1.Object.zEarliestObsTime AS zEarliestObsTime_raw, + dp1.Object.zLatestObsTime AS zLatestObsTime_raw, + dp1.Object.zSersicN_SG AS zSersicN_SG_raw, + dp1.Object.zSersicN_SG_Sigma AS zSersicN_SG_Sigma_raw, + dp1.Object.zE1_SG AS zE1_SG_raw, + dp1.Object.zE1_SG_Sigma AS zE1_SG_Sigma_raw, + dp1.Object.zE2_SG AS zE2_SG_raw, + dp1.Object.zE2_SG_Sigma AS zE2_SG_Sigma_raw, + dp1.Object.zRadius_SG AS zRadius_SG_raw, + dp1.Object.zRadius_SG_Sigma AS zRadius_SG_Sigma_raw, + dp1.Object.zFlags AS zFlags_raw, + dp1.Object.yNumObs AS yNumObs_raw, + dp1.Object.yExtendedness AS yExtendedness_raw, + dp1.Object.yVarProb AS yVarProb_raw, + dp1.Object.yRaOffset_PS AS yRaOffset_PS_raw, + dp1.Object.yRaOffset_PS_Sigma AS yRaOffset_PS_Sigma_raw, + dp1.Object.yDeclOffset_PS AS yDeclOffset_PS_raw, + dp1.Object.yDeclOffset_PS_Sigma AS yDeclOffset_PS_Sigma_raw, + dp1.Object.yRaDeclOffset_PS_Cov AS yRaDeclOffset_PS_Cov_raw, + dp1.Object.yRaOffset_SG AS yRaOffset_SG_raw, + dp1.Object.yRaOffset_SG_Sigma AS yRaOffset_SG_Sigma_raw, + dp1.Object.yDeclOffset_SG AS yDeclOffset_SG_raw, + dp1.Object.yDeclOffset_SG_Sigma AS yDeclOffset_SG_Sigma_raw, + dp1.Object.yRaDeclOffset_SG_Cov AS yRaDeclOffset_SG_Cov_raw, + dp1.Object.yLnL_PS AS yLnL_PS_raw, + dp1.Object.yLnL_SG AS yLnL_SG_raw, + dp1.Object.yFlux_PS AS yFlux_PS_raw, + dp1.Object.yFlux_PS_Sigma AS yFlux_PS_Sigma_raw, + dp1.Object.yFlux_ESG AS yFlux_ESG_raw, + dp1.Object.yFlux_ESG_Sigma AS yFlux_ESG_Sigma_raw, + dp1.Object.yFlux_Gaussian AS yFlux_Gaussian_raw, + dp1.Object.yFlux_Gaussian_Sigma AS yFlux_Gaussian_Sigma_raw, + dp1.Object.yTimescale AS yTimescale_raw, + dp1.Object.yEarliestObsTime AS yEarliestObsTime_raw, + dp1.Object.yLatestObsTime AS yLatestObsTime_raw, + dp1.Object.ySersicN_SG AS ySersicN_SG_raw, + dp1.Object.ySersicN_SG_Sigma AS ySersicN_SG_Sigma_raw, + dp1.Object.yE1_SG AS yE1_SG_raw, + dp1.Object.yE1_SG_Sigma AS yE1_SG_Sigma_raw, + dp1.Object.yE2_SG AS yE2_SG_raw, + dp1.Object.yE2_SG_Sigma AS yE2_SG_Sigma_raw, + dp1.Object.yRadius_SG AS yRadius_SG_raw, + dp1.Object.yRadius_SG_Sigma AS yRadius_SG_Sigma_raw, + dp1.Object.yFlags AS yFlags_raw, + dp1.Object.varBinaryField AS varBinaryField_raw, + dp1.Object.chunkId AS chunkId_raw, + dp1.Object.subChunkId AS subChunkId_raw, + (dp1.Object.qserv_trans_id + 0) AS qserv_trans_id_plus_0, + (dp1.Object.objectId + 1) AS objectId_plus_1, + (dp1.Object.iauId + 2) AS iauId_plus_2, + (dp1.Object.ra_PS + 3) AS ra_PS_plus_3, + (dp1.Object.ra_PS_Sigma + 4) AS ra_PS_Sigma_plus_4, + (dp1.Object.decl_PS + 5) AS decl_PS_plus_5, + (dp1.Object.decl_PS_Sigma + 6) AS decl_PS_Sigma_plus_6, + (dp1.Object.radecl_PS_Cov + 7) AS radecl_PS_Cov_plus_7, + (dp1.Object.htmId20 + 8) AS htmId20_plus_8, + (dp1.Object.ra_SG + 9) AS ra_SG_plus_9, + (dp1.Object.ra_SG_Sigma + 10) AS ra_SG_Sigma_plus_10, + (dp1.Object.decl_SG + 11) AS decl_SG_plus_11, + (dp1.Object.decl_SG_Sigma + 12) AS decl_SG_Sigma_plus_12, + (dp1.Object.radecl_SG_Cov + 13) AS radecl_SG_Cov_plus_13, + (dp1.Object.raRange + 14) AS raRange_plus_14, + (dp1.Object.declRange + 15) AS declRange_plus_15, + (dp1.Object.muRa_PS + 16) AS muRa_PS_plus_16, + (dp1.Object.muRa_PS_Sigma + 17) AS muRa_PS_Sigma_plus_17, + (dp1.Object.muDecl_PS + 18) AS muDecl_PS_plus_18, + (dp1.Object.muDecl_PS_Sigma + 0) AS muDecl_PS_Sigma_plus_19, + (dp1.Object.muRaDecl_PS_Cov + 1) AS muRaDecl_PS_Cov_plus_20, + (dp1.Object.parallax_PS + 2) AS parallax_PS_plus_21, + (dp1.Object.parallax_PS_Sigma + 3) AS parallax_PS_Sigma_plus_22, + (dp1.Object.canonicalFilterId + 4) AS canonicalFilterId_plus_23, + (dp1.Object.extendedness + 5) AS extendedness_plus_24, + (dp1.Object.varProb + 6) AS varProb_plus_25, + (dp1.Object.earliestObsTime + 7) AS earliestObsTime_plus_26, + (dp1.Object.latestObsTime + 8) AS latestObsTime_plus_27, + (dp1.Object.meanObsTime + 9) AS meanObsTime_plus_28, + (dp1.Object.flags + 10) AS flags_plus_29, + (dp1.Object.uNumObs + 11) AS uNumObs_plus_30, + (dp1.Object.uExtendedness + 12) AS uExtendedness_plus_31, + (dp1.Object.uVarProb + 13) AS uVarProb_plus_32, + (dp1.Object.uRaOffset_PS + 14) AS uRaOffset_PS_plus_33, + (dp1.Object.uRaOffset_PS_Sigma + 15) AS uRaOffset_PS_Sigma_plus_34, + (dp1.Object.uDeclOffset_PS + 16) AS uDeclOffset_PS_plus_35, + (dp1.Object.uDeclOffset_PS_Sigma + 17) AS uDeclOffset_PS_Sigma_plus_36, + (dp1.Object.uRaDeclOffset_PS_Cov + 18) AS uRaDeclOffset_PS_Cov_plus_37, + (dp1.Object.uRaOffset_SG + 0) AS uRaOffset_SG_plus_38, + (dp1.Object.uRaOffset_SG_Sigma + 1) AS uRaOffset_SG_Sigma_plus_39, + (dp1.Object.uDeclOffset_SG + 2) AS uDeclOffset_SG_plus_40, + (dp1.Object.uDeclOffset_SG_Sigma + 3) AS uDeclOffset_SG_Sigma_plus_41, + (dp1.Object.uRaDeclOffset_SG_Cov + 4) AS uRaDeclOffset_SG_Cov_plus_42, + (dp1.Object.uLnL_PS + 5) AS uLnL_PS_plus_43, + (dp1.Object.uLnL_SG + 6) AS uLnL_SG_plus_44, + (dp1.Object.uFlux_PS + 7) AS uFlux_PS_plus_45, + (dp1.Object.uFlux_PS_Sigma + 8) AS uFlux_PS_Sigma_plus_46, + (dp1.Object.uFlux_ESG + 9) AS uFlux_ESG_plus_47, + (dp1.Object.uFlux_ESG_Sigma + 10) AS uFlux_ESG_Sigma_plus_48, + (dp1.Object.uFlux_Gaussian + 11) AS uFlux_Gaussian_plus_49, + (dp1.Object.uFlux_Gaussian_Sigma + 12) AS uFlux_Gaussian_Sigma_plus_50, + (dp1.Object.uTimescale + 13) AS uTimescale_plus_51, + (dp1.Object.uEarliestObsTime + 14) AS uEarliestObsTime_plus_52, + (dp1.Object.uLatestObsTime + 15) AS uLatestObsTime_plus_53, + (dp1.Object.uSersicN_SG + 16) AS uSersicN_SG_plus_54, + (dp1.Object.uSersicN_SG_Sigma + 17) AS uSersicN_SG_Sigma_plus_55, + (dp1.Object.uE1_SG + 18) AS uE1_SG_plus_56, + (dp1.Object.uE1_SG_Sigma + 0) AS uE1_SG_Sigma_plus_57, + (dp1.Object.uE2_SG + 1) AS uE2_SG_plus_58, + (dp1.Object.uE2_SG_Sigma + 2) AS uE2_SG_Sigma_plus_59, + (dp1.Object.uRadius_SG + 3) AS uRadius_SG_plus_60, + (dp1.Object.uRadius_SG_Sigma + 4) AS uRadius_SG_Sigma_plus_61, + (dp1.Object.uFlags + 5) AS uFlags_plus_62, + (dp1.Object.gNumObs + 6) AS gNumObs_plus_63, + (dp1.Object.gExtendedness + 7) AS gExtendedness_plus_64, + (dp1.Object.gVarProb + 8) AS gVarProb_plus_65, + (dp1.Object.gRaOffset_PS + 9) AS gRaOffset_PS_plus_66, + (dp1.Object.gRaOffset_PS_Sigma + 10) AS gRaOffset_PS_Sigma_plus_67, + (dp1.Object.gDeclOffset_PS + 11) AS gDeclOffset_PS_plus_68, + (dp1.Object.gDeclOffset_PS_Sigma + 12) AS gDeclOffset_PS_Sigma_plus_69, + (dp1.Object.gRaDeclOffset_PS_Cov + 13) AS gRaDeclOffset_PS_Cov_plus_70, + (dp1.Object.gRaOffset_SG + 14) AS gRaOffset_SG_plus_71, + (dp1.Object.gRaOffset_SG_Sigma + 15) AS gRaOffset_SG_Sigma_plus_72, + (dp1.Object.gDeclOffset_SG + 16) AS gDeclOffset_SG_plus_73, + (dp1.Object.gDeclOffset_SG_Sigma + 17) AS gDeclOffset_SG_Sigma_plus_74, + (dp1.Object.gRaDeclOffset_SG_Cov + 18) AS gRaDeclOffset_SG_Cov_plus_75, + (dp1.Object.gLnL_PS + 0) AS gLnL_PS_plus_76, + (dp1.Object.gLnL_SG + 1) AS gLnL_SG_plus_77, + (dp1.Object.gFlux_PS + 2) AS gFlux_PS_plus_78, + (dp1.Object.gFlux_PS_Sigma + 3) AS gFlux_PS_Sigma_plus_79, + (dp1.Object.gFlux_ESG + 4) AS gFlux_ESG_plus_80, + (dp1.Object.gFlux_ESG_Sigma + 5) AS gFlux_ESG_Sigma_plus_81, + (dp1.Object.gFlux_Gaussian + 6) AS gFlux_Gaussian_plus_82, + (dp1.Object.gFlux_Gaussian_Sigma + 7) AS gFlux_Gaussian_Sigma_plus_83, + (dp1.Object.gTimescale + 8) AS gTimescale_plus_84, + (dp1.Object.gEarliestObsTime + 9) AS gEarliestObsTime_plus_85, + (dp1.Object.gLatestObsTime + 10) AS gLatestObsTime_plus_86, + (dp1.Object.gSersicN_SG + 11) AS gSersicN_SG_plus_87, + (dp1.Object.gSersicN_SG_Sigma + 12) AS gSersicN_SG_Sigma_plus_88, + (dp1.Object.gE1_SG + 13) AS gE1_SG_plus_89, + (dp1.Object.gE1_SG_Sigma + 14) AS gE1_SG_Sigma_plus_90, + (dp1.Object.gE2_SG + 15) AS gE2_SG_plus_91, + (dp1.Object.gE2_SG_Sigma + 16) AS gE2_SG_Sigma_plus_92, + (dp1.Object.gRadius_SG + 17) AS gRadius_SG_plus_93, + (dp1.Object.gRadius_SG_Sigma + 18) AS gRadius_SG_Sigma_plus_94, + (dp1.Object.gFlags + 0) AS gFlags_plus_95, + (dp1.Object.rNumObs + 1) AS rNumObs_plus_96, + (dp1.Object.rExtendedness + 2) AS rExtendedness_plus_97, + (dp1.Object.rVarProb + 3) AS rVarProb_plus_98, + (dp1.Object.rRaOffset_PS + 4) AS rRaOffset_PS_plus_99, + (dp1.Object.rRaOffset_PS_Sigma + 5) AS rRaOffset_PS_Sigma_plus_100, + (dp1.Object.rDeclOffset_PS + 6) AS rDeclOffset_PS_plus_101, + (dp1.Object.rDeclOffset_PS_Sigma + 7) AS rDeclOffset_PS_Sigma_plus_102, + (dp1.Object.rRaDeclOffset_PS_Cov + 8) AS rRaDeclOffset_PS_Cov_plus_103, + (dp1.Object.rRaOffset_SG + 9) AS rRaOffset_SG_plus_104, + (dp1.Object.rRaOffset_SG_Sigma + 10) AS rRaOffset_SG_Sigma_plus_105, + (dp1.Object.rDeclOffset_SG + 11) AS rDeclOffset_SG_plus_106, + (dp1.Object.rDeclOffset_SG_Sigma + 12) AS rDeclOffset_SG_Sigma_plus_107, + (dp1.Object.rRaDeclOffset_SG_Cov + 13) AS rRaDeclOffset_SG_Cov_plus_108, + (dp1.Object.rLnL_PS + 14) AS rLnL_PS_plus_109, + (dp1.Object.rLnL_SG + 15) AS rLnL_SG_plus_110, + (dp1.Object.rFlux_PS + 16) AS rFlux_PS_plus_111, + (dp1.Object.rFlux_PS_Sigma + 17) AS rFlux_PS_Sigma_plus_112, + (dp1.Object.rFlux_ESG + 18) AS rFlux_ESG_plus_113, + (dp1.Object.rFlux_ESG_Sigma + 0) AS rFlux_ESG_Sigma_plus_114, + (dp1.Object.rFlux_Gaussian + 1) AS rFlux_Gaussian_plus_115, + (dp1.Object.rFlux_Gaussian_Sigma + 2) AS rFlux_Gaussian_Sigma_plus_116, + (dp1.Object.rTimescale + 3) AS rTimescale_plus_117, + (dp1.Object.rEarliestObsTime + 4) AS rEarliestObsTime_plus_118, + (dp1.Object.rLatestObsTime + 5) AS rLatestObsTime_plus_119, + (dp1.Object.rSersicN_SG + 6) AS rSersicN_SG_plus_120, + (dp1.Object.rSersicN_SG_Sigma + 7) AS rSersicN_SG_Sigma_plus_121, + (dp1.Object.rE1_SG + 8) AS rE1_SG_plus_122, + (dp1.Object.rE1_SG_Sigma + 9) AS rE1_SG_Sigma_plus_123, + (dp1.Object.rE2_SG + 10) AS rE2_SG_plus_124, + (dp1.Object.rE2_SG_Sigma + 11) AS rE2_SG_Sigma_plus_125, + (dp1.Object.rRadius_SG + 12) AS rRadius_SG_plus_126, + (dp1.Object.rRadius_SG_Sigma + 13) AS rRadius_SG_Sigma_plus_127, + (dp1.Object.rFlags + 14) AS rFlags_plus_128, + (dp1.Object.iNumObs + 15) AS iNumObs_plus_129, + (dp1.Object.iExtendedness + 16) AS iExtendedness_plus_130, + (dp1.Object.iVarProb + 17) AS iVarProb_plus_131, + (dp1.Object.iRaOffset_PS + 18) AS iRaOffset_PS_plus_132, + (dp1.Object.iRaOffset_PS_Sigma + 0) AS iRaOffset_PS_Sigma_plus_133, + (dp1.Object.iDeclOffset_PS + 1) AS iDeclOffset_PS_plus_134, + (dp1.Object.iDeclOffset_PS_Sigma + 2) AS iDeclOffset_PS_Sigma_plus_135, + (dp1.Object.iRaDeclOffset_PS_Cov + 3) AS iRaDeclOffset_PS_Cov_plus_136, + (dp1.Object.iRaOffset_SG + 4) AS iRaOffset_SG_plus_137, + (dp1.Object.iRaOffset_SG_Sigma + 5) AS iRaOffset_SG_Sigma_plus_138, + (dp1.Object.iDeclOffset_SG + 6) AS iDeclOffset_SG_plus_139, + (dp1.Object.iDeclOffset_SG_Sigma + 7) AS iDeclOffset_SG_Sigma_plus_140, + (dp1.Object.iRaDeclOffset_SG_Cov + 8) AS iRaDeclOffset_SG_Cov_plus_141, + (dp1.Object.iLnL_PS + 9) AS iLnL_PS_plus_142, + (dp1.Object.iLnL_SG + 10) AS iLnL_SG_plus_143, + (dp1.Object.iFlux_PS + 11) AS iFlux_PS_plus_144, + (dp1.Object.iFlux_PS_Sigma + 12) AS iFlux_PS_Sigma_plus_145, + (dp1.Object.iFlux_ESG + 13) AS iFlux_ESG_plus_146, + (dp1.Object.iFlux_ESG_Sigma + 14) AS iFlux_ESG_Sigma_plus_147, + (dp1.Object.iFlux_Gaussian + 15) AS iFlux_Gaussian_plus_148, + (dp1.Object.iFlux_Gaussian_Sigma + 16) AS iFlux_Gaussian_Sigma_plus_149, + (dp1.Object.iTimescale + 17) AS iTimescale_plus_150, + (dp1.Object.iEarliestObsTime + 18) AS iEarliestObsTime_plus_151, + (dp1.Object.iLatestObsTime + 0) AS iLatestObsTime_plus_152, + (dp1.Object.iSersicN_SG + 1) AS iSersicN_SG_plus_153, + (dp1.Object.iSersicN_SG_Sigma + 2) AS iSersicN_SG_Sigma_plus_154, + (dp1.Object.iE1_SG + 3) AS iE1_SG_plus_155, + (dp1.Object.iE1_SG_Sigma + 4) AS iE1_SG_Sigma_plus_156, + (dp1.Object.iE2_SG + 5) AS iE2_SG_plus_157, + (dp1.Object.iE2_SG_Sigma + 6) AS iE2_SG_Sigma_plus_158, + (dp1.Object.iRadius_SG + 7) AS iRadius_SG_plus_159, + (dp1.Object.iRadius_SG_Sigma + 8) AS iRadius_SG_Sigma_plus_160, + (dp1.Object.iFlags + 9) AS iFlags_plus_161, + (dp1.Object.zNumObs + 10) AS zNumObs_plus_162, + (dp1.Object.zExtendedness + 11) AS zExtendedness_plus_163, + (dp1.Object.zVarProb + 12) AS zVarProb_plus_164, + (dp1.Object.zRaOffset_PS + 13) AS zRaOffset_PS_plus_165, + (dp1.Object.zRaOffset_PS_Sigma + 14) AS zRaOffset_PS_Sigma_plus_166, + (dp1.Object.zDeclOffset_PS + 15) AS zDeclOffset_PS_plus_167, + (dp1.Object.zDeclOffset_PS_Sigma + 16) AS zDeclOffset_PS_Sigma_plus_168, + (dp1.Object.zRaDeclOffset_PS_Cov + 17) AS zRaDeclOffset_PS_Cov_plus_169, + (dp1.Object.zRaOffset_SG + 18) AS zRaOffset_SG_plus_170, + (dp1.Object.zRaOffset_SG_Sigma + 0) AS zRaOffset_SG_Sigma_plus_171, + (dp1.Object.zDeclOffset_SG + 1) AS zDeclOffset_SG_plus_172, + (dp1.Object.zDeclOffset_SG_Sigma + 2) AS zDeclOffset_SG_Sigma_plus_173, + (dp1.Object.zRaDeclOffset_SG_Cov + 3) AS zRaDeclOffset_SG_Cov_plus_174, + (dp1.Object.zLnL_PS + 4) AS zLnL_PS_plus_175, + (dp1.Object.zLnL_SG + 5) AS zLnL_SG_plus_176, + (dp1.Object.zFlux_PS + 6) AS zFlux_PS_plus_177, + (dp1.Object.zFlux_PS_Sigma + 7) AS zFlux_PS_Sigma_plus_178, + (dp1.Object.zFlux_ESG + 8) AS zFlux_ESG_plus_179, + (dp1.Object.zFlux_ESG_Sigma + 9) AS zFlux_ESG_Sigma_plus_180, + (dp1.Object.zFlux_Gaussian + 10) AS zFlux_Gaussian_plus_181, + (dp1.Object.zFlux_Gaussian_Sigma + 11) AS zFlux_Gaussian_Sigma_plus_182, + (dp1.Object.zTimescale + 12) AS zTimescale_plus_183, + (dp1.Object.zEarliestObsTime + 13) AS zEarliestObsTime_plus_184, + (dp1.Object.zLatestObsTime + 14) AS zLatestObsTime_plus_185, + (dp1.Object.zSersicN_SG + 15) AS zSersicN_SG_plus_186, + (dp1.Object.zSersicN_SG_Sigma + 16) AS zSersicN_SG_Sigma_plus_187, + (dp1.Object.zE1_SG + 17) AS zE1_SG_plus_188, + (dp1.Object.zE1_SG_Sigma + 18) AS zE1_SG_Sigma_plus_189, + (dp1.Object.zE2_SG + 0) AS zE2_SG_plus_190, + (dp1.Object.zE2_SG_Sigma + 1) AS zE2_SG_Sigma_plus_191, + (dp1.Object.zRadius_SG + 2) AS zRadius_SG_plus_192, + (dp1.Object.zRadius_SG_Sigma + 3) AS zRadius_SG_Sigma_plus_193, + (dp1.Object.zFlags + 4) AS zFlags_plus_194, + (dp1.Object.yNumObs + 5) AS yNumObs_plus_195, + (dp1.Object.yExtendedness + 6) AS yExtendedness_plus_196, + (dp1.Object.yVarProb + 7) AS yVarProb_plus_197, + (dp1.Object.yRaOffset_PS + 8) AS yRaOffset_PS_plus_198, + (dp1.Object.yRaOffset_PS_Sigma + 9) AS yRaOffset_PS_Sigma_plus_199, + (dp1.Object.yDeclOffset_PS + 10) AS yDeclOffset_PS_plus_200, + (dp1.Object.yDeclOffset_PS_Sigma + 11) AS yDeclOffset_PS_Sigma_plus_201, + (dp1.Object.yRaDeclOffset_PS_Cov + 12) AS yRaDeclOffset_PS_Cov_plus_202, + (dp1.Object.yRaOffset_SG + 13) AS yRaOffset_SG_plus_203, + (dp1.Object.yRaOffset_SG_Sigma + 14) AS yRaOffset_SG_Sigma_plus_204, + (dp1.Object.yDeclOffset_SG + 15) AS yDeclOffset_SG_plus_205, + (dp1.Object.yDeclOffset_SG_Sigma + 16) AS yDeclOffset_SG_Sigma_plus_206, + (dp1.Object.yRaDeclOffset_SG_Cov + 17) AS yRaDeclOffset_SG_Cov_plus_207, + (dp1.Object.yLnL_PS + 18) AS yLnL_PS_plus_208, + (dp1.Object.yLnL_SG + 0) AS yLnL_SG_plus_209, + (dp1.Object.yFlux_PS + 1) AS yFlux_PS_plus_210, + (dp1.Object.yFlux_PS_Sigma + 2) AS yFlux_PS_Sigma_plus_211, + (dp1.Object.yFlux_ESG + 3) AS yFlux_ESG_plus_212, + (dp1.Object.yFlux_ESG_Sigma + 4) AS yFlux_ESG_Sigma_plus_213, + (dp1.Object.yFlux_Gaussian + 5) AS yFlux_Gaussian_plus_214, + (dp1.Object.yFlux_Gaussian_Sigma + 6) AS yFlux_Gaussian_Sigma_plus_215, + (dp1.Object.yTimescale + 7) AS yTimescale_plus_216, + (dp1.Object.yEarliestObsTime + 8) AS yEarliestObsTime_plus_217, + (dp1.Object.yLatestObsTime + 9) AS yLatestObsTime_plus_218, + (dp1.Object.ySersicN_SG + 10) AS ySersicN_SG_plus_219, + (dp1.Object.ySersicN_SG_Sigma + 11) AS ySersicN_SG_Sigma_plus_220, + (dp1.Object.yE1_SG + 12) AS yE1_SG_plus_221, + (dp1.Object.yE1_SG_Sigma + 13) AS yE1_SG_Sigma_plus_222, + (dp1.Object.yE2_SG + 14) AS yE2_SG_plus_223, + (dp1.Object.yE2_SG_Sigma + 15) AS yE2_SG_Sigma_plus_224, + (dp1.Object.yRadius_SG + 16) AS yRadius_SG_plus_225, + (dp1.Object.yRadius_SG_Sigma + 17) AS yRadius_SG_Sigma_plus_226, + (dp1.Object.yFlags + 18) AS yFlags_plus_227, + (dp1.Object.varBinaryField + 0) AS varBinaryField_plus_228, + (dp1.Object.chunkId + 1) AS chunkId_plus_229, + (dp1.Object.subChunkId + 2) AS subChunkId_plus_230, + (dp1.Object.qserv_trans_id - 0) AS qserv_trans_id_minus_0, + (dp1.Object.objectId - 1) AS objectId_minus_1, + (dp1.Object.iauId - 2) AS iauId_minus_2, + (dp1.Object.ra_PS - 3) AS ra_PS_minus_3, + (dp1.Object.ra_PS_Sigma - 4) AS ra_PS_Sigma_minus_4, + (dp1.Object.decl_PS - 5) AS decl_PS_minus_5, + (dp1.Object.decl_PS_Sigma - 6) AS decl_PS_Sigma_minus_6, + (dp1.Object.radecl_PS_Cov - 7) AS radecl_PS_Cov_minus_7, + (dp1.Object.htmId20 - 8) AS htmId20_minus_8, + (dp1.Object.ra_SG - 9) AS ra_SG_minus_9, + (dp1.Object.ra_SG_Sigma - 10) AS ra_SG_Sigma_minus_10, + (dp1.Object.decl_SG - 11) AS decl_SG_minus_11, + (dp1.Object.decl_SG_Sigma - 12) AS decl_SG_Sigma_minus_12, + (dp1.Object.radecl_SG_Cov - 13) AS radecl_SG_Cov_minus_13, + (dp1.Object.raRange - 14) AS raRange_minus_14, + (dp1.Object.declRange - 15) AS declRange_minus_15, + (dp1.Object.muRa_PS - 16) AS muRa_PS_minus_16, + (dp1.Object.muRa_PS_Sigma - 17) AS muRa_PS_Sigma_minus_17, + (dp1.Object.muDecl_PS - 18) AS muDecl_PS_minus_18, + (dp1.Object.muDecl_PS_Sigma - 19) AS muDecl_PS_Sigma_minus_19, + (dp1.Object.muRaDecl_PS_Cov - 20) AS muRaDecl_PS_Cov_minus_20, + (dp1.Object.parallax_PS - 21) AS parallax_PS_minus_21, + (dp1.Object.parallax_PS_Sigma - 22) AS parallax_PS_Sigma_minus_22, + (dp1.Object.canonicalFilterId - 0) AS canonicalFilterId_minus_23, + (dp1.Object.extendedness - 1) AS extendedness_minus_24, + (dp1.Object.varProb - 2) AS varProb_minus_25, + (dp1.Object.earliestObsTime - 3) AS earliestObsTime_minus_26, + (dp1.Object.latestObsTime - 4) AS latestObsTime_minus_27, + (dp1.Object.meanObsTime - 5) AS meanObsTime_minus_28, + (dp1.Object.flags - 6) AS flags_minus_29, + (dp1.Object.uNumObs - 7) AS uNumObs_minus_30, + (dp1.Object.uExtendedness - 8) AS uExtendedness_minus_31, + (dp1.Object.uVarProb - 9) AS uVarProb_minus_32, + (dp1.Object.uRaOffset_PS - 10) AS uRaOffset_PS_minus_33, + (dp1.Object.uRaOffset_PS_Sigma - 11) AS uRaOffset_PS_Sigma_minus_34, + (dp1.Object.uDeclOffset_PS - 12) AS uDeclOffset_PS_minus_35, + (dp1.Object.uDeclOffset_PS_Sigma - 13) AS uDeclOffset_PS_Sigma_minus_36, + (dp1.Object.uRaDeclOffset_PS_Cov - 14) AS uRaDeclOffset_PS_Cov_minus_37, + (dp1.Object.uRaOffset_SG - 15) AS uRaOffset_SG_minus_38, + (dp1.Object.uRaOffset_SG_Sigma - 16) AS uRaOffset_SG_Sigma_minus_39, + (dp1.Object.uDeclOffset_SG - 17) AS uDeclOffset_SG_minus_40, + (dp1.Object.uDeclOffset_SG_Sigma - 18) AS uDeclOffset_SG_Sigma_minus_41, + (dp1.Object.uRaDeclOffset_SG_Cov - 19) AS uRaDeclOffset_SG_Cov_minus_42, + (dp1.Object.uLnL_PS - 20) AS uLnL_PS_minus_43, + (dp1.Object.uLnL_SG - 21) AS uLnL_SG_minus_44, + (dp1.Object.uFlux_PS - 22) AS uFlux_PS_minus_45, + (dp1.Object.uFlux_PS_Sigma - 0) AS uFlux_PS_Sigma_minus_46, + (dp1.Object.uFlux_ESG - 1) AS uFlux_ESG_minus_47, + (dp1.Object.uFlux_ESG_Sigma - 2) AS uFlux_ESG_Sigma_minus_48, + (dp1.Object.uFlux_Gaussian - 3) AS uFlux_Gaussian_minus_49, + (dp1.Object.uFlux_Gaussian_Sigma - 4) AS uFlux_Gaussian_Sigma_minus_50, + (dp1.Object.uTimescale - 5) AS uTimescale_minus_51, + (dp1.Object.uEarliestObsTime - 6) AS uEarliestObsTime_minus_52, + (dp1.Object.uLatestObsTime - 7) AS uLatestObsTime_minus_53, + (dp1.Object.uSersicN_SG - 8) AS uSersicN_SG_minus_54, + (dp1.Object.uSersicN_SG_Sigma - 9) AS uSersicN_SG_Sigma_minus_55, + (dp1.Object.uE1_SG - 10) AS uE1_SG_minus_56, + (dp1.Object.uE1_SG_Sigma - 11) AS uE1_SG_Sigma_minus_57, + (dp1.Object.uE2_SG - 12) AS uE2_SG_minus_58, + (dp1.Object.uE2_SG_Sigma - 13) AS uE2_SG_Sigma_minus_59, + (dp1.Object.uRadius_SG - 14) AS uRadius_SG_minus_60, + (dp1.Object.uRadius_SG_Sigma - 15) AS uRadius_SG_Sigma_minus_61, + (dp1.Object.uFlags - 16) AS uFlags_minus_62, + (dp1.Object.gNumObs - 17) AS gNumObs_minus_63, + (dp1.Object.gExtendedness - 18) AS gExtendedness_minus_64, + (dp1.Object.gVarProb - 19) AS gVarProb_minus_65, + (dp1.Object.gRaOffset_PS - 20) AS gRaOffset_PS_minus_66, + (dp1.Object.gRaOffset_PS_Sigma - 21) AS gRaOffset_PS_Sigma_minus_67, + (dp1.Object.gDeclOffset_PS - 22) AS gDeclOffset_PS_minus_68, + (dp1.Object.gDeclOffset_PS_Sigma - 0) AS gDeclOffset_PS_Sigma_minus_69, + (dp1.Object.gRaDeclOffset_PS_Cov - 1) AS gRaDeclOffset_PS_Cov_minus_70, + (dp1.Object.gRaOffset_SG - 2) AS gRaOffset_SG_minus_71, + (dp1.Object.gRaOffset_SG_Sigma - 3) AS gRaOffset_SG_Sigma_minus_72, + (dp1.Object.gDeclOffset_SG - 4) AS gDeclOffset_SG_minus_73, + (dp1.Object.gDeclOffset_SG_Sigma - 5) AS gDeclOffset_SG_Sigma_minus_74, + (dp1.Object.gRaDeclOffset_SG_Cov - 6) AS gRaDeclOffset_SG_Cov_minus_75, + (dp1.Object.gLnL_PS - 7) AS gLnL_PS_minus_76, + (dp1.Object.gLnL_SG - 8) AS gLnL_SG_minus_77, + (dp1.Object.gFlux_PS - 9) AS gFlux_PS_minus_78, + (dp1.Object.gFlux_PS_Sigma - 10) AS gFlux_PS_Sigma_minus_79, + (dp1.Object.gFlux_ESG - 11) AS gFlux_ESG_minus_80, + (dp1.Object.gFlux_ESG_Sigma - 12) AS gFlux_ESG_Sigma_minus_81, + (dp1.Object.gFlux_Gaussian - 13) AS gFlux_Gaussian_minus_82, + (dp1.Object.gFlux_Gaussian_Sigma - 14) AS gFlux_Gaussian_Sigma_minus_83, + (dp1.Object.gTimescale - 15) AS gTimescale_minus_84, + (dp1.Object.gEarliestObsTime - 16) AS gEarliestObsTime_minus_85, + (dp1.Object.gLatestObsTime - 17) AS gLatestObsTime_minus_86, + (dp1.Object.gSersicN_SG - 18) AS gSersicN_SG_minus_87, + (dp1.Object.gSersicN_SG_Sigma - 19) AS gSersicN_SG_Sigma_minus_88, + (dp1.Object.gE1_SG - 20) AS gE1_SG_minus_89, + (dp1.Object.gE1_SG_Sigma - 21) AS gE1_SG_Sigma_minus_90, + (dp1.Object.gE2_SG - 22) AS gE2_SG_minus_91, + (dp1.Object.gE2_SG_Sigma - 0) AS gE2_SG_Sigma_minus_92, + (dp1.Object.gRadius_SG - 1) AS gRadius_SG_minus_93, + (dp1.Object.gRadius_SG_Sigma - 2) AS gRadius_SG_Sigma_minus_94, + (dp1.Object.gFlags - 3) AS gFlags_minus_95, + (dp1.Object.rNumObs - 4) AS rNumObs_minus_96, + (dp1.Object.rExtendedness - 5) AS rExtendedness_minus_97, + (dp1.Object.rVarProb - 6) AS rVarProb_minus_98, + (dp1.Object.rRaOffset_PS - 7) AS rRaOffset_PS_minus_99, + (dp1.Object.rRaOffset_PS_Sigma - 8) AS rRaOffset_PS_Sigma_minus_100, + (dp1.Object.rDeclOffset_PS - 9) AS rDeclOffset_PS_minus_101, + (dp1.Object.rDeclOffset_PS_Sigma - 10) AS rDeclOffset_PS_Sigma_minus_102, + (dp1.Object.rRaDeclOffset_PS_Cov - 11) AS rRaDeclOffset_PS_Cov_minus_103, + (dp1.Object.rRaOffset_SG - 12) AS rRaOffset_SG_minus_104, + (dp1.Object.rRaOffset_SG_Sigma - 13) AS rRaOffset_SG_Sigma_minus_105, + (dp1.Object.rDeclOffset_SG - 14) AS rDeclOffset_SG_minus_106, + (dp1.Object.rDeclOffset_SG_Sigma - 15) AS rDeclOffset_SG_Sigma_minus_107, + (dp1.Object.rRaDeclOffset_SG_Cov - 16) AS rRaDeclOffset_SG_Cov_minus_108, + (dp1.Object.rLnL_PS - 17) AS rLnL_PS_minus_109, + (dp1.Object.rLnL_SG - 18) AS rLnL_SG_minus_110, + (dp1.Object.rFlux_PS - 19) AS rFlux_PS_minus_111, + (dp1.Object.rFlux_PS_Sigma - 20) AS rFlux_PS_Sigma_minus_112, + (dp1.Object.rFlux_ESG - 21) AS rFlux_ESG_minus_113, + (dp1.Object.rFlux_ESG_Sigma - 22) AS rFlux_ESG_Sigma_minus_114, + (dp1.Object.rFlux_Gaussian - 0) AS rFlux_Gaussian_minus_115, + (dp1.Object.rFlux_Gaussian_Sigma - 1) AS rFlux_Gaussian_Sigma_minus_116, + (dp1.Object.rTimescale - 2) AS rTimescale_minus_117, + (dp1.Object.rEarliestObsTime - 3) AS rEarliestObsTime_minus_118, + (dp1.Object.rLatestObsTime - 4) AS rLatestObsTime_minus_119, + (dp1.Object.rSersicN_SG - 5) AS rSersicN_SG_minus_120, + (dp1.Object.rSersicN_SG_Sigma - 6) AS rSersicN_SG_Sigma_minus_121, + (dp1.Object.rE1_SG - 7) AS rE1_SG_minus_122, + (dp1.Object.rE1_SG_Sigma - 8) AS rE1_SG_Sigma_minus_123, + (dp1.Object.rE2_SG - 9) AS rE2_SG_minus_124, + (dp1.Object.rE2_SG_Sigma - 10) AS rE2_SG_Sigma_minus_125, + (dp1.Object.rRadius_SG - 11) AS rRadius_SG_minus_126, + (dp1.Object.rRadius_SG_Sigma - 12) AS rRadius_SG_Sigma_minus_127, + (dp1.Object.rFlags - 13) AS rFlags_minus_128, + (dp1.Object.iNumObs - 14) AS iNumObs_minus_129, + (dp1.Object.iExtendedness - 15) AS iExtendedness_minus_130, + (dp1.Object.iVarProb - 16) AS iVarProb_minus_131, + (dp1.Object.iRaOffset_PS - 17) AS iRaOffset_PS_minus_132, + (dp1.Object.iRaOffset_PS_Sigma - 18) AS iRaOffset_PS_Sigma_minus_133, + (dp1.Object.iDeclOffset_PS - 19) AS iDeclOffset_PS_minus_134, + (dp1.Object.iDeclOffset_PS_Sigma - 20) AS iDeclOffset_PS_Sigma_minus_135, + (dp1.Object.iRaDeclOffset_PS_Cov - 21) AS iRaDeclOffset_PS_Cov_minus_136, + (dp1.Object.iRaOffset_SG - 22) AS iRaOffset_SG_minus_137, + (dp1.Object.iRaOffset_SG_Sigma - 0) AS iRaOffset_SG_Sigma_minus_138, + (dp1.Object.iDeclOffset_SG - 1) AS iDeclOffset_SG_minus_139, + (dp1.Object.iDeclOffset_SG_Sigma - 2) AS iDeclOffset_SG_Sigma_minus_140, + (dp1.Object.iRaDeclOffset_SG_Cov - 3) AS iRaDeclOffset_SG_Cov_minus_141, + (dp1.Object.iLnL_PS - 4) AS iLnL_PS_minus_142, + (dp1.Object.iLnL_SG - 5) AS iLnL_SG_minus_143, + (dp1.Object.iFlux_PS - 6) AS iFlux_PS_minus_144, + (dp1.Object.iFlux_PS_Sigma - 7) AS iFlux_PS_Sigma_minus_145, + (dp1.Object.iFlux_ESG - 8) AS iFlux_ESG_minus_146, + (dp1.Object.iFlux_ESG_Sigma - 9) AS iFlux_ESG_Sigma_minus_147, + (dp1.Object.iFlux_Gaussian - 10) AS iFlux_Gaussian_minus_148, + (dp1.Object.iFlux_Gaussian_Sigma - 11) AS iFlux_Gaussian_Sigma_minus_149, + (dp1.Object.iTimescale - 12) AS iTimescale_minus_150, + (dp1.Object.iEarliestObsTime - 13) AS iEarliestObsTime_minus_151, + (dp1.Object.iLatestObsTime - 14) AS iLatestObsTime_minus_152, + (dp1.Object.iSersicN_SG - 15) AS iSersicN_SG_minus_153, + (dp1.Object.iSersicN_SG_Sigma - 16) AS iSersicN_SG_Sigma_minus_154, + (dp1.Object.iE1_SG - 17) AS iE1_SG_minus_155, + (dp1.Object.iE1_SG_Sigma - 18) AS iE1_SG_Sigma_minus_156, + (dp1.Object.iE2_SG - 19) AS iE2_SG_minus_157, + (dp1.Object.iE2_SG_Sigma - 20) AS iE2_SG_Sigma_minus_158, + (dp1.Object.iRadius_SG - 21) AS iRadius_SG_minus_159, + (dp1.Object.iRadius_SG_Sigma - 22) AS iRadius_SG_Sigma_minus_160, + (dp1.Object.iFlags - 0) AS iFlags_minus_161, + (dp1.Object.zNumObs - 1) AS zNumObs_minus_162, + (dp1.Object.zExtendedness - 2) AS zExtendedness_minus_163, + (dp1.Object.zVarProb - 3) AS zVarProb_minus_164, + (dp1.Object.zRaOffset_PS - 4) AS zRaOffset_PS_minus_165, + (dp1.Object.zRaOffset_PS_Sigma - 5) AS zRaOffset_PS_Sigma_minus_166, + (dp1.Object.zDeclOffset_PS - 6) AS zDeclOffset_PS_minus_167, + (dp1.Object.zDeclOffset_PS_Sigma - 7) AS zDeclOffset_PS_Sigma_minus_168, + (dp1.Object.zRaDeclOffset_PS_Cov - 8) AS zRaDeclOffset_PS_Cov_minus_169, + (dp1.Object.zRaOffset_SG - 9) AS zRaOffset_SG_minus_170, + (dp1.Object.zRaOffset_SG_Sigma - 10) AS zRaOffset_SG_Sigma_minus_171, + (dp1.Object.zDeclOffset_SG - 11) AS zDeclOffset_SG_minus_172, + (dp1.Object.zDeclOffset_SG_Sigma - 12) AS zDeclOffset_SG_Sigma_minus_173, + (dp1.Object.zRaDeclOffset_SG_Cov - 13) AS zRaDeclOffset_SG_Cov_minus_174, + (dp1.Object.zLnL_PS - 14) AS zLnL_PS_minus_175, + (dp1.Object.zLnL_SG - 15) AS zLnL_SG_minus_176, + (dp1.Object.zFlux_PS - 16) AS zFlux_PS_minus_177, + (dp1.Object.zFlux_PS_Sigma - 17) AS zFlux_PS_Sigma_minus_178, + (dp1.Object.zFlux_ESG - 18) AS zFlux_ESG_minus_179, + (dp1.Object.zFlux_ESG_Sigma - 19) AS zFlux_ESG_Sigma_minus_180, + (dp1.Object.zFlux_Gaussian - 20) AS zFlux_Gaussian_minus_181, + (dp1.Object.zFlux_Gaussian_Sigma - 21) AS zFlux_Gaussian_Sigma_minus_182, + (dp1.Object.zTimescale - 22) AS zTimescale_minus_183, + (dp1.Object.zEarliestObsTime - 0) AS zEarliestObsTime_minus_184, + (dp1.Object.zLatestObsTime - 1) AS zLatestObsTime_minus_185, + (dp1.Object.zSersicN_SG - 2) AS zSersicN_SG_minus_186, + (dp1.Object.zSersicN_SG_Sigma - 3) AS zSersicN_SG_Sigma_minus_187, + (dp1.Object.zE1_SG - 4) AS zE1_SG_minus_188, + (dp1.Object.zE1_SG_Sigma - 5) AS zE1_SG_Sigma_minus_189, + (dp1.Object.zE2_SG - 6) AS zE2_SG_minus_190, + (dp1.Object.zE2_SG_Sigma - 7) AS zE2_SG_Sigma_minus_191, + (dp1.Object.zRadius_SG - 8) AS zRadius_SG_minus_192, + (dp1.Object.zRadius_SG_Sigma - 9) AS zRadius_SG_Sigma_minus_193, + (dp1.Object.zFlags - 10) AS zFlags_minus_194, + (dp1.Object.yNumObs - 11) AS yNumObs_minus_195, + (dp1.Object.yExtendedness - 12) AS yExtendedness_minus_196, + (dp1.Object.yVarProb - 13) AS yVarProb_minus_197, + (dp1.Object.yRaOffset_PS - 14) AS yRaOffset_PS_minus_198, + (dp1.Object.yRaOffset_PS_Sigma - 15) AS yRaOffset_PS_Sigma_minus_199, + (dp1.Object.yDeclOffset_PS - 16) AS yDeclOffset_PS_minus_200, + (dp1.Object.yDeclOffset_PS_Sigma - 17) AS yDeclOffset_PS_Sigma_minus_201, + (dp1.Object.yRaDeclOffset_PS_Cov - 18) AS yRaDeclOffset_PS_Cov_minus_202, + (dp1.Object.yRaOffset_SG - 19) AS yRaOffset_SG_minus_203, + (dp1.Object.yRaOffset_SG_Sigma - 20) AS yRaOffset_SG_Sigma_minus_204, + (dp1.Object.yDeclOffset_SG - 21) AS yDeclOffset_SG_minus_205, + (dp1.Object.yDeclOffset_SG_Sigma - 22) AS yDeclOffset_SG_Sigma_minus_206, + (dp1.Object.yRaDeclOffset_SG_Cov - 0) AS yRaDeclOffset_SG_Cov_minus_207, + (dp1.Object.yLnL_PS - 1) AS yLnL_PS_minus_208, + (dp1.Object.yLnL_SG - 2) AS yLnL_SG_minus_209, + (dp1.Object.yFlux_PS - 3) AS yFlux_PS_minus_210, + (dp1.Object.yFlux_PS_Sigma - 4) AS yFlux_PS_Sigma_minus_211, + (dp1.Object.yFlux_ESG - 5) AS yFlux_ESG_minus_212, + (dp1.Object.yFlux_ESG_Sigma - 6) AS yFlux_ESG_Sigma_minus_213, + (dp1.Object.yFlux_Gaussian - 7) AS yFlux_Gaussian_minus_214, + (dp1.Object.yFlux_Gaussian_Sigma - 8) AS yFlux_Gaussian_Sigma_minus_215, + (dp1.Object.yTimescale - 9) AS yTimescale_minus_216, + (dp1.Object.yEarliestObsTime - 10) AS yEarliestObsTime_minus_217, + (dp1.Object.yLatestObsTime - 11) AS yLatestObsTime_minus_218, + (dp1.Object.ySersicN_SG - 12) AS ySersicN_SG_minus_219, + (dp1.Object.ySersicN_SG_Sigma - 13) AS ySersicN_SG_Sigma_minus_220, + (dp1.Object.yE1_SG - 14) AS yE1_SG_minus_221, + (dp1.Object.yE1_SG_Sigma - 15) AS yE1_SG_Sigma_minus_222, + (dp1.Object.yE2_SG - 16) AS yE2_SG_minus_223, + (dp1.Object.yE2_SG_Sigma - 17) AS yE2_SG_Sigma_minus_224, + (dp1.Object.yRadius_SG - 18) AS yRadius_SG_minus_225, + (dp1.Object.yRadius_SG_Sigma - 19) AS yRadius_SG_Sigma_minus_226, + (dp1.Object.yFlags - 20) AS yFlags_minus_227, + (dp1.Object.varBinaryField - 21) AS varBinaryField_minus_228, + (dp1.Object.chunkId - 22) AS chunkId_minus_229, + (dp1.Object.subChunkId - 0) AS subChunkId_minus_230, + (dp1.Object.qserv_trans_id * 1) AS qserv_trans_id_scale_0, + (dp1.Object.objectId * 2) AS objectId_scale_1, + (dp1.Object.iauId * 3) AS iauId_scale_2, + (dp1.Object.ra_PS * 4) AS ra_PS_scale_3, + (dp1.Object.ra_PS_Sigma * 5) AS ra_PS_Sigma_scale_4, + (dp1.Object.decl_PS * 6) AS decl_PS_scale_5, + (dp1.Object.decl_PS_Sigma * 7) AS decl_PS_Sigma_scale_6, + (dp1.Object.radecl_PS_Cov * 1) AS radecl_PS_Cov_scale_7, + (dp1.Object.htmId20 * 2) AS htmId20_scale_8, + (dp1.Object.ra_SG * 3) AS ra_SG_scale_9, + (dp1.Object.ra_SG_Sigma * 4) AS ra_SG_Sigma_scale_10, + (dp1.Object.decl_SG * 5) AS decl_SG_scale_11, + (dp1.Object.decl_SG_Sigma * 6) AS decl_SG_Sigma_scale_12, + (dp1.Object.radecl_SG_Cov * 7) AS radecl_SG_Cov_scale_13, + (dp1.Object.raRange * 1) AS raRange_scale_14, + (dp1.Object.declRange * 2) AS declRange_scale_15, + (dp1.Object.muRa_PS * 3) AS muRa_PS_scale_16, + (dp1.Object.muRa_PS_Sigma * 4) AS muRa_PS_Sigma_scale_17, + (dp1.Object.muDecl_PS * 5) AS muDecl_PS_scale_18, + (dp1.Object.muDecl_PS_Sigma * 6) AS muDecl_PS_Sigma_scale_19, + (dp1.Object.muRaDecl_PS_Cov * 7) AS muRaDecl_PS_Cov_scale_20, + (dp1.Object.parallax_PS * 1) AS parallax_PS_scale_21, + (dp1.Object.parallax_PS_Sigma * 2) AS parallax_PS_Sigma_scale_22, + (dp1.Object.canonicalFilterId * 3) AS canonicalFilterId_scale_23, + (dp1.Object.extendedness * 4) AS extendedness_scale_24, + (dp1.Object.varProb * 5) AS varProb_scale_25, + (dp1.Object.earliestObsTime * 6) AS earliestObsTime_scale_26, + (dp1.Object.latestObsTime * 7) AS latestObsTime_scale_27, + (dp1.Object.meanObsTime * 1) AS meanObsTime_scale_28, + (dp1.Object.flags * 2) AS flags_scale_29, + (dp1.Object.uNumObs * 3) AS uNumObs_scale_30, + (dp1.Object.uExtendedness * 4) AS uExtendedness_scale_31, + (dp1.Object.uVarProb * 5) AS uVarProb_scale_32, + (dp1.Object.uRaOffset_PS * 6) AS uRaOffset_PS_scale_33, + (dp1.Object.uRaOffset_PS_Sigma * 7) AS uRaOffset_PS_Sigma_scale_34, + (dp1.Object.uDeclOffset_PS * 1) AS uDeclOffset_PS_scale_35, + (dp1.Object.uDeclOffset_PS_Sigma * 2) AS uDeclOffset_PS_Sigma_scale_36, + (dp1.Object.uRaDeclOffset_PS_Cov * 3) AS uRaDeclOffset_PS_Cov_scale_37, + (dp1.Object.uRaOffset_SG * 4) AS uRaOffset_SG_scale_38, + (dp1.Object.uRaOffset_SG_Sigma * 5) AS uRaOffset_SG_Sigma_scale_39, + (dp1.Object.uDeclOffset_SG * 6) AS uDeclOffset_SG_scale_40, + (dp1.Object.uDeclOffset_SG_Sigma * 7) AS uDeclOffset_SG_Sigma_scale_41, + (dp1.Object.uRaDeclOffset_SG_Cov * 1) AS uRaDeclOffset_SG_Cov_scale_42, + (dp1.Object.uLnL_PS * 2) AS uLnL_PS_scale_43, + (dp1.Object.uLnL_SG * 3) AS uLnL_SG_scale_44, + (dp1.Object.uFlux_PS * 4) AS uFlux_PS_scale_45, + (dp1.Object.uFlux_PS_Sigma * 5) AS uFlux_PS_Sigma_scale_46, + (dp1.Object.uFlux_ESG * 6) AS uFlux_ESG_scale_47, + (dp1.Object.uFlux_ESG_Sigma * 7) AS uFlux_ESG_Sigma_scale_48, + (dp1.Object.uFlux_Gaussian * 1) AS uFlux_Gaussian_scale_49, + (dp1.Object.uFlux_Gaussian_Sigma * 2) AS uFlux_Gaussian_Sigma_scale_50, + (dp1.Object.uTimescale * 3) AS uTimescale_scale_51, + (dp1.Object.uEarliestObsTime * 4) AS uEarliestObsTime_scale_52, + (dp1.Object.uLatestObsTime * 5) AS uLatestObsTime_scale_53, + (dp1.Object.uSersicN_SG * 6) AS uSersicN_SG_scale_54, + (dp1.Object.uSersicN_SG_Sigma * 7) AS uSersicN_SG_Sigma_scale_55, + (dp1.Object.uE1_SG * 1) AS uE1_SG_scale_56, + (dp1.Object.uE1_SG_Sigma * 2) AS uE1_SG_Sigma_scale_57, + (dp1.Object.uE2_SG * 3) AS uE2_SG_scale_58, + (dp1.Object.uE2_SG_Sigma * 4) AS uE2_SG_Sigma_scale_59, + (dp1.Object.uRadius_SG * 5) AS uRadius_SG_scale_60, + (dp1.Object.uRadius_SG_Sigma * 6) AS uRadius_SG_Sigma_scale_61, + (dp1.Object.uFlags * 7) AS uFlags_scale_62, + (dp1.Object.gNumObs * 1) AS gNumObs_scale_63, + (dp1.Object.gExtendedness * 2) AS gExtendedness_scale_64, + (dp1.Object.gVarProb * 3) AS gVarProb_scale_65, + (dp1.Object.gRaOffset_PS * 4) AS gRaOffset_PS_scale_66, + (dp1.Object.gRaOffset_PS_Sigma * 5) AS gRaOffset_PS_Sigma_scale_67, + (dp1.Object.gDeclOffset_PS * 6) AS gDeclOffset_PS_scale_68, + (dp1.Object.gDeclOffset_PS_Sigma * 7) AS gDeclOffset_PS_Sigma_scale_69, + (dp1.Object.gRaDeclOffset_PS_Cov * 1) AS gRaDeclOffset_PS_Cov_scale_70, + (dp1.Object.gRaOffset_SG * 2) AS gRaOffset_SG_scale_71, + (dp1.Object.gRaOffset_SG_Sigma * 3) AS gRaOffset_SG_Sigma_scale_72, + (dp1.Object.gDeclOffset_SG * 4) AS gDeclOffset_SG_scale_73, + (dp1.Object.gDeclOffset_SG_Sigma * 5) AS gDeclOffset_SG_Sigma_scale_74, + (dp1.Object.gRaDeclOffset_SG_Cov * 6) AS gRaDeclOffset_SG_Cov_scale_75, + (dp1.Object.gLnL_PS * 7) AS gLnL_PS_scale_76, + (dp1.Object.gLnL_SG * 1) AS gLnL_SG_scale_77, + (dp1.Object.gFlux_PS * 2) AS gFlux_PS_scale_78, + (dp1.Object.gFlux_PS_Sigma * 3) AS gFlux_PS_Sigma_scale_79, + (dp1.Object.gFlux_ESG * 4) AS gFlux_ESG_scale_80, + (dp1.Object.gFlux_ESG_Sigma * 5) AS gFlux_ESG_Sigma_scale_81, + (dp1.Object.gFlux_Gaussian * 6) AS gFlux_Gaussian_scale_82, + (dp1.Object.gFlux_Gaussian_Sigma * 7) AS gFlux_Gaussian_Sigma_scale_83, + (dp1.Object.gTimescale * 1) AS gTimescale_scale_84, + (dp1.Object.gEarliestObsTime * 2) AS gEarliestObsTime_scale_85, + (dp1.Object.gLatestObsTime * 3) AS gLatestObsTime_scale_86, + (dp1.Object.gSersicN_SG * 4) AS gSersicN_SG_scale_87, + (dp1.Object.gSersicN_SG_Sigma * 5) AS gSersicN_SG_Sigma_scale_88, + (dp1.Object.gE1_SG * 6) AS gE1_SG_scale_89, + (dp1.Object.gE1_SG_Sigma * 7) AS gE1_SG_Sigma_scale_90, + (dp1.Object.gE2_SG * 1) AS gE2_SG_scale_91, + (dp1.Object.gE2_SG_Sigma * 2) AS gE2_SG_Sigma_scale_92, + (dp1.Object.gRadius_SG * 3) AS gRadius_SG_scale_93, + (dp1.Object.gRadius_SG_Sigma * 4) AS gRadius_SG_Sigma_scale_94, + (dp1.Object.gFlags * 5) AS gFlags_scale_95, + (dp1.Object.rNumObs * 6) AS rNumObs_scale_96, + (dp1.Object.rExtendedness * 7) AS rExtendedness_scale_97, + (dp1.Object.rVarProb * 1) AS rVarProb_scale_98, + (dp1.Object.rRaOffset_PS * 2) AS rRaOffset_PS_scale_99, + (dp1.Object.rRaOffset_PS_Sigma * 3) AS rRaOffset_PS_Sigma_scale_100, + (dp1.Object.rDeclOffset_PS * 4) AS rDeclOffset_PS_scale_101, + (dp1.Object.rDeclOffset_PS_Sigma * 5) AS rDeclOffset_PS_Sigma_scale_102, + (dp1.Object.rRaDeclOffset_PS_Cov * 6) AS rRaDeclOffset_PS_Cov_scale_103, + (dp1.Object.rRaOffset_SG * 7) AS rRaOffset_SG_scale_104, + (dp1.Object.rRaOffset_SG_Sigma * 1) AS rRaOffset_SG_Sigma_scale_105, + (dp1.Object.rDeclOffset_SG * 2) AS rDeclOffset_SG_scale_106, + (dp1.Object.rDeclOffset_SG_Sigma * 3) AS rDeclOffset_SG_Sigma_scale_107, + (dp1.Object.rRaDeclOffset_SG_Cov * 4) AS rRaDeclOffset_SG_Cov_scale_108, + (dp1.Object.rLnL_PS * 5) AS rLnL_PS_scale_109, + (dp1.Object.rLnL_SG * 6) AS rLnL_SG_scale_110, + (dp1.Object.rFlux_PS * 7) AS rFlux_PS_scale_111, + (dp1.Object.rFlux_PS_Sigma * 1) AS rFlux_PS_Sigma_scale_112, + (dp1.Object.rFlux_ESG * 2) AS rFlux_ESG_scale_113, + (dp1.Object.rFlux_ESG_Sigma * 3) AS rFlux_ESG_Sigma_scale_114, + (dp1.Object.rFlux_Gaussian * 4) AS rFlux_Gaussian_scale_115, + (dp1.Object.rFlux_Gaussian_Sigma * 5) AS rFlux_Gaussian_Sigma_scale_116, + (dp1.Object.rTimescale * 6) AS rTimescale_scale_117, + (dp1.Object.rEarliestObsTime * 7) AS rEarliestObsTime_scale_118, + (dp1.Object.rLatestObsTime * 1) AS rLatestObsTime_scale_119, + (dp1.Object.rSersicN_SG * 2) AS rSersicN_SG_scale_120, + (dp1.Object.rSersicN_SG_Sigma * 3) AS rSersicN_SG_Sigma_scale_121, + (dp1.Object.rE1_SG * 4) AS rE1_SG_scale_122, + (dp1.Object.rE1_SG_Sigma * 5) AS rE1_SG_Sigma_scale_123, + (dp1.Object.rE2_SG * 6) AS rE2_SG_scale_124, + (dp1.Object.rE2_SG_Sigma * 7) AS rE2_SG_Sigma_scale_125, + (dp1.Object.rRadius_SG * 1) AS rRadius_SG_scale_126, + (dp1.Object.rRadius_SG_Sigma * 2) AS rRadius_SG_Sigma_scale_127, + (dp1.Object.rFlags * 3) AS rFlags_scale_128, + (dp1.Object.iNumObs * 4) AS iNumObs_scale_129, + (dp1.Object.iExtendedness * 5) AS iExtendedness_scale_130, + (dp1.Object.iVarProb * 6) AS iVarProb_scale_131, + (dp1.Object.iRaOffset_PS * 7) AS iRaOffset_PS_scale_132, + (dp1.Object.iRaOffset_PS_Sigma * 1) AS iRaOffset_PS_Sigma_scale_133, + (dp1.Object.iDeclOffset_PS * 2) AS iDeclOffset_PS_scale_134, + (dp1.Object.iDeclOffset_PS_Sigma * 3) AS iDeclOffset_PS_Sigma_scale_135, + (dp1.Object.iRaDeclOffset_PS_Cov * 4) AS iRaDeclOffset_PS_Cov_scale_136, + (dp1.Object.iRaOffset_SG * 5) AS iRaOffset_SG_scale_137, + (dp1.Object.iRaOffset_SG_Sigma * 6) AS iRaOffset_SG_Sigma_scale_138, + (dp1.Object.iDeclOffset_SG * 7) AS iDeclOffset_SG_scale_139, + (dp1.Object.iDeclOffset_SG_Sigma * 1) AS iDeclOffset_SG_Sigma_scale_140, + (dp1.Object.iRaDeclOffset_SG_Cov * 2) AS iRaDeclOffset_SG_Cov_scale_141, + (dp1.Object.iLnL_PS * 3) AS iLnL_PS_scale_142, + (dp1.Object.iLnL_SG * 4) AS iLnL_SG_scale_143, + (dp1.Object.iFlux_PS * 5) AS iFlux_PS_scale_144, + (dp1.Object.iFlux_PS_Sigma * 6) AS iFlux_PS_Sigma_scale_145, + (dp1.Object.iFlux_ESG * 7) AS iFlux_ESG_scale_146, + (dp1.Object.iFlux_ESG_Sigma * 1) AS iFlux_ESG_Sigma_scale_147, + (dp1.Object.iFlux_Gaussian * 2) AS iFlux_Gaussian_scale_148, + (dp1.Object.iFlux_Gaussian_Sigma * 3) AS iFlux_Gaussian_Sigma_scale_149, + (dp1.Object.iTimescale * 4) AS iTimescale_scale_150, + (dp1.Object.iEarliestObsTime * 5) AS iEarliestObsTime_scale_151, + (dp1.Object.iLatestObsTime * 6) AS iLatestObsTime_scale_152, + (dp1.Object.iSersicN_SG * 7) AS iSersicN_SG_scale_153, + (dp1.Object.iSersicN_SG_Sigma * 1) AS iSersicN_SG_Sigma_scale_154, + (dp1.Object.iE1_SG * 2) AS iE1_SG_scale_155, + (dp1.Object.iE1_SG_Sigma * 3) AS iE1_SG_Sigma_scale_156, + (dp1.Object.iE2_SG * 4) AS iE2_SG_scale_157, + (dp1.Object.iE2_SG_Sigma * 5) AS iE2_SG_Sigma_scale_158, + (dp1.Object.iRadius_SG * 6) AS iRadius_SG_scale_159 +FROM dp1.Object +WHERE objectId BETWEEN 100000 AND 999999 + AND ra_PS >= 0 + AND decl_PS <= 90 + AND canonicalFilterId IN (1, 2, 3, 4, 5) diff --git a/src/ccontrol/testdata/parser-corpus/q05_q3_wider_expressions.sql b/src/ccontrol/testdata/parser-corpus/q05_q3_wider_expressions.sql new file mode 100644 index 0000000000..3ffc976b51 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q05_q3_wider_expressions.sql @@ -0,0 +1,1721 @@ +SELECT + dp1.Object.coord_dec AS coord_dec_raw, + dp1.Object.coord_decErr AS coord_decErr_raw, + dp1.Object.coord_ra AS coord_ra_raw, + dp1.Object.coord_ra_dec_Cov AS coord_ra_dec_Cov_raw, + dp1.Object.coord_raErr AS coord_raErr_raw, + dp1.Object.deblend_failed AS deblend_failed_raw, + dp1.Object.deblend_incompleteData AS deblend_incompleteData_raw, + dp1.Object.deblend_isolatedParent AS deblend_isolatedParent_raw, + dp1.Object.deblend_iterations AS deblend_iterations_raw, + dp1.Object.deblend_logL AS deblend_logL_raw, + dp1.Object.deblend_masked AS deblend_masked_raw, + dp1.Object.deblend_nChild AS deblend_nChild_raw, + dp1.Object.deblend_nPeaks AS deblend_nPeaks_raw, + dp1.Object.deblend_parentTooBig AS deblend_parentTooBig_raw, + dp1.Object.deblend_peak_center_x AS deblend_peak_center_x_raw, + dp1.Object.deblend_peak_center_y AS deblend_peak_center_y_raw, + dp1.Object.deblend_skipped AS deblend_skipped_raw, + dp1.Object.deblend_tooManyPeaks AS deblend_tooManyPeaks_raw, + dp1.Object.detect_fromBlend AS detect_fromBlend_raw, + dp1.Object.detect_isDeblendedModelSource AS detect_isDeblendedModelSource_raw, + dp1.Object.detect_isIsolated AS detect_isIsolated_raw, + dp1.Object.ebv AS ebv_raw, + dp1.Object.footprintArea AS footprintArea_raw, + dp1.Object.g_ap03Flux AS g_ap03Flux_raw, + dp1.Object.g_ap03Flux_flag AS g_ap03Flux_flag_raw, + dp1.Object.g_ap03FluxErr AS g_ap03FluxErr_raw, + dp1.Object.g_ap06Flux AS g_ap06Flux_raw, + dp1.Object.g_ap06Flux_flag AS g_ap06Flux_flag_raw, + dp1.Object.g_ap06FluxErr AS g_ap06FluxErr_raw, + dp1.Object.g_ap09Flux AS g_ap09Flux_raw, + dp1.Object.g_ap09Flux_flag AS g_ap09Flux_flag_raw, + dp1.Object.g_ap09FluxErr AS g_ap09FluxErr_raw, + dp1.Object.g_ap12Flux AS g_ap12Flux_raw, + dp1.Object.g_ap12Flux_flag AS g_ap12Flux_flag_raw, + dp1.Object.g_ap12FluxErr AS g_ap12FluxErr_raw, + dp1.Object.g_ap17Flux AS g_ap17Flux_raw, + dp1.Object.g_ap17Flux_flag AS g_ap17Flux_flag_raw, + dp1.Object.g_ap17FluxErr AS g_ap17FluxErr_raw, + dp1.Object.g_ap25Flux AS g_ap25Flux_raw, + dp1.Object.g_ap25Flux_flag AS g_ap25Flux_flag_raw, + dp1.Object.g_ap25FluxErr AS g_ap25FluxErr_raw, + dp1.Object.g_ap35Flux AS g_ap35Flux_raw, + dp1.Object.g_ap35Flux_flag AS g_ap35Flux_flag_raw, + dp1.Object.g_ap35FluxErr AS g_ap35FluxErr_raw, + dp1.Object.g_ap50Flux AS g_ap50Flux_raw, + dp1.Object.g_ap50Flux_flag AS g_ap50Flux_flag_raw, + dp1.Object.g_ap50FluxErr AS g_ap50FluxErr_raw, + dp1.Object.g_ap70Flux AS g_ap70Flux_raw, + dp1.Object.g_ap70Flux_flag AS g_ap70Flux_flag_raw, + dp1.Object.g_ap70FluxErr AS g_ap70FluxErr_raw, + dp1.Object.g_apFlux_flag AS g_apFlux_flag_raw, + dp1.Object.g_apFlux_flag_apertureTruncated AS g_apFlux_flag_apertureTruncated_raw, + dp1.Object.g_apFlux_flag_sincCoeffsTruncated AS g_apFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.g_bdChi2 AS g_bdChi2_raw, + dp1.Object.g_bdE1 AS g_bdE1_raw, + dp1.Object.g_bdE2 AS g_bdE2_raw, + dp1.Object.g_bdFluxB AS g_bdFluxB_raw, + dp1.Object.g_bdFluxBErr AS g_bdFluxBErr_raw, + dp1.Object.g_bdFluxD AS g_bdFluxD_raw, + dp1.Object.g_bdFluxDErr AS g_bdFluxDErr_raw, + dp1.Object.g_bdReB AS g_bdReB_raw, + dp1.Object.g_bdReD AS g_bdReD_raw, + dp1.Object.g_blendedness AS g_blendedness_raw, + dp1.Object.g_blendedness_flag AS g_blendedness_flag_raw, + dp1.Object.g_calib_astrometry_used AS g_calib_astrometry_used_raw, + dp1.Object.g_calib_photometry_reserved AS g_calib_photometry_reserved_raw, + dp1.Object.g_calib_photometry_used AS g_calib_photometry_used_raw, + dp1.Object.g_calib_psf_candidate AS g_calib_psf_candidate_raw, + dp1.Object.g_calib_psf_reserved AS g_calib_psf_reserved_raw, + dp1.Object.g_calib_psf_used AS g_calib_psf_used_raw, + dp1.Object.g_calibFlux AS g_calibFlux_raw, + dp1.Object.g_calibFlux_flag AS g_calibFlux_flag_raw, + dp1.Object.g_calibFlux_flag_apertureTruncated AS g_calibFlux_flag_apertureTruncated_raw, + dp1.Object.g_calibFlux_flag_sincCoeffsTruncated AS g_calibFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.g_calibFluxErr AS g_calibFluxErr_raw, + dp1.Object.g_centroid_flag AS g_centroid_flag_raw, + dp1.Object.g_centroid_x AS g_centroid_x_raw, + dp1.Object.g_centroid_xErr AS g_centroid_xErr_raw, + dp1.Object.g_centroid_y AS g_centroid_y_raw, + dp1.Object.g_centroid_yErr AS g_centroid_yErr_raw, + dp1.Object.g_cModel_flag AS g_cModel_flag_raw, + dp1.Object.g_cModel_flag_apCorr AS g_cModel_flag_apCorr_raw, + dp1.Object.g_cModelFlux AS g_cModelFlux_raw, + dp1.Object.g_cModelFlux_inner AS g_cModelFlux_inner_raw, + dp1.Object.g_cModelFluxErr AS g_cModelFluxErr_raw, + dp1.Object.g_cModelMag AS g_cModelMag_raw, + dp1.Object.g_cModelMagErr AS g_cModelMagErr_raw, + dp1.Object.g_deblend_blendedness AS g_deblend_blendedness_raw, + dp1.Object.g_deblend_dataCoverage AS g_deblend_dataCoverage_raw, + dp1.Object.g_deblend_fluxOverlap AS g_deblend_fluxOverlap_raw, + dp1.Object.g_deblend_fluxOverlapFraction AS g_deblend_fluxOverlapFraction_raw, + dp1.Object.g_deblend_zeroFlux AS g_deblend_zeroFlux_raw, + dp1.Object.g_dec AS g_dec_raw, + dp1.Object.g_decErr AS g_decErr_raw, + dp1.Object.g_epoch AS g_epoch_raw, + dp1.Object.g_extendedness AS g_extendedness_raw, + dp1.Object.g_extendedness_flag AS g_extendedness_flag_raw, + dp1.Object.g_free_cModelFlux AS g_free_cModelFlux_raw, + dp1.Object.g_free_cModelFlux_flag AS g_free_cModelFlux_flag_raw, + dp1.Object.g_free_cModelFlux_inner AS g_free_cModelFlux_inner_raw, + dp1.Object.g_free_cModelFluxErr AS g_free_cModelFluxErr_raw, + dp1.Object.g_free_psfFlux AS g_free_psfFlux_raw, + dp1.Object.g_free_psfFlux_flag AS g_free_psfFlux_flag_raw, + dp1.Object.g_free_psfFluxErr AS g_free_psfFluxErr_raw, + dp1.Object.g_gaap0p7Flux AS g_gaap0p7Flux_raw, + dp1.Object.g_gaap0p7Flux_flag_bigPsf AS g_gaap0p7Flux_flag_bigPsf_raw, + dp1.Object.g_gaap0p7FluxErr AS g_gaap0p7FluxErr_raw, + dp1.Object.g_gaap1p0Flux AS g_gaap1p0Flux_raw, + dp1.Object.g_gaap1p0Flux_flag_bigPsf AS g_gaap1p0Flux_flag_bigPsf_raw, + dp1.Object.g_gaap1p0FluxErr AS g_gaap1p0FluxErr_raw, + dp1.Object.g_gaap1p5Flux AS g_gaap1p5Flux_raw, + dp1.Object.g_gaap1p5Flux_flag_bigPsf AS g_gaap1p5Flux_flag_bigPsf_raw, + dp1.Object.g_gaap1p5FluxErr AS g_gaap1p5FluxErr_raw, + dp1.Object.g_gaap2p5Flux AS g_gaap2p5Flux_raw, + dp1.Object.g_gaap2p5Flux_flag_bigPsf AS g_gaap2p5Flux_flag_bigPsf_raw, + dp1.Object.g_gaap2p5FluxErr AS g_gaap2p5FluxErr_raw, + dp1.Object.g_gaap3p0Flux AS g_gaap3p0Flux_raw, + dp1.Object.g_gaap3p0Flux_flag_bigPsf AS g_gaap3p0Flux_flag_bigPsf_raw, + dp1.Object.g_gaap3p0FluxErr AS g_gaap3p0FluxErr_raw, + dp1.Object.g_gaapFlux_flag AS g_gaapFlux_flag_raw, + dp1.Object.g_gaapFlux_flag_edge AS g_gaapFlux_flag_edge_raw, + dp1.Object.g_gaapFlux_flag_gaussianization AS g_gaapFlux_flag_gaussianization_raw, + dp1.Object.g_gaapOptimalFlux AS g_gaapOptimalFlux_raw, + dp1.Object.g_gaapOptimalFlux_flag_bigPsf AS g_gaapOptimalFlux_flag_bigPsf_raw, + dp1.Object.g_gaapOptimalFluxErr AS g_gaapOptimalFluxErr_raw, + dp1.Object.g_gaapPsfFlux AS g_gaapPsfFlux_raw, + dp1.Object.g_gaapPsfFluxErr AS g_gaapPsfFluxErr_raw, + dp1.Object.g_hsm_moments_03 AS g_hsm_moments_03_raw, + dp1.Object.g_hsm_moments_04 AS g_hsm_moments_04_raw, + dp1.Object.g_hsm_moments_12 AS g_hsm_moments_12_raw, + dp1.Object.g_hsm_moments_13 AS g_hsm_moments_13_raw, + dp1.Object.g_hsm_moments_21 AS g_hsm_moments_21_raw, + dp1.Object.g_hsm_moments_22 AS g_hsm_moments_22_raw, + dp1.Object.g_hsm_moments_30 AS g_hsm_moments_30_raw, + dp1.Object.g_hsm_moments_31 AS g_hsm_moments_31_raw, + dp1.Object.g_hsm_moments_40 AS g_hsm_moments_40_raw, + dp1.Object.g_hsm_moments_flag AS g_hsm_moments_flag_raw, + dp1.Object.g_hsm_momentsPsf_03 AS g_hsm_momentsPsf_03_raw, + dp1.Object.g_hsm_momentsPsf_04 AS g_hsm_momentsPsf_04_raw, + dp1.Object.g_hsm_momentsPsf_12 AS g_hsm_momentsPsf_12_raw, + dp1.Object.g_hsm_momentsPsf_13 AS g_hsm_momentsPsf_13_raw, + dp1.Object.g_hsm_momentsPsf_21 AS g_hsm_momentsPsf_21_raw, + dp1.Object.g_hsm_momentsPsf_22 AS g_hsm_momentsPsf_22_raw, + dp1.Object.g_hsm_momentsPsf_30 AS g_hsm_momentsPsf_30_raw, + dp1.Object.g_hsm_momentsPsf_31 AS g_hsm_momentsPsf_31_raw, + dp1.Object.g_hsm_momentsPsf_40 AS g_hsm_momentsPsf_40_raw, + dp1.Object.g_hsm_momentsPsf_flag AS g_hsm_momentsPsf_flag_raw, + dp1.Object.g_hsmShapeRegauss_e1 AS g_hsmShapeRegauss_e1_raw, + dp1.Object.g_hsmShapeRegauss_e2 AS g_hsmShapeRegauss_e2_raw, + dp1.Object.g_hsmShapeRegauss_flag AS g_hsmShapeRegauss_flag_raw, + dp1.Object.g_hsmShapeRegauss_sigma AS g_hsmShapeRegauss_sigma_raw, + dp1.Object.g_i_flag AS g_i_flag_raw, + dp1.Object.g_iDebiasedPSF_flag AS g_iDebiasedPSF_flag_raw, + dp1.Object.g_inputCount AS g_inputCount_raw, + dp1.Object.g_inputCount_flag AS g_inputCount_flag_raw, + dp1.Object.g_inputCount_flag_noInputs AS g_inputCount_flag_noInputs_raw, + dp1.Object.g_invalidPsfFlag AS g_invalidPsfFlag_raw, + dp1.Object.g_iPSF_flag AS g_iPSF_flag_raw, + dp1.Object.g_iRound_flag AS g_iRound_flag_raw, + dp1.Object.g_ixx AS g_ixx_raw, + dp1.Object.g_ixxDebiasedPSF AS g_ixxDebiasedPSF_raw, + dp1.Object.g_ixxPSF AS g_ixxPSF_raw, + dp1.Object.g_ixxRound AS g_ixxRound_raw, + dp1.Object.g_ixy AS g_ixy_raw, + dp1.Object.g_ixyDebiasedPSF AS g_ixyDebiasedPSF_raw, + dp1.Object.g_ixyPSF AS g_ixyPSF_raw, + dp1.Object.g_ixyRound AS g_ixyRound_raw, + dp1.Object.g_iyy AS g_iyy_raw, + dp1.Object.g_iyyDebiasedPSF AS g_iyyDebiasedPSF_raw, + dp1.Object.g_iyyPSF AS g_iyyPSF_raw, + dp1.Object.g_iyyRound AS g_iyyRound_raw, + dp1.Object.g_kronFlux AS g_kronFlux_raw, + dp1.Object.g_kronFlux_flag AS g_kronFlux_flag_raw, + dp1.Object.g_kronFlux_flag_bad_radius AS g_kronFlux_flag_bad_radius_raw, + dp1.Object.g_kronFlux_flag_bad_shape AS g_kronFlux_flag_bad_shape_raw, + dp1.Object.g_kronFlux_flag_bad_shape_no_psf AS g_kronFlux_flag_bad_shape_no_psf_raw, + dp1.Object.g_kronFlux_flag_edge AS g_kronFlux_flag_edge_raw, + dp1.Object.g_kronFlux_flag_no_fallback_radius AS g_kronFlux_flag_no_fallback_radius_raw, + dp1.Object.g_kronFlux_flag_no_minimum_radius AS g_kronFlux_flag_no_minimum_radius_raw, + dp1.Object.g_kronFlux_flag_small_radius AS g_kronFlux_flag_small_radius_raw, + dp1.Object.g_kronFlux_flag_used_minimum_radius AS g_kronFlux_flag_used_minimum_radius_raw, + dp1.Object.g_kronFlux_flag_used_psf_radius AS g_kronFlux_flag_used_psf_radius_raw, + dp1.Object.g_kronFluxErr AS g_kronFluxErr_raw, + dp1.Object.g_kronRad AS g_kronRad_raw, + dp1.Object.g_pixelFlags_bad AS g_pixelFlags_bad_raw, + dp1.Object.g_pixelFlags_clipped AS g_pixelFlags_clipped_raw, + dp1.Object.g_pixelFlags_clippedCenter AS g_pixelFlags_clippedCenter_raw, + dp1.Object.g_pixelFlags_cr AS g_pixelFlags_cr_raw, + dp1.Object.g_pixelFlags_crCenter AS g_pixelFlags_crCenter_raw, + dp1.Object.g_pixelFlags_edge AS g_pixelFlags_edge_raw, + dp1.Object.g_pixelFlags_inexact_psf AS g_pixelFlags_inexact_psf_raw, + dp1.Object.g_pixelFlags_inexact_psfCenter AS g_pixelFlags_inexact_psfCenter_raw, + dp1.Object.g_pixelFlags_interpolated AS g_pixelFlags_interpolated_raw, + dp1.Object.g_pixelFlags_interpolatedCenter AS g_pixelFlags_interpolatedCenter_raw, + dp1.Object.g_pixelFlags_nodata AS g_pixelFlags_nodata_raw, + dp1.Object.g_pixelFlags_offimage AS g_pixelFlags_offimage_raw, + dp1.Object.g_pixelFlags_saturated AS g_pixelFlags_saturated_raw, + dp1.Object.g_pixelFlags_saturatedCenter AS g_pixelFlags_saturatedCenter_raw, + dp1.Object.g_pixelFlags_sensor_edge AS g_pixelFlags_sensor_edge_raw, + dp1.Object.g_pixelFlags_sensor_edgeCenter AS g_pixelFlags_sensor_edgeCenter_raw, + dp1.Object.g_pixelFlags_suspect AS g_pixelFlags_suspect_raw, + dp1.Object.g_pixelFlags_suspectCenter AS g_pixelFlags_suspectCenter_raw, + dp1.Object.g_psfFlux AS g_psfFlux_raw, + dp1.Object.g_psfFlux_area AS g_psfFlux_area_raw, + dp1.Object.g_psfFlux_flag AS g_psfFlux_flag_raw, + dp1.Object.g_psfFlux_flag_apCorr AS g_psfFlux_flag_apCorr_raw, + dp1.Object.g_psfFlux_flag_edge AS g_psfFlux_flag_edge_raw, + dp1.Object.g_psfFlux_flag_noGoodPixels AS g_psfFlux_flag_noGoodPixels_raw, + dp1.Object.g_psfFluxErr AS g_psfFluxErr_raw, + dp1.Object.g_psfMag AS g_psfMag_raw, + dp1.Object.g_psfMagErr AS g_psfMagErr_raw, + dp1.Object.g_psfModel_TwoGaussian_chisq_reduced AS g_psfModel_TwoGaussian_chisq_reduced_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss1_fluxfrac AS g_psfModel_TwoGaussian_gauss1_fluxfrac_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss1_rho AS g_psfModel_TwoGaussian_gauss1_rho_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_x AS g_psfModel_TwoGaussian_gauss1_sigma_x_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_y AS g_psfModel_TwoGaussian_gauss1_sigma_y_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss2_rho AS g_psfModel_TwoGaussian_gauss2_rho_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_x AS g_psfModel_TwoGaussian_gauss2_sigma_x_raw, + dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_y AS g_psfModel_TwoGaussian_gauss2_sigma_y_raw, + dp1.Object.g_psfModel_TwoGaussian_n_iter AS g_psfModel_TwoGaussian_n_iter_raw, + dp1.Object.g_psfModel_TwoGaussian_no_inputs_flag AS g_psfModel_TwoGaussian_no_inputs_flag_raw, + dp1.Object.g_psfModel_TwoGaussian_unknown_flag AS g_psfModel_TwoGaussian_unknown_flag_raw, + dp1.Object.g_ra AS g_ra_raw, + dp1.Object.g_ra_dec_Cov AS g_ra_dec_Cov_raw, + dp1.Object.g_raErr AS g_raErr_raw, + dp1.Object.g_sersicFlux AS g_sersicFlux_raw, + dp1.Object.g_sersicFluxErr AS g_sersicFluxErr_raw, + dp1.Object.g_sizeExtendedness AS g_sizeExtendedness_raw, + dp1.Object.g_sizeExtendedness_flag AS g_sizeExtendedness_flag_raw, + dp1.Object.i_ap03Flux AS i_ap03Flux_raw, + dp1.Object.i_ap03Flux_flag AS i_ap03Flux_flag_raw, + dp1.Object.i_ap03FluxErr AS i_ap03FluxErr_raw, + dp1.Object.i_ap06Flux AS i_ap06Flux_raw, + dp1.Object.i_ap06Flux_flag AS i_ap06Flux_flag_raw, + dp1.Object.i_ap06FluxErr AS i_ap06FluxErr_raw, + dp1.Object.i_ap09Flux AS i_ap09Flux_raw, + dp1.Object.i_ap09Flux_flag AS i_ap09Flux_flag_raw, + dp1.Object.i_ap09FluxErr AS i_ap09FluxErr_raw, + dp1.Object.i_ap12Flux AS i_ap12Flux_raw, + dp1.Object.i_ap12Flux_flag AS i_ap12Flux_flag_raw, + dp1.Object.i_ap12FluxErr AS i_ap12FluxErr_raw, + dp1.Object.i_ap17Flux AS i_ap17Flux_raw, + dp1.Object.i_ap17Flux_flag AS i_ap17Flux_flag_raw, + dp1.Object.i_ap17FluxErr AS i_ap17FluxErr_raw, + dp1.Object.i_ap25Flux AS i_ap25Flux_raw, + dp1.Object.i_ap25Flux_flag AS i_ap25Flux_flag_raw, + dp1.Object.i_ap25FluxErr AS i_ap25FluxErr_raw, + dp1.Object.i_ap35Flux AS i_ap35Flux_raw, + dp1.Object.i_ap35Flux_flag AS i_ap35Flux_flag_raw, + dp1.Object.i_ap35FluxErr AS i_ap35FluxErr_raw, + dp1.Object.i_ap50Flux AS i_ap50Flux_raw, + dp1.Object.i_ap50Flux_flag AS i_ap50Flux_flag_raw, + dp1.Object.i_ap50FluxErr AS i_ap50FluxErr_raw, + dp1.Object.i_ap70Flux AS i_ap70Flux_raw, + dp1.Object.i_ap70Flux_flag AS i_ap70Flux_flag_raw, + dp1.Object.i_ap70FluxErr AS i_ap70FluxErr_raw, + dp1.Object.i_apFlux_flag AS i_apFlux_flag_raw, + dp1.Object.i_apFlux_flag_apertureTruncated AS i_apFlux_flag_apertureTruncated_raw, + dp1.Object.i_apFlux_flag_sincCoeffsTruncated AS i_apFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.i_bdChi2 AS i_bdChi2_raw, + dp1.Object.i_bdE1 AS i_bdE1_raw, + dp1.Object.i_bdE2 AS i_bdE2_raw, + dp1.Object.i_bdFluxB AS i_bdFluxB_raw, + dp1.Object.i_bdFluxBErr AS i_bdFluxBErr_raw, + dp1.Object.i_bdFluxD AS i_bdFluxD_raw, + dp1.Object.i_bdFluxDErr AS i_bdFluxDErr_raw, + dp1.Object.i_bdReB AS i_bdReB_raw, + dp1.Object.i_bdReD AS i_bdReD_raw, + dp1.Object.i_blendedness AS i_blendedness_raw, + dp1.Object.i_blendedness_flag AS i_blendedness_flag_raw, + dp1.Object.i_calib_astrometry_used AS i_calib_astrometry_used_raw, + dp1.Object.i_calib_photometry_reserved AS i_calib_photometry_reserved_raw, + dp1.Object.i_calib_photometry_used AS i_calib_photometry_used_raw, + dp1.Object.i_calib_psf_candidate AS i_calib_psf_candidate_raw, + dp1.Object.i_calib_psf_reserved AS i_calib_psf_reserved_raw, + dp1.Object.i_calib_psf_used AS i_calib_psf_used_raw, + dp1.Object.i_calibFlux AS i_calibFlux_raw, + dp1.Object.i_calibFlux_flag AS i_calibFlux_flag_raw, + dp1.Object.i_calibFlux_flag_apertureTruncated AS i_calibFlux_flag_apertureTruncated_raw, + dp1.Object.i_calibFlux_flag_sincCoeffsTruncated AS i_calibFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.i_calibFluxErr AS i_calibFluxErr_raw, + dp1.Object.i_centroid_flag AS i_centroid_flag_raw, + dp1.Object.i_centroid_x AS i_centroid_x_raw, + dp1.Object.i_centroid_xErr AS i_centroid_xErr_raw, + dp1.Object.i_centroid_y AS i_centroid_y_raw, + dp1.Object.i_centroid_yErr AS i_centroid_yErr_raw, + dp1.Object.i_cModel_flag AS i_cModel_flag_raw, + dp1.Object.i_cModel_flag_apCorr AS i_cModel_flag_apCorr_raw, + dp1.Object.i_cModelFlux AS i_cModelFlux_raw, + dp1.Object.i_cModelFlux_inner AS i_cModelFlux_inner_raw, + dp1.Object.i_cModelFluxErr AS i_cModelFluxErr_raw, + dp1.Object.i_cModelMag AS i_cModelMag_raw, + dp1.Object.i_cModelMagErr AS i_cModelMagErr_raw, + dp1.Object.i_deblend_blendedness AS i_deblend_blendedness_raw, + dp1.Object.i_deblend_dataCoverage AS i_deblend_dataCoverage_raw, + dp1.Object.i_deblend_fluxOverlap AS i_deblend_fluxOverlap_raw, + dp1.Object.i_deblend_fluxOverlapFraction AS i_deblend_fluxOverlapFraction_raw, + dp1.Object.i_deblend_zeroFlux AS i_deblend_zeroFlux_raw, + dp1.Object.i_dec AS i_dec_raw, + dp1.Object.i_decErr AS i_decErr_raw, + dp1.Object.i_epoch AS i_epoch_raw, + dp1.Object.i_extendedness AS i_extendedness_raw, + dp1.Object.i_extendedness_flag AS i_extendedness_flag_raw, + dp1.Object.i_free_cModelFlux AS i_free_cModelFlux_raw, + dp1.Object.i_free_cModelFlux_flag AS i_free_cModelFlux_flag_raw, + dp1.Object.i_free_cModelFlux_inner AS i_free_cModelFlux_inner_raw, + dp1.Object.i_free_cModelFluxErr AS i_free_cModelFluxErr_raw, + dp1.Object.i_free_psfFlux AS i_free_psfFlux_raw, + dp1.Object.i_free_psfFlux_flag AS i_free_psfFlux_flag_raw, + dp1.Object.i_free_psfFluxErr AS i_free_psfFluxErr_raw, + dp1.Object.i_gaap0p7Flux AS i_gaap0p7Flux_raw, + dp1.Object.i_gaap0p7Flux_flag_bigPsf AS i_gaap0p7Flux_flag_bigPsf_raw, + dp1.Object.i_gaap0p7FluxErr AS i_gaap0p7FluxErr_raw, + dp1.Object.i_gaap1p0Flux AS i_gaap1p0Flux_raw, + dp1.Object.i_gaap1p0Flux_flag_bigPsf AS i_gaap1p0Flux_flag_bigPsf_raw, + dp1.Object.i_gaap1p0FluxErr AS i_gaap1p0FluxErr_raw, + dp1.Object.i_gaap1p5Flux AS i_gaap1p5Flux_raw, + dp1.Object.i_gaap1p5Flux_flag_bigPsf AS i_gaap1p5Flux_flag_bigPsf_raw, + dp1.Object.i_gaap1p5FluxErr AS i_gaap1p5FluxErr_raw, + dp1.Object.i_gaap2p5Flux AS i_gaap2p5Flux_raw, + dp1.Object.i_gaap2p5Flux_flag_bigPsf AS i_gaap2p5Flux_flag_bigPsf_raw, + dp1.Object.i_gaap2p5FluxErr AS i_gaap2p5FluxErr_raw, + dp1.Object.i_gaap3p0Flux AS i_gaap3p0Flux_raw, + dp1.Object.i_gaap3p0Flux_flag_bigPsf AS i_gaap3p0Flux_flag_bigPsf_raw, + dp1.Object.i_gaap3p0FluxErr AS i_gaap3p0FluxErr_raw, + dp1.Object.i_gaapFlux_flag AS i_gaapFlux_flag_raw, + dp1.Object.i_gaapFlux_flag_edge AS i_gaapFlux_flag_edge_raw, + dp1.Object.i_gaapFlux_flag_gaussianization AS i_gaapFlux_flag_gaussianization_raw, + dp1.Object.i_gaapOptimalFlux AS i_gaapOptimalFlux_raw, + dp1.Object.i_gaapOptimalFlux_flag_bigPsf AS i_gaapOptimalFlux_flag_bigPsf_raw, + dp1.Object.i_gaapOptimalFluxErr AS i_gaapOptimalFluxErr_raw, + dp1.Object.i_gaapPsfFlux AS i_gaapPsfFlux_raw, + dp1.Object.i_gaapPsfFluxErr AS i_gaapPsfFluxErr_raw, + dp1.Object.i_hsm_moments_03 AS i_hsm_moments_03_raw, + dp1.Object.i_hsm_moments_04 AS i_hsm_moments_04_raw, + dp1.Object.i_hsm_moments_12 AS i_hsm_moments_12_raw, + dp1.Object.i_hsm_moments_13 AS i_hsm_moments_13_raw, + dp1.Object.i_hsm_moments_21 AS i_hsm_moments_21_raw, + dp1.Object.i_hsm_moments_22 AS i_hsm_moments_22_raw, + dp1.Object.i_hsm_moments_30 AS i_hsm_moments_30_raw, + dp1.Object.i_hsm_moments_31 AS i_hsm_moments_31_raw, + dp1.Object.i_hsm_moments_40 AS i_hsm_moments_40_raw, + dp1.Object.i_hsm_moments_flag AS i_hsm_moments_flag_raw, + dp1.Object.i_hsm_momentsPsf_03 AS i_hsm_momentsPsf_03_raw, + dp1.Object.i_hsm_momentsPsf_04 AS i_hsm_momentsPsf_04_raw, + dp1.Object.i_hsm_momentsPsf_12 AS i_hsm_momentsPsf_12_raw, + dp1.Object.i_hsm_momentsPsf_13 AS i_hsm_momentsPsf_13_raw, + dp1.Object.i_hsm_momentsPsf_21 AS i_hsm_momentsPsf_21_raw, + dp1.Object.i_hsm_momentsPsf_22 AS i_hsm_momentsPsf_22_raw, + dp1.Object.i_hsm_momentsPsf_30 AS i_hsm_momentsPsf_30_raw, + dp1.Object.i_hsm_momentsPsf_31 AS i_hsm_momentsPsf_31_raw, + dp1.Object.i_hsm_momentsPsf_40 AS i_hsm_momentsPsf_40_raw, + dp1.Object.i_hsm_momentsPsf_flag AS i_hsm_momentsPsf_flag_raw, + dp1.Object.i_hsmShapeRegauss_e1 AS i_hsmShapeRegauss_e1_raw, + dp1.Object.i_hsmShapeRegauss_e2 AS i_hsmShapeRegauss_e2_raw, + dp1.Object.i_hsmShapeRegauss_flag AS i_hsmShapeRegauss_flag_raw, + dp1.Object.i_hsmShapeRegauss_sigma AS i_hsmShapeRegauss_sigma_raw, + dp1.Object.i_i_flag AS i_i_flag_raw, + dp1.Object.i_iDebiasedPSF_flag AS i_iDebiasedPSF_flag_raw, + dp1.Object.i_inputCount AS i_inputCount_raw, + dp1.Object.i_inputCount_flag AS i_inputCount_flag_raw, + dp1.Object.i_inputCount_flag_noInputs AS i_inputCount_flag_noInputs_raw, + dp1.Object.i_invalidPsfFlag AS i_invalidPsfFlag_raw, + dp1.Object.i_iPSF_flag AS i_iPSF_flag_raw, + dp1.Object.i_iRound_flag AS i_iRound_flag_raw, + dp1.Object.i_ixx AS i_ixx_raw, + dp1.Object.i_ixxDebiasedPSF AS i_ixxDebiasedPSF_raw, + dp1.Object.i_ixxPSF AS i_ixxPSF_raw, + dp1.Object.i_ixxRound AS i_ixxRound_raw, + dp1.Object.i_ixy AS i_ixy_raw, + dp1.Object.i_ixyDebiasedPSF AS i_ixyDebiasedPSF_raw, + dp1.Object.i_ixyPSF AS i_ixyPSF_raw, + dp1.Object.i_ixyRound AS i_ixyRound_raw, + dp1.Object.i_iyy AS i_iyy_raw, + dp1.Object.i_iyyDebiasedPSF AS i_iyyDebiasedPSF_raw, + dp1.Object.i_iyyPSF AS i_iyyPSF_raw, + dp1.Object.i_iyyRound AS i_iyyRound_raw, + dp1.Object.i_kronFlux AS i_kronFlux_raw, + dp1.Object.i_kronFlux_flag AS i_kronFlux_flag_raw, + dp1.Object.i_kronFlux_flag_bad_radius AS i_kronFlux_flag_bad_radius_raw, + dp1.Object.i_kronFlux_flag_bad_shape AS i_kronFlux_flag_bad_shape_raw, + dp1.Object.i_kronFlux_flag_bad_shape_no_psf AS i_kronFlux_flag_bad_shape_no_psf_raw, + dp1.Object.i_kronFlux_flag_edge AS i_kronFlux_flag_edge_raw, + dp1.Object.i_kronFlux_flag_no_fallback_radius AS i_kronFlux_flag_no_fallback_radius_raw, + dp1.Object.i_kronFlux_flag_no_minimum_radius AS i_kronFlux_flag_no_minimum_radius_raw, + dp1.Object.i_kronFlux_flag_small_radius AS i_kronFlux_flag_small_radius_raw, + dp1.Object.i_kronFlux_flag_used_minimum_radius AS i_kronFlux_flag_used_minimum_radius_raw, + dp1.Object.i_kronFlux_flag_used_psf_radius AS i_kronFlux_flag_used_psf_radius_raw, + dp1.Object.i_kronFluxErr AS i_kronFluxErr_raw, + dp1.Object.i_kronRad AS i_kronRad_raw, + dp1.Object.i_pixelFlags_bad AS i_pixelFlags_bad_raw, + dp1.Object.i_pixelFlags_clipped AS i_pixelFlags_clipped_raw, + dp1.Object.i_pixelFlags_clippedCenter AS i_pixelFlags_clippedCenter_raw, + dp1.Object.i_pixelFlags_cr AS i_pixelFlags_cr_raw, + dp1.Object.i_pixelFlags_crCenter AS i_pixelFlags_crCenter_raw, + dp1.Object.i_pixelFlags_edge AS i_pixelFlags_edge_raw, + dp1.Object.i_pixelFlags_inexact_psf AS i_pixelFlags_inexact_psf_raw, + dp1.Object.i_pixelFlags_inexact_psfCenter AS i_pixelFlags_inexact_psfCenter_raw, + dp1.Object.i_pixelFlags_interpolated AS i_pixelFlags_interpolated_raw, + dp1.Object.i_pixelFlags_interpolatedCenter AS i_pixelFlags_interpolatedCenter_raw, + dp1.Object.i_pixelFlags_nodata AS i_pixelFlags_nodata_raw, + dp1.Object.i_pixelFlags_offimage AS i_pixelFlags_offimage_raw, + dp1.Object.i_pixelFlags_saturated AS i_pixelFlags_saturated_raw, + dp1.Object.i_pixelFlags_saturatedCenter AS i_pixelFlags_saturatedCenter_raw, + dp1.Object.i_pixelFlags_sensor_edge AS i_pixelFlags_sensor_edge_raw, + dp1.Object.i_pixelFlags_sensor_edgeCenter AS i_pixelFlags_sensor_edgeCenter_raw, + dp1.Object.i_pixelFlags_suspect AS i_pixelFlags_suspect_raw, + dp1.Object.i_pixelFlags_suspectCenter AS i_pixelFlags_suspectCenter_raw, + dp1.Object.i_psfFlux AS i_psfFlux_raw, + dp1.Object.i_psfFlux_area AS i_psfFlux_area_raw, + dp1.Object.i_psfFlux_flag AS i_psfFlux_flag_raw, + dp1.Object.i_psfFlux_flag_apCorr AS i_psfFlux_flag_apCorr_raw, + dp1.Object.i_psfFlux_flag_edge AS i_psfFlux_flag_edge_raw, + dp1.Object.i_psfFlux_flag_noGoodPixels AS i_psfFlux_flag_noGoodPixels_raw, + dp1.Object.i_psfFluxErr AS i_psfFluxErr_raw, + dp1.Object.i_psfMag AS i_psfMag_raw, + dp1.Object.i_psfMagErr AS i_psfMagErr_raw, + dp1.Object.i_psfModel_TwoGaussian_chisq_reduced AS i_psfModel_TwoGaussian_chisq_reduced_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss1_fluxfrac AS i_psfModel_TwoGaussian_gauss1_fluxfrac_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss1_rho AS i_psfModel_TwoGaussian_gauss1_rho_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss1_sigma_x AS i_psfModel_TwoGaussian_gauss1_sigma_x_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss1_sigma_y AS i_psfModel_TwoGaussian_gauss1_sigma_y_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss2_rho AS i_psfModel_TwoGaussian_gauss2_rho_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss2_sigma_x AS i_psfModel_TwoGaussian_gauss2_sigma_x_raw, + dp1.Object.i_psfModel_TwoGaussian_gauss2_sigma_y AS i_psfModel_TwoGaussian_gauss2_sigma_y_raw, + dp1.Object.i_psfModel_TwoGaussian_n_iter AS i_psfModel_TwoGaussian_n_iter_raw, + dp1.Object.i_psfModel_TwoGaussian_no_inputs_flag AS i_psfModel_TwoGaussian_no_inputs_flag_raw, + dp1.Object.i_psfModel_TwoGaussian_unknown_flag AS i_psfModel_TwoGaussian_unknown_flag_raw, + dp1.Object.i_ra AS i_ra_raw, + dp1.Object.i_ra_dec_Cov AS i_ra_dec_Cov_raw, + dp1.Object.i_raErr AS i_raErr_raw, + dp1.Object.i_sersicFlux AS i_sersicFlux_raw, + dp1.Object.i_sersicFluxErr AS i_sersicFluxErr_raw, + dp1.Object.i_sizeExtendedness AS i_sizeExtendedness_raw, + dp1.Object.i_sizeExtendedness_flag AS i_sizeExtendedness_flag_raw, + dp1.Object.objectId AS objectId_raw, + dp1.Object.parentObjectId AS parentObjectId_raw, + dp1.Object.patch AS patch_raw, + dp1.Object.r_ap03Flux AS r_ap03Flux_raw, + dp1.Object.r_ap03Flux_flag AS r_ap03Flux_flag_raw, + dp1.Object.r_ap03FluxErr AS r_ap03FluxErr_raw, + dp1.Object.r_ap06Flux AS r_ap06Flux_raw, + dp1.Object.r_ap06Flux_flag AS r_ap06Flux_flag_raw, + dp1.Object.r_ap06FluxErr AS r_ap06FluxErr_raw, + dp1.Object.r_ap09Flux AS r_ap09Flux_raw, + dp1.Object.r_ap09Flux_flag AS r_ap09Flux_flag_raw, + dp1.Object.r_ap09FluxErr AS r_ap09FluxErr_raw, + dp1.Object.r_ap12Flux AS r_ap12Flux_raw, + dp1.Object.r_ap12Flux_flag AS r_ap12Flux_flag_raw, + dp1.Object.r_ap12FluxErr AS r_ap12FluxErr_raw, + dp1.Object.r_ap17Flux AS r_ap17Flux_raw, + dp1.Object.r_ap17Flux_flag AS r_ap17Flux_flag_raw, + dp1.Object.r_ap17FluxErr AS r_ap17FluxErr_raw, + dp1.Object.r_ap25Flux AS r_ap25Flux_raw, + dp1.Object.r_ap25Flux_flag AS r_ap25Flux_flag_raw, + dp1.Object.r_ap25FluxErr AS r_ap25FluxErr_raw, + dp1.Object.r_ap35Flux AS r_ap35Flux_raw, + dp1.Object.r_ap35Flux_flag AS r_ap35Flux_flag_raw, + dp1.Object.r_ap35FluxErr AS r_ap35FluxErr_raw, + dp1.Object.r_ap50Flux AS r_ap50Flux_raw, + dp1.Object.r_ap50Flux_flag AS r_ap50Flux_flag_raw, + dp1.Object.r_ap50FluxErr AS r_ap50FluxErr_raw, + dp1.Object.r_ap70Flux AS r_ap70Flux_raw, + dp1.Object.r_ap70Flux_flag AS r_ap70Flux_flag_raw, + dp1.Object.r_ap70FluxErr AS r_ap70FluxErr_raw, + dp1.Object.r_apFlux_flag AS r_apFlux_flag_raw, + dp1.Object.r_apFlux_flag_apertureTruncated AS r_apFlux_flag_apertureTruncated_raw, + dp1.Object.r_apFlux_flag_sincCoeffsTruncated AS r_apFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.r_bdChi2 AS r_bdChi2_raw, + dp1.Object.r_bdE1 AS r_bdE1_raw, + dp1.Object.r_bdE2 AS r_bdE2_raw, + dp1.Object.r_bdFluxB AS r_bdFluxB_raw, + dp1.Object.r_bdFluxBErr AS r_bdFluxBErr_raw, + dp1.Object.r_bdFluxD AS r_bdFluxD_raw, + dp1.Object.r_bdFluxDErr AS r_bdFluxDErr_raw, + dp1.Object.r_bdReB AS r_bdReB_raw, + dp1.Object.r_bdReD AS r_bdReD_raw, + dp1.Object.r_blendedness AS r_blendedness_raw, + dp1.Object.r_blendedness_flag AS r_blendedness_flag_raw, + dp1.Object.r_calib_astrometry_used AS r_calib_astrometry_used_raw, + dp1.Object.r_calib_photometry_reserved AS r_calib_photometry_reserved_raw, + dp1.Object.r_calib_photometry_used AS r_calib_photometry_used_raw, + dp1.Object.r_calib_psf_candidate AS r_calib_psf_candidate_raw, + dp1.Object.r_calib_psf_reserved AS r_calib_psf_reserved_raw, + dp1.Object.r_calib_psf_used AS r_calib_psf_used_raw, + dp1.Object.r_calibFlux AS r_calibFlux_raw, + dp1.Object.r_calibFlux_flag AS r_calibFlux_flag_raw, + dp1.Object.r_calibFlux_flag_apertureTruncated AS r_calibFlux_flag_apertureTruncated_raw, + dp1.Object.r_calibFlux_flag_sincCoeffsTruncated AS r_calibFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.r_calibFluxErr AS r_calibFluxErr_raw, + dp1.Object.r_centroid_flag AS r_centroid_flag_raw, + dp1.Object.r_centroid_x AS r_centroid_x_raw, + dp1.Object.r_centroid_xErr AS r_centroid_xErr_raw, + dp1.Object.r_centroid_y AS r_centroid_y_raw, + dp1.Object.r_centroid_yErr AS r_centroid_yErr_raw, + dp1.Object.r_cModel_flag AS r_cModel_flag_raw, + dp1.Object.r_cModel_flag_apCorr AS r_cModel_flag_apCorr_raw, + dp1.Object.r_cModelFlux AS r_cModelFlux_raw, + dp1.Object.r_cModelFlux_inner AS r_cModelFlux_inner_raw, + dp1.Object.r_cModelFluxErr AS r_cModelFluxErr_raw, + dp1.Object.r_cModelMag AS r_cModelMag_raw, + dp1.Object.r_cModelMagErr AS r_cModelMagErr_raw, + dp1.Object.r_deblend_blendedness AS r_deblend_blendedness_raw, + dp1.Object.r_deblend_dataCoverage AS r_deblend_dataCoverage_raw, + dp1.Object.r_deblend_fluxOverlap AS r_deblend_fluxOverlap_raw, + dp1.Object.r_deblend_fluxOverlapFraction AS r_deblend_fluxOverlapFraction_raw, + dp1.Object.r_deblend_zeroFlux AS r_deblend_zeroFlux_raw, + dp1.Object.r_dec AS r_dec_raw, + dp1.Object.r_decErr AS r_decErr_raw, + dp1.Object.r_epoch AS r_epoch_raw, + dp1.Object.r_extendedness AS r_extendedness_raw, + dp1.Object.r_extendedness_flag AS r_extendedness_flag_raw, + dp1.Object.r_free_cModelFlux AS r_free_cModelFlux_raw, + dp1.Object.r_free_cModelFlux_flag AS r_free_cModelFlux_flag_raw, + dp1.Object.r_free_cModelFlux_inner AS r_free_cModelFlux_inner_raw, + dp1.Object.r_free_cModelFluxErr AS r_free_cModelFluxErr_raw, + dp1.Object.r_free_psfFlux AS r_free_psfFlux_raw, + dp1.Object.r_free_psfFlux_flag AS r_free_psfFlux_flag_raw, + dp1.Object.r_free_psfFluxErr AS r_free_psfFluxErr_raw, + dp1.Object.r_gaap0p7Flux AS r_gaap0p7Flux_raw, + dp1.Object.r_gaap0p7Flux_flag_bigPsf AS r_gaap0p7Flux_flag_bigPsf_raw, + dp1.Object.r_gaap0p7FluxErr AS r_gaap0p7FluxErr_raw, + dp1.Object.r_gaap1p0Flux AS r_gaap1p0Flux_raw, + dp1.Object.r_gaap1p0Flux_flag_bigPsf AS r_gaap1p0Flux_flag_bigPsf_raw, + dp1.Object.r_gaap1p0FluxErr AS r_gaap1p0FluxErr_raw, + dp1.Object.r_gaap1p5Flux AS r_gaap1p5Flux_raw, + dp1.Object.r_gaap1p5Flux_flag_bigPsf AS r_gaap1p5Flux_flag_bigPsf_raw, + dp1.Object.r_gaap1p5FluxErr AS r_gaap1p5FluxErr_raw, + dp1.Object.r_gaap2p5Flux AS r_gaap2p5Flux_raw, + dp1.Object.r_gaap2p5Flux_flag_bigPsf AS r_gaap2p5Flux_flag_bigPsf_raw, + dp1.Object.r_gaap2p5FluxErr AS r_gaap2p5FluxErr_raw, + dp1.Object.r_gaap3p0Flux AS r_gaap3p0Flux_raw, + dp1.Object.r_gaap3p0Flux_flag_bigPsf AS r_gaap3p0Flux_flag_bigPsf_raw, + dp1.Object.r_gaap3p0FluxErr AS r_gaap3p0FluxErr_raw, + dp1.Object.r_gaapFlux_flag AS r_gaapFlux_flag_raw, + dp1.Object.r_gaapFlux_flag_edge AS r_gaapFlux_flag_edge_raw, + dp1.Object.r_gaapFlux_flag_gaussianization AS r_gaapFlux_flag_gaussianization_raw, + dp1.Object.r_gaapOptimalFlux AS r_gaapOptimalFlux_raw, + dp1.Object.r_gaapOptimalFlux_flag_bigPsf AS r_gaapOptimalFlux_flag_bigPsf_raw, + dp1.Object.r_gaapOptimalFluxErr AS r_gaapOptimalFluxErr_raw, + dp1.Object.r_gaapPsfFlux AS r_gaapPsfFlux_raw, + dp1.Object.r_gaapPsfFluxErr AS r_gaapPsfFluxErr_raw, + dp1.Object.r_hsm_moments_03 AS r_hsm_moments_03_raw, + dp1.Object.r_hsm_moments_04 AS r_hsm_moments_04_raw, + dp1.Object.r_hsm_moments_12 AS r_hsm_moments_12_raw, + dp1.Object.r_hsm_moments_13 AS r_hsm_moments_13_raw, + dp1.Object.r_hsm_moments_21 AS r_hsm_moments_21_raw, + dp1.Object.r_hsm_moments_22 AS r_hsm_moments_22_raw, + dp1.Object.r_hsm_moments_30 AS r_hsm_moments_30_raw, + dp1.Object.r_hsm_moments_31 AS r_hsm_moments_31_raw, + dp1.Object.r_hsm_moments_40 AS r_hsm_moments_40_raw, + dp1.Object.r_hsm_moments_flag AS r_hsm_moments_flag_raw, + dp1.Object.r_hsm_momentsPsf_03 AS r_hsm_momentsPsf_03_raw, + dp1.Object.r_hsm_momentsPsf_04 AS r_hsm_momentsPsf_04_raw, + dp1.Object.r_hsm_momentsPsf_12 AS r_hsm_momentsPsf_12_raw, + dp1.Object.r_hsm_momentsPsf_13 AS r_hsm_momentsPsf_13_raw, + dp1.Object.r_hsm_momentsPsf_21 AS r_hsm_momentsPsf_21_raw, + dp1.Object.r_hsm_momentsPsf_22 AS r_hsm_momentsPsf_22_raw, + dp1.Object.r_hsm_momentsPsf_30 AS r_hsm_momentsPsf_30_raw, + dp1.Object.r_hsm_momentsPsf_31 AS r_hsm_momentsPsf_31_raw, + dp1.Object.r_hsm_momentsPsf_40 AS r_hsm_momentsPsf_40_raw, + dp1.Object.r_hsm_momentsPsf_flag AS r_hsm_momentsPsf_flag_raw, + dp1.Object.r_hsmShapeRegauss_e1 AS r_hsmShapeRegauss_e1_raw, + dp1.Object.r_hsmShapeRegauss_e2 AS r_hsmShapeRegauss_e2_raw, + dp1.Object.r_hsmShapeRegauss_flag AS r_hsmShapeRegauss_flag_raw, + dp1.Object.r_hsmShapeRegauss_sigma AS r_hsmShapeRegauss_sigma_raw, + dp1.Object.r_i_flag AS r_i_flag_raw, + dp1.Object.r_iDebiasedPSF_flag AS r_iDebiasedPSF_flag_raw, + dp1.Object.r_inputCount AS r_inputCount_raw, + dp1.Object.r_inputCount_flag AS r_inputCount_flag_raw, + dp1.Object.r_inputCount_flag_noInputs AS r_inputCount_flag_noInputs_raw, + dp1.Object.r_invalidPsfFlag AS r_invalidPsfFlag_raw, + dp1.Object.r_iPSF_flag AS r_iPSF_flag_raw, + dp1.Object.r_iRound_flag AS r_iRound_flag_raw, + dp1.Object.r_ixx AS r_ixx_raw, + dp1.Object.r_ixxDebiasedPSF AS r_ixxDebiasedPSF_raw, + dp1.Object.r_ixxPSF AS r_ixxPSF_raw, + dp1.Object.r_ixxRound AS r_ixxRound_raw, + dp1.Object.r_ixy AS r_ixy_raw, + dp1.Object.r_ixyDebiasedPSF AS r_ixyDebiasedPSF_raw, + dp1.Object.r_ixyPSF AS r_ixyPSF_raw, + dp1.Object.r_ixyRound AS r_ixyRound_raw, + dp1.Object.r_iyy AS r_iyy_raw, + dp1.Object.r_iyyDebiasedPSF AS r_iyyDebiasedPSF_raw, + dp1.Object.r_iyyPSF AS r_iyyPSF_raw, + dp1.Object.r_iyyRound AS r_iyyRound_raw, + dp1.Object.r_kronFlux AS r_kronFlux_raw, + dp1.Object.r_kronFlux_flag AS r_kronFlux_flag_raw, + dp1.Object.r_kronFlux_flag_bad_radius AS r_kronFlux_flag_bad_radius_raw, + dp1.Object.r_kronFlux_flag_bad_shape AS r_kronFlux_flag_bad_shape_raw, + dp1.Object.r_kronFlux_flag_bad_shape_no_psf AS r_kronFlux_flag_bad_shape_no_psf_raw, + dp1.Object.r_kronFlux_flag_edge AS r_kronFlux_flag_edge_raw, + dp1.Object.r_kronFlux_flag_no_fallback_radius AS r_kronFlux_flag_no_fallback_radius_raw, + dp1.Object.r_kronFlux_flag_no_minimum_radius AS r_kronFlux_flag_no_minimum_radius_raw, + dp1.Object.r_kronFlux_flag_small_radius AS r_kronFlux_flag_small_radius_raw, + dp1.Object.r_kronFlux_flag_used_minimum_radius AS r_kronFlux_flag_used_minimum_radius_raw, + dp1.Object.r_kronFlux_flag_used_psf_radius AS r_kronFlux_flag_used_psf_radius_raw, + dp1.Object.r_kronFluxErr AS r_kronFluxErr_raw, + dp1.Object.r_kronRad AS r_kronRad_raw, + dp1.Object.r_pixelFlags_bad AS r_pixelFlags_bad_raw, + dp1.Object.r_pixelFlags_clipped AS r_pixelFlags_clipped_raw, + dp1.Object.r_pixelFlags_clippedCenter AS r_pixelFlags_clippedCenter_raw, + dp1.Object.r_pixelFlags_cr AS r_pixelFlags_cr_raw, + dp1.Object.r_pixelFlags_crCenter AS r_pixelFlags_crCenter_raw, + dp1.Object.r_pixelFlags_edge AS r_pixelFlags_edge_raw, + dp1.Object.r_pixelFlags_inexact_psf AS r_pixelFlags_inexact_psf_raw, + dp1.Object.r_pixelFlags_inexact_psfCenter AS r_pixelFlags_inexact_psfCenter_raw, + dp1.Object.r_pixelFlags_interpolated AS r_pixelFlags_interpolated_raw, + dp1.Object.r_pixelFlags_interpolatedCenter AS r_pixelFlags_interpolatedCenter_raw, + dp1.Object.r_pixelFlags_nodata AS r_pixelFlags_nodata_raw, + dp1.Object.r_pixelFlags_offimage AS r_pixelFlags_offimage_raw, + dp1.Object.r_pixelFlags_saturated AS r_pixelFlags_saturated_raw, + dp1.Object.r_pixelFlags_saturatedCenter AS r_pixelFlags_saturatedCenter_raw, + dp1.Object.r_pixelFlags_sensor_edge AS r_pixelFlags_sensor_edge_raw, + dp1.Object.r_pixelFlags_sensor_edgeCenter AS r_pixelFlags_sensor_edgeCenter_raw, + dp1.Object.r_pixelFlags_suspect AS r_pixelFlags_suspect_raw, + dp1.Object.r_pixelFlags_suspectCenter AS r_pixelFlags_suspectCenter_raw, + dp1.Object.r_psfFlux AS r_psfFlux_raw, + dp1.Object.r_psfFlux_area AS r_psfFlux_area_raw, + dp1.Object.r_psfFlux_flag AS r_psfFlux_flag_raw, + dp1.Object.r_psfFlux_flag_apCorr AS r_psfFlux_flag_apCorr_raw, + dp1.Object.r_psfFlux_flag_edge AS r_psfFlux_flag_edge_raw, + dp1.Object.r_psfFlux_flag_noGoodPixels AS r_psfFlux_flag_noGoodPixels_raw, + dp1.Object.r_psfFluxErr AS r_psfFluxErr_raw, + dp1.Object.r_psfMag AS r_psfMag_raw, + dp1.Object.r_psfMagErr AS r_psfMagErr_raw, + dp1.Object.r_psfModel_TwoGaussian_chisq_reduced AS r_psfModel_TwoGaussian_chisq_reduced_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss1_fluxfrac AS r_psfModel_TwoGaussian_gauss1_fluxfrac_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss1_rho AS r_psfModel_TwoGaussian_gauss1_rho_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss1_sigma_x AS r_psfModel_TwoGaussian_gauss1_sigma_x_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss1_sigma_y AS r_psfModel_TwoGaussian_gauss1_sigma_y_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss2_rho AS r_psfModel_TwoGaussian_gauss2_rho_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss2_sigma_x AS r_psfModel_TwoGaussian_gauss2_sigma_x_raw, + dp1.Object.r_psfModel_TwoGaussian_gauss2_sigma_y AS r_psfModel_TwoGaussian_gauss2_sigma_y_raw, + dp1.Object.r_psfModel_TwoGaussian_n_iter AS r_psfModel_TwoGaussian_n_iter_raw, + dp1.Object.r_psfModel_TwoGaussian_no_inputs_flag AS r_psfModel_TwoGaussian_no_inputs_flag_raw, + dp1.Object.r_psfModel_TwoGaussian_unknown_flag AS r_psfModel_TwoGaussian_unknown_flag_raw, + dp1.Object.r_ra AS r_ra_raw, + dp1.Object.r_ra_dec_Cov AS r_ra_dec_Cov_raw, + dp1.Object.r_raErr AS r_raErr_raw, + dp1.Object.r_sersicFlux AS r_sersicFlux_raw, + dp1.Object.r_sersicFluxErr AS r_sersicFluxErr_raw, + dp1.Object.r_sizeExtendedness AS r_sizeExtendedness_raw, + dp1.Object.r_sizeExtendedness_flag AS r_sizeExtendedness_flag_raw, + dp1.Object.refBand AS refBand_raw, + dp1.Object.refExtendedness AS refExtendedness_raw, + dp1.Object.refSizeExtendedness AS refSizeExtendedness_raw, + dp1.Object.sersic_chisq_reduced AS sersic_chisq_reduced_raw, + dp1.Object.sersic_dec AS sersic_dec_raw, + dp1.Object.sersic_decErr AS sersic_decErr_raw, + dp1.Object.sersic_index AS sersic_index_raw, + dp1.Object.sersic_indexErr AS sersic_indexErr_raw, + dp1.Object.sersic_n_eval_jac AS sersic_n_eval_jac_raw, + dp1.Object.sersic_n_iter AS sersic_n_iter_raw, + dp1.Object.sersic_no_data_flag AS sersic_no_data_flag_raw, + dp1.Object.sersic_ra AS sersic_ra_raw, + dp1.Object.sersic_raErr AS sersic_raErr_raw, + dp1.Object.sersic_reff_x AS sersic_reff_x_raw, + dp1.Object.sersic_reff_xErr AS sersic_reff_xErr_raw, + dp1.Object.sersic_reff_y AS sersic_reff_y_raw, + dp1.Object.sersic_reff_yErr AS sersic_reff_yErr_raw, + dp1.Object.sersic_rho AS sersic_rho_raw, + dp1.Object.sersic_rhoErr AS sersic_rhoErr_raw, + dp1.Object.sersic_unknown_flag AS sersic_unknown_flag_raw, + dp1.Object.sersic_x AS sersic_x_raw, + dp1.Object.sersic_xErr AS sersic_xErr_raw, + dp1.Object.sersic_y AS sersic_y_raw, + dp1.Object.sersic_yErr AS sersic_yErr_raw, + dp1.Object.shape_flag AS shape_flag_raw, + dp1.Object.shape_xx AS shape_xx_raw, + dp1.Object.shape_xy AS shape_xy_raw, + dp1.Object.shape_yy AS shape_yy_raw, + dp1.Object.tract AS tract_raw, + dp1.Object.u_ap03Flux AS u_ap03Flux_raw, + dp1.Object.u_ap03Flux_flag AS u_ap03Flux_flag_raw, + dp1.Object.u_ap03FluxErr AS u_ap03FluxErr_raw, + dp1.Object.u_ap06Flux AS u_ap06Flux_raw, + dp1.Object.u_ap06Flux_flag AS u_ap06Flux_flag_raw, + dp1.Object.u_ap06FluxErr AS u_ap06FluxErr_raw, + dp1.Object.u_ap09Flux AS u_ap09Flux_raw, + dp1.Object.u_ap09Flux_flag AS u_ap09Flux_flag_raw, + dp1.Object.u_ap09FluxErr AS u_ap09FluxErr_raw, + dp1.Object.u_ap12Flux AS u_ap12Flux_raw, + dp1.Object.u_ap12Flux_flag AS u_ap12Flux_flag_raw, + dp1.Object.u_ap12FluxErr AS u_ap12FluxErr_raw, + dp1.Object.u_ap17Flux AS u_ap17Flux_raw, + dp1.Object.u_ap17Flux_flag AS u_ap17Flux_flag_raw, + dp1.Object.u_ap17FluxErr AS u_ap17FluxErr_raw, + dp1.Object.u_ap25Flux AS u_ap25Flux_raw, + dp1.Object.u_ap25Flux_flag AS u_ap25Flux_flag_raw, + dp1.Object.u_ap25FluxErr AS u_ap25FluxErr_raw, + dp1.Object.u_ap35Flux AS u_ap35Flux_raw, + dp1.Object.u_ap35Flux_flag AS u_ap35Flux_flag_raw, + dp1.Object.u_ap35FluxErr AS u_ap35FluxErr_raw, + dp1.Object.u_ap50Flux AS u_ap50Flux_raw, + dp1.Object.u_ap50Flux_flag AS u_ap50Flux_flag_raw, + dp1.Object.u_ap50FluxErr AS u_ap50FluxErr_raw, + dp1.Object.u_ap70Flux AS u_ap70Flux_raw, + dp1.Object.u_ap70Flux_flag AS u_ap70Flux_flag_raw, + dp1.Object.u_ap70FluxErr AS u_ap70FluxErr_raw, + dp1.Object.u_apFlux_flag AS u_apFlux_flag_raw, + dp1.Object.u_apFlux_flag_apertureTruncated AS u_apFlux_flag_apertureTruncated_raw, + dp1.Object.u_apFlux_flag_sincCoeffsTruncated AS u_apFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.u_bdChi2 AS u_bdChi2_raw, + dp1.Object.u_bdE1 AS u_bdE1_raw, + dp1.Object.u_bdE2 AS u_bdE2_raw, + dp1.Object.u_bdFluxB AS u_bdFluxB_raw, + dp1.Object.u_bdFluxBErr AS u_bdFluxBErr_raw, + dp1.Object.u_bdFluxD AS u_bdFluxD_raw, + dp1.Object.u_bdFluxDErr AS u_bdFluxDErr_raw, + dp1.Object.u_bdReB AS u_bdReB_raw, + dp1.Object.u_bdReD AS u_bdReD_raw, + dp1.Object.u_blendedness AS u_blendedness_raw, + dp1.Object.u_blendedness_flag AS u_blendedness_flag_raw, + dp1.Object.u_calib_astrometry_used AS u_calib_astrometry_used_raw, + dp1.Object.u_calib_photometry_reserved AS u_calib_photometry_reserved_raw, + dp1.Object.u_calib_photometry_used AS u_calib_photometry_used_raw, + dp1.Object.u_calib_psf_candidate AS u_calib_psf_candidate_raw, + dp1.Object.u_calib_psf_reserved AS u_calib_psf_reserved_raw, + dp1.Object.u_calib_psf_used AS u_calib_psf_used_raw, + dp1.Object.u_calibFlux AS u_calibFlux_raw, + dp1.Object.u_calibFlux_flag AS u_calibFlux_flag_raw, + dp1.Object.u_calibFlux_flag_apertureTruncated AS u_calibFlux_flag_apertureTruncated_raw, + dp1.Object.u_calibFlux_flag_sincCoeffsTruncated AS u_calibFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.u_calibFluxErr AS u_calibFluxErr_raw, + dp1.Object.u_centroid_flag AS u_centroid_flag_raw, + dp1.Object.u_centroid_x AS u_centroid_x_raw, + dp1.Object.u_centroid_xErr AS u_centroid_xErr_raw, + dp1.Object.u_centroid_y AS u_centroid_y_raw, + dp1.Object.u_centroid_yErr AS u_centroid_yErr_raw, + dp1.Object.u_cModel_flag AS u_cModel_flag_raw, + dp1.Object.u_cModel_flag_apCorr AS u_cModel_flag_apCorr_raw, + dp1.Object.u_cModelFlux AS u_cModelFlux_raw, + dp1.Object.u_cModelFlux_inner AS u_cModelFlux_inner_raw, + dp1.Object.u_cModelFluxErr AS u_cModelFluxErr_raw, + dp1.Object.u_cModelMag AS u_cModelMag_raw, + dp1.Object.u_cModelMagErr AS u_cModelMagErr_raw, + dp1.Object.u_deblend_blendedness AS u_deblend_blendedness_raw, + dp1.Object.u_deblend_dataCoverage AS u_deblend_dataCoverage_raw, + dp1.Object.u_deblend_fluxOverlap AS u_deblend_fluxOverlap_raw, + dp1.Object.u_deblend_fluxOverlapFraction AS u_deblend_fluxOverlapFraction_raw, + dp1.Object.u_deblend_zeroFlux AS u_deblend_zeroFlux_raw, + dp1.Object.u_dec AS u_dec_raw, + dp1.Object.u_decErr AS u_decErr_raw, + dp1.Object.u_epoch AS u_epoch_raw, + dp1.Object.u_extendedness AS u_extendedness_raw, + dp1.Object.u_extendedness_flag AS u_extendedness_flag_raw, + dp1.Object.u_free_cModelFlux AS u_free_cModelFlux_raw, + dp1.Object.u_free_cModelFlux_flag AS u_free_cModelFlux_flag_raw, + dp1.Object.u_free_cModelFlux_inner AS u_free_cModelFlux_inner_raw, + dp1.Object.u_free_cModelFluxErr AS u_free_cModelFluxErr_raw, + dp1.Object.u_free_psfFlux AS u_free_psfFlux_raw, + dp1.Object.u_free_psfFlux_flag AS u_free_psfFlux_flag_raw, + dp1.Object.u_free_psfFluxErr AS u_free_psfFluxErr_raw, + dp1.Object.u_gaap0p7Flux AS u_gaap0p7Flux_raw, + dp1.Object.u_gaap0p7Flux_flag_bigPsf AS u_gaap0p7Flux_flag_bigPsf_raw, + dp1.Object.u_gaap0p7FluxErr AS u_gaap0p7FluxErr_raw, + dp1.Object.u_gaap1p0Flux AS u_gaap1p0Flux_raw, + dp1.Object.u_gaap1p0Flux_flag_bigPsf AS u_gaap1p0Flux_flag_bigPsf_raw, + dp1.Object.u_gaap1p0FluxErr AS u_gaap1p0FluxErr_raw, + dp1.Object.u_gaap1p5Flux AS u_gaap1p5Flux_raw, + dp1.Object.u_gaap1p5Flux_flag_bigPsf AS u_gaap1p5Flux_flag_bigPsf_raw, + dp1.Object.u_gaap1p5FluxErr AS u_gaap1p5FluxErr_raw, + dp1.Object.u_gaap2p5Flux AS u_gaap2p5Flux_raw, + dp1.Object.u_gaap2p5Flux_flag_bigPsf AS u_gaap2p5Flux_flag_bigPsf_raw, + dp1.Object.u_gaap2p5FluxErr AS u_gaap2p5FluxErr_raw, + dp1.Object.u_gaap3p0Flux AS u_gaap3p0Flux_raw, + dp1.Object.u_gaap3p0Flux_flag_bigPsf AS u_gaap3p0Flux_flag_bigPsf_raw, + dp1.Object.u_gaap3p0FluxErr AS u_gaap3p0FluxErr_raw, + dp1.Object.u_gaapFlux_flag AS u_gaapFlux_flag_raw, + dp1.Object.u_gaapFlux_flag_edge AS u_gaapFlux_flag_edge_raw, + dp1.Object.u_gaapFlux_flag_gaussianization AS u_gaapFlux_flag_gaussianization_raw, + dp1.Object.u_gaapOptimalFlux AS u_gaapOptimalFlux_raw, + dp1.Object.u_gaapOptimalFlux_flag_bigPsf AS u_gaapOptimalFlux_flag_bigPsf_raw, + dp1.Object.u_gaapOptimalFluxErr AS u_gaapOptimalFluxErr_raw, + dp1.Object.u_gaapPsfFlux AS u_gaapPsfFlux_raw, + dp1.Object.u_gaapPsfFluxErr AS u_gaapPsfFluxErr_raw, + dp1.Object.u_hsm_moments_03 AS u_hsm_moments_03_raw, + dp1.Object.u_hsm_moments_04 AS u_hsm_moments_04_raw, + dp1.Object.u_hsm_moments_12 AS u_hsm_moments_12_raw, + dp1.Object.u_hsm_moments_13 AS u_hsm_moments_13_raw, + dp1.Object.u_hsm_moments_21 AS u_hsm_moments_21_raw, + dp1.Object.u_hsm_moments_22 AS u_hsm_moments_22_raw, + dp1.Object.u_hsm_moments_30 AS u_hsm_moments_30_raw, + dp1.Object.u_hsm_moments_31 AS u_hsm_moments_31_raw, + dp1.Object.u_hsm_moments_40 AS u_hsm_moments_40_raw, + dp1.Object.u_hsm_moments_flag AS u_hsm_moments_flag_raw, + dp1.Object.u_hsm_momentsPsf_03 AS u_hsm_momentsPsf_03_raw, + dp1.Object.u_hsm_momentsPsf_04 AS u_hsm_momentsPsf_04_raw, + dp1.Object.u_hsm_momentsPsf_12 AS u_hsm_momentsPsf_12_raw, + dp1.Object.u_hsm_momentsPsf_13 AS u_hsm_momentsPsf_13_raw, + dp1.Object.u_hsm_momentsPsf_21 AS u_hsm_momentsPsf_21_raw, + dp1.Object.u_hsm_momentsPsf_22 AS u_hsm_momentsPsf_22_raw, + dp1.Object.u_hsm_momentsPsf_30 AS u_hsm_momentsPsf_30_raw, + dp1.Object.u_hsm_momentsPsf_31 AS u_hsm_momentsPsf_31_raw, + dp1.Object.u_hsm_momentsPsf_40 AS u_hsm_momentsPsf_40_raw, + dp1.Object.u_hsm_momentsPsf_flag AS u_hsm_momentsPsf_flag_raw, + dp1.Object.u_hsmShapeRegauss_e1 AS u_hsmShapeRegauss_e1_raw, + dp1.Object.u_hsmShapeRegauss_e2 AS u_hsmShapeRegauss_e2_raw, + dp1.Object.u_hsmShapeRegauss_flag AS u_hsmShapeRegauss_flag_raw, + dp1.Object.u_hsmShapeRegauss_sigma AS u_hsmShapeRegauss_sigma_raw, + dp1.Object.u_i_flag AS u_i_flag_raw, + dp1.Object.u_iDebiasedPSF_flag AS u_iDebiasedPSF_flag_raw, + dp1.Object.u_inputCount AS u_inputCount_raw, + dp1.Object.u_inputCount_flag AS u_inputCount_flag_raw, + dp1.Object.u_inputCount_flag_noInputs AS u_inputCount_flag_noInputs_raw, + dp1.Object.u_invalidPsfFlag AS u_invalidPsfFlag_raw, + dp1.Object.u_iPSF_flag AS u_iPSF_flag_raw, + dp1.Object.u_iRound_flag AS u_iRound_flag_raw, + dp1.Object.u_ixx AS u_ixx_raw, + dp1.Object.u_ixxDebiasedPSF AS u_ixxDebiasedPSF_raw, + dp1.Object.u_ixxPSF AS u_ixxPSF_raw, + dp1.Object.u_ixxRound AS u_ixxRound_raw, + dp1.Object.u_ixy AS u_ixy_raw, + dp1.Object.u_ixyDebiasedPSF AS u_ixyDebiasedPSF_raw, + dp1.Object.u_ixyPSF AS u_ixyPSF_raw, + dp1.Object.u_ixyRound AS u_ixyRound_raw, + dp1.Object.u_iyy AS u_iyy_raw, + dp1.Object.u_iyyDebiasedPSF AS u_iyyDebiasedPSF_raw, + dp1.Object.u_iyyPSF AS u_iyyPSF_raw, + dp1.Object.u_iyyRound AS u_iyyRound_raw, + dp1.Object.u_kronFlux AS u_kronFlux_raw, + dp1.Object.u_kronFlux_flag AS u_kronFlux_flag_raw, + dp1.Object.u_kronFlux_flag_bad_radius AS u_kronFlux_flag_bad_radius_raw, + dp1.Object.u_kronFlux_flag_bad_shape AS u_kronFlux_flag_bad_shape_raw, + dp1.Object.u_kronFlux_flag_bad_shape_no_psf AS u_kronFlux_flag_bad_shape_no_psf_raw, + dp1.Object.u_kronFlux_flag_edge AS u_kronFlux_flag_edge_raw, + dp1.Object.u_kronFlux_flag_no_fallback_radius AS u_kronFlux_flag_no_fallback_radius_raw, + dp1.Object.u_kronFlux_flag_no_minimum_radius AS u_kronFlux_flag_no_minimum_radius_raw, + dp1.Object.u_kronFlux_flag_small_radius AS u_kronFlux_flag_small_radius_raw, + dp1.Object.u_kronFlux_flag_used_minimum_radius AS u_kronFlux_flag_used_minimum_radius_raw, + dp1.Object.u_kronFlux_flag_used_psf_radius AS u_kronFlux_flag_used_psf_radius_raw, + dp1.Object.u_kronFluxErr AS u_kronFluxErr_raw, + dp1.Object.u_kronRad AS u_kronRad_raw, + dp1.Object.u_pixelFlags_bad AS u_pixelFlags_bad_raw, + dp1.Object.u_pixelFlags_clipped AS u_pixelFlags_clipped_raw, + dp1.Object.u_pixelFlags_clippedCenter AS u_pixelFlags_clippedCenter_raw, + dp1.Object.u_pixelFlags_cr AS u_pixelFlags_cr_raw, + dp1.Object.u_pixelFlags_crCenter AS u_pixelFlags_crCenter_raw, + dp1.Object.u_pixelFlags_edge AS u_pixelFlags_edge_raw, + dp1.Object.u_pixelFlags_inexact_psf AS u_pixelFlags_inexact_psf_raw, + dp1.Object.u_pixelFlags_inexact_psfCenter AS u_pixelFlags_inexact_psfCenter_raw, + dp1.Object.u_pixelFlags_interpolated AS u_pixelFlags_interpolated_raw, + dp1.Object.u_pixelFlags_interpolatedCenter AS u_pixelFlags_interpolatedCenter_raw, + dp1.Object.u_pixelFlags_nodata AS u_pixelFlags_nodata_raw, + dp1.Object.u_pixelFlags_offimage AS u_pixelFlags_offimage_raw, + dp1.Object.u_pixelFlags_saturated AS u_pixelFlags_saturated_raw, + dp1.Object.u_pixelFlags_saturatedCenter AS u_pixelFlags_saturatedCenter_raw, + dp1.Object.u_pixelFlags_sensor_edge AS u_pixelFlags_sensor_edge_raw, + dp1.Object.u_pixelFlags_sensor_edgeCenter AS u_pixelFlags_sensor_edgeCenter_raw, + dp1.Object.u_pixelFlags_suspect AS u_pixelFlags_suspect_raw, + dp1.Object.u_pixelFlags_suspectCenter AS u_pixelFlags_suspectCenter_raw, + dp1.Object.u_psfFlux AS u_psfFlux_raw, + dp1.Object.u_psfFlux_area AS u_psfFlux_area_raw, + dp1.Object.u_psfFlux_flag AS u_psfFlux_flag_raw, + dp1.Object.u_psfFlux_flag_apCorr AS u_psfFlux_flag_apCorr_raw, + dp1.Object.u_psfFlux_flag_edge AS u_psfFlux_flag_edge_raw, + dp1.Object.u_psfFlux_flag_noGoodPixels AS u_psfFlux_flag_noGoodPixels_raw, + dp1.Object.u_psfFluxErr AS u_psfFluxErr_raw, + dp1.Object.u_psfMag AS u_psfMag_raw, + dp1.Object.u_psfMagErr AS u_psfMagErr_raw, + dp1.Object.u_psfModel_TwoGaussian_chisq_reduced AS u_psfModel_TwoGaussian_chisq_reduced_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss1_fluxfrac AS u_psfModel_TwoGaussian_gauss1_fluxfrac_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss1_rho AS u_psfModel_TwoGaussian_gauss1_rho_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss1_sigma_x AS u_psfModel_TwoGaussian_gauss1_sigma_x_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss1_sigma_y AS u_psfModel_TwoGaussian_gauss1_sigma_y_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss2_rho AS u_psfModel_TwoGaussian_gauss2_rho_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss2_sigma_x AS u_psfModel_TwoGaussian_gauss2_sigma_x_raw, + dp1.Object.u_psfModel_TwoGaussian_gauss2_sigma_y AS u_psfModel_TwoGaussian_gauss2_sigma_y_raw, + dp1.Object.u_psfModel_TwoGaussian_n_iter AS u_psfModel_TwoGaussian_n_iter_raw, + dp1.Object.u_psfModel_TwoGaussian_no_inputs_flag AS u_psfModel_TwoGaussian_no_inputs_flag_raw, + dp1.Object.u_psfModel_TwoGaussian_unknown_flag AS u_psfModel_TwoGaussian_unknown_flag_raw, + dp1.Object.u_ra AS u_ra_raw, + dp1.Object.u_ra_dec_Cov AS u_ra_dec_Cov_raw, + dp1.Object.u_raErr AS u_raErr_raw, + dp1.Object.u_sersicFlux AS u_sersicFlux_raw, + dp1.Object.u_sersicFluxErr AS u_sersicFluxErr_raw, + dp1.Object.u_sizeExtendedness AS u_sizeExtendedness_raw, + dp1.Object.u_sizeExtendedness_flag AS u_sizeExtendedness_flag_raw, + dp1.Object.x AS x_raw, + dp1.Object.xErr AS xErr_raw, + dp1.Object.xy_flag AS xy_flag_raw, + dp1.Object.y AS y_raw, + dp1.Object.y_ap03Flux AS y_ap03Flux_raw, + dp1.Object.y_ap03Flux_flag AS y_ap03Flux_flag_raw, + dp1.Object.y_ap03FluxErr AS y_ap03FluxErr_raw, + dp1.Object.y_ap06Flux AS y_ap06Flux_raw, + dp1.Object.y_ap06Flux_flag AS y_ap06Flux_flag_raw, + dp1.Object.y_ap06FluxErr AS y_ap06FluxErr_raw, + dp1.Object.y_ap09Flux AS y_ap09Flux_raw, + dp1.Object.y_ap09Flux_flag AS y_ap09Flux_flag_raw, + dp1.Object.y_ap09FluxErr AS y_ap09FluxErr_raw, + dp1.Object.y_ap12Flux AS y_ap12Flux_raw, + dp1.Object.y_ap12Flux_flag AS y_ap12Flux_flag_raw, + dp1.Object.y_ap12FluxErr AS y_ap12FluxErr_raw, + dp1.Object.y_ap17Flux AS y_ap17Flux_raw, + dp1.Object.y_ap17Flux_flag AS y_ap17Flux_flag_raw, + dp1.Object.y_ap17FluxErr AS y_ap17FluxErr_raw, + dp1.Object.y_ap25Flux AS y_ap25Flux_raw, + dp1.Object.y_ap25Flux_flag AS y_ap25Flux_flag_raw, + dp1.Object.y_ap25FluxErr AS y_ap25FluxErr_raw, + dp1.Object.y_ap35Flux AS y_ap35Flux_raw, + dp1.Object.y_ap35Flux_flag AS y_ap35Flux_flag_raw, + dp1.Object.y_ap35FluxErr AS y_ap35FluxErr_raw, + dp1.Object.y_ap50Flux AS y_ap50Flux_raw, + dp1.Object.y_ap50Flux_flag AS y_ap50Flux_flag_raw, + dp1.Object.y_ap50FluxErr AS y_ap50FluxErr_raw, + dp1.Object.y_ap70Flux AS y_ap70Flux_raw, + dp1.Object.y_ap70Flux_flag AS y_ap70Flux_flag_raw, + dp1.Object.y_ap70FluxErr AS y_ap70FluxErr_raw, + dp1.Object.y_apFlux_flag AS y_apFlux_flag_raw, + dp1.Object.y_apFlux_flag_apertureTruncated AS y_apFlux_flag_apertureTruncated_raw, + dp1.Object.y_apFlux_flag_sincCoeffsTruncated AS y_apFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.y_bdChi2 AS y_bdChi2_raw, + dp1.Object.y_bdE1 AS y_bdE1_raw, + dp1.Object.y_bdE2 AS y_bdE2_raw, + dp1.Object.y_bdFluxB AS y_bdFluxB_raw, + dp1.Object.y_bdFluxBErr AS y_bdFluxBErr_raw, + dp1.Object.y_bdFluxD AS y_bdFluxD_raw, + dp1.Object.y_bdFluxDErr AS y_bdFluxDErr_raw, + dp1.Object.y_bdReB AS y_bdReB_raw, + dp1.Object.y_bdReD AS y_bdReD_raw, + dp1.Object.y_blendedness AS y_blendedness_raw, + dp1.Object.y_blendedness_flag AS y_blendedness_flag_raw, + dp1.Object.y_calib_astrometry_used AS y_calib_astrometry_used_raw, + dp1.Object.y_calib_photometry_reserved AS y_calib_photometry_reserved_raw, + dp1.Object.y_calib_photometry_used AS y_calib_photometry_used_raw, + dp1.Object.y_calib_psf_candidate AS y_calib_psf_candidate_raw, + dp1.Object.y_calib_psf_reserved AS y_calib_psf_reserved_raw, + dp1.Object.y_calib_psf_used AS y_calib_psf_used_raw, + dp1.Object.y_calibFlux AS y_calibFlux_raw, + dp1.Object.y_calibFlux_flag AS y_calibFlux_flag_raw, + dp1.Object.y_calibFlux_flag_apertureTruncated AS y_calibFlux_flag_apertureTruncated_raw, + dp1.Object.y_calibFlux_flag_sincCoeffsTruncated AS y_calibFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.y_calibFluxErr AS y_calibFluxErr_raw, + dp1.Object.y_centroid_flag AS y_centroid_flag_raw, + dp1.Object.y_centroid_x AS y_centroid_x_raw, + dp1.Object.y_centroid_xErr AS y_centroid_xErr_raw, + dp1.Object.y_centroid_y AS y_centroid_y_raw, + dp1.Object.y_centroid_yErr AS y_centroid_yErr_raw, + dp1.Object.y_cModel_flag AS y_cModel_flag_raw, + dp1.Object.y_cModel_flag_apCorr AS y_cModel_flag_apCorr_raw, + dp1.Object.y_cModelFlux AS y_cModelFlux_raw, + dp1.Object.y_cModelFlux_inner AS y_cModelFlux_inner_raw, + dp1.Object.y_cModelFluxErr AS y_cModelFluxErr_raw, + dp1.Object.y_cModelMag AS y_cModelMag_raw, + dp1.Object.y_cModelMagErr AS y_cModelMagErr_raw, + dp1.Object.y_deblend_blendedness AS y_deblend_blendedness_raw, + dp1.Object.y_deblend_dataCoverage AS y_deblend_dataCoverage_raw, + dp1.Object.y_deblend_fluxOverlap AS y_deblend_fluxOverlap_raw, + dp1.Object.y_deblend_fluxOverlapFraction AS y_deblend_fluxOverlapFraction_raw, + dp1.Object.y_deblend_zeroFlux AS y_deblend_zeroFlux_raw, + dp1.Object.y_dec AS y_dec_raw, + dp1.Object.y_decErr AS y_decErr_raw, + dp1.Object.y_epoch AS y_epoch_raw, + dp1.Object.y_extendedness AS y_extendedness_raw, + dp1.Object.y_extendedness_flag AS y_extendedness_flag_raw, + dp1.Object.y_free_cModelFlux AS y_free_cModelFlux_raw, + dp1.Object.y_free_cModelFlux_flag AS y_free_cModelFlux_flag_raw, + dp1.Object.y_free_cModelFlux_inner AS y_free_cModelFlux_inner_raw, + dp1.Object.y_free_cModelFluxErr AS y_free_cModelFluxErr_raw, + dp1.Object.y_free_psfFlux AS y_free_psfFlux_raw, + dp1.Object.y_free_psfFlux_flag AS y_free_psfFlux_flag_raw, + dp1.Object.y_free_psfFluxErr AS y_free_psfFluxErr_raw, + dp1.Object.y_gaap0p7Flux AS y_gaap0p7Flux_raw, + dp1.Object.y_gaap0p7Flux_flag_bigPsf AS y_gaap0p7Flux_flag_bigPsf_raw, + dp1.Object.y_gaap0p7FluxErr AS y_gaap0p7FluxErr_raw, + dp1.Object.y_gaap1p0Flux AS y_gaap1p0Flux_raw, + dp1.Object.y_gaap1p0Flux_flag_bigPsf AS y_gaap1p0Flux_flag_bigPsf_raw, + dp1.Object.y_gaap1p0FluxErr AS y_gaap1p0FluxErr_raw, + dp1.Object.y_gaap1p5Flux AS y_gaap1p5Flux_raw, + dp1.Object.y_gaap1p5Flux_flag_bigPsf AS y_gaap1p5Flux_flag_bigPsf_raw, + dp1.Object.y_gaap1p5FluxErr AS y_gaap1p5FluxErr_raw, + dp1.Object.y_gaap2p5Flux AS y_gaap2p5Flux_raw, + dp1.Object.y_gaap2p5Flux_flag_bigPsf AS y_gaap2p5Flux_flag_bigPsf_raw, + dp1.Object.y_gaap2p5FluxErr AS y_gaap2p5FluxErr_raw, + dp1.Object.y_gaap3p0Flux AS y_gaap3p0Flux_raw, + dp1.Object.y_gaap3p0Flux_flag_bigPsf AS y_gaap3p0Flux_flag_bigPsf_raw, + dp1.Object.y_gaap3p0FluxErr AS y_gaap3p0FluxErr_raw, + dp1.Object.y_gaapFlux_flag AS y_gaapFlux_flag_raw, + dp1.Object.y_gaapFlux_flag_edge AS y_gaapFlux_flag_edge_raw, + dp1.Object.y_gaapFlux_flag_gaussianization AS y_gaapFlux_flag_gaussianization_raw, + dp1.Object.y_gaapOptimalFlux AS y_gaapOptimalFlux_raw, + dp1.Object.y_gaapOptimalFlux_flag_bigPsf AS y_gaapOptimalFlux_flag_bigPsf_raw, + dp1.Object.y_gaapOptimalFluxErr AS y_gaapOptimalFluxErr_raw, + dp1.Object.y_gaapPsfFlux AS y_gaapPsfFlux_raw, + dp1.Object.y_gaapPsfFluxErr AS y_gaapPsfFluxErr_raw, + dp1.Object.y_hsm_moments_03 AS y_hsm_moments_03_raw, + dp1.Object.y_hsm_moments_04 AS y_hsm_moments_04_raw, + dp1.Object.y_hsm_moments_12 AS y_hsm_moments_12_raw, + dp1.Object.y_hsm_moments_13 AS y_hsm_moments_13_raw, + dp1.Object.y_hsm_moments_21 AS y_hsm_moments_21_raw, + dp1.Object.y_hsm_moments_22 AS y_hsm_moments_22_raw, + dp1.Object.y_hsm_moments_30 AS y_hsm_moments_30_raw, + dp1.Object.y_hsm_moments_31 AS y_hsm_moments_31_raw, + dp1.Object.y_hsm_moments_40 AS y_hsm_moments_40_raw, + dp1.Object.y_hsm_moments_flag AS y_hsm_moments_flag_raw, + dp1.Object.y_hsm_momentsPsf_03 AS y_hsm_momentsPsf_03_raw, + dp1.Object.y_hsm_momentsPsf_04 AS y_hsm_momentsPsf_04_raw, + dp1.Object.y_hsm_momentsPsf_12 AS y_hsm_momentsPsf_12_raw, + dp1.Object.y_hsm_momentsPsf_13 AS y_hsm_momentsPsf_13_raw, + dp1.Object.y_hsm_momentsPsf_21 AS y_hsm_momentsPsf_21_raw, + dp1.Object.y_hsm_momentsPsf_22 AS y_hsm_momentsPsf_22_raw, + dp1.Object.y_hsm_momentsPsf_30 AS y_hsm_momentsPsf_30_raw, + dp1.Object.y_hsm_momentsPsf_31 AS y_hsm_momentsPsf_31_raw, + dp1.Object.y_hsm_momentsPsf_40 AS y_hsm_momentsPsf_40_raw, + dp1.Object.y_hsm_momentsPsf_flag AS y_hsm_momentsPsf_flag_raw, + dp1.Object.y_hsmShapeRegauss_e1 AS y_hsmShapeRegauss_e1_raw, + dp1.Object.y_hsmShapeRegauss_e2 AS y_hsmShapeRegauss_e2_raw, + dp1.Object.y_hsmShapeRegauss_flag AS y_hsmShapeRegauss_flag_raw, + dp1.Object.y_hsmShapeRegauss_sigma AS y_hsmShapeRegauss_sigma_raw, + dp1.Object.y_i_flag AS y_i_flag_raw, + dp1.Object.y_iDebiasedPSF_flag AS y_iDebiasedPSF_flag_raw, + dp1.Object.y_inputCount AS y_inputCount_raw, + dp1.Object.y_inputCount_flag AS y_inputCount_flag_raw, + dp1.Object.y_inputCount_flag_noInputs AS y_inputCount_flag_noInputs_raw, + dp1.Object.y_invalidPsfFlag AS y_invalidPsfFlag_raw, + dp1.Object.y_iPSF_flag AS y_iPSF_flag_raw, + dp1.Object.y_iRound_flag AS y_iRound_flag_raw, + dp1.Object.y_ixx AS y_ixx_raw, + dp1.Object.y_ixxDebiasedPSF AS y_ixxDebiasedPSF_raw, + dp1.Object.y_ixxPSF AS y_ixxPSF_raw, + dp1.Object.y_ixxRound AS y_ixxRound_raw, + dp1.Object.y_ixy AS y_ixy_raw, + dp1.Object.y_ixyDebiasedPSF AS y_ixyDebiasedPSF_raw, + dp1.Object.y_ixyPSF AS y_ixyPSF_raw, + dp1.Object.y_ixyRound AS y_ixyRound_raw, + dp1.Object.y_iyy AS y_iyy_raw, + dp1.Object.y_iyyDebiasedPSF AS y_iyyDebiasedPSF_raw, + dp1.Object.y_iyyPSF AS y_iyyPSF_raw, + dp1.Object.y_iyyRound AS y_iyyRound_raw, + dp1.Object.y_kronFlux AS y_kronFlux_raw, + dp1.Object.y_kronFlux_flag AS y_kronFlux_flag_raw, + dp1.Object.y_kronFlux_flag_bad_radius AS y_kronFlux_flag_bad_radius_raw, + dp1.Object.y_kronFlux_flag_bad_shape AS y_kronFlux_flag_bad_shape_raw, + dp1.Object.y_kronFlux_flag_bad_shape_no_psf AS y_kronFlux_flag_bad_shape_no_psf_raw, + dp1.Object.y_kronFlux_flag_edge AS y_kronFlux_flag_edge_raw, + dp1.Object.y_kronFlux_flag_no_fallback_radius AS y_kronFlux_flag_no_fallback_radius_raw, + dp1.Object.y_kronFlux_flag_no_minimum_radius AS y_kronFlux_flag_no_minimum_radius_raw, + dp1.Object.y_kronFlux_flag_small_radius AS y_kronFlux_flag_small_radius_raw, + dp1.Object.y_kronFlux_flag_used_minimum_radius AS y_kronFlux_flag_used_minimum_radius_raw, + dp1.Object.y_kronFlux_flag_used_psf_radius AS y_kronFlux_flag_used_psf_radius_raw, + dp1.Object.y_kronFluxErr AS y_kronFluxErr_raw, + dp1.Object.y_kronRad AS y_kronRad_raw, + dp1.Object.y_pixelFlags_bad AS y_pixelFlags_bad_raw, + dp1.Object.y_pixelFlags_clipped AS y_pixelFlags_clipped_raw, + dp1.Object.y_pixelFlags_clippedCenter AS y_pixelFlags_clippedCenter_raw, + dp1.Object.y_pixelFlags_cr AS y_pixelFlags_cr_raw, + dp1.Object.y_pixelFlags_crCenter AS y_pixelFlags_crCenter_raw, + dp1.Object.y_pixelFlags_edge AS y_pixelFlags_edge_raw, + dp1.Object.y_pixelFlags_inexact_psf AS y_pixelFlags_inexact_psf_raw, + dp1.Object.y_pixelFlags_inexact_psfCenter AS y_pixelFlags_inexact_psfCenter_raw, + dp1.Object.y_pixelFlags_interpolated AS y_pixelFlags_interpolated_raw, + dp1.Object.y_pixelFlags_interpolatedCenter AS y_pixelFlags_interpolatedCenter_raw, + dp1.Object.y_pixelFlags_nodata AS y_pixelFlags_nodata_raw, + dp1.Object.y_pixelFlags_offimage AS y_pixelFlags_offimage_raw, + dp1.Object.y_pixelFlags_saturated AS y_pixelFlags_saturated_raw, + dp1.Object.y_pixelFlags_saturatedCenter AS y_pixelFlags_saturatedCenter_raw, + dp1.Object.y_pixelFlags_sensor_edge AS y_pixelFlags_sensor_edge_raw, + dp1.Object.y_pixelFlags_sensor_edgeCenter AS y_pixelFlags_sensor_edgeCenter_raw, + dp1.Object.y_pixelFlags_suspect AS y_pixelFlags_suspect_raw, + dp1.Object.y_pixelFlags_suspectCenter AS y_pixelFlags_suspectCenter_raw, + dp1.Object.y_psfFlux AS y_psfFlux_raw, + dp1.Object.y_psfFlux_area AS y_psfFlux_area_raw, + dp1.Object.y_psfFlux_flag AS y_psfFlux_flag_raw, + dp1.Object.y_psfFlux_flag_apCorr AS y_psfFlux_flag_apCorr_raw, + dp1.Object.y_psfFlux_flag_edge AS y_psfFlux_flag_edge_raw, + dp1.Object.y_psfFlux_flag_noGoodPixels AS y_psfFlux_flag_noGoodPixels_raw, + dp1.Object.y_psfFluxErr AS y_psfFluxErr_raw, + dp1.Object.y_psfMag AS y_psfMag_raw, + dp1.Object.y_psfMagErr AS y_psfMagErr_raw, + dp1.Object.y_psfModel_TwoGaussian_chisq_reduced AS y_psfModel_TwoGaussian_chisq_reduced_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss1_fluxfrac AS y_psfModel_TwoGaussian_gauss1_fluxfrac_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss1_rho AS y_psfModel_TwoGaussian_gauss1_rho_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss1_sigma_x AS y_psfModel_TwoGaussian_gauss1_sigma_x_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss1_sigma_y AS y_psfModel_TwoGaussian_gauss1_sigma_y_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss2_rho AS y_psfModel_TwoGaussian_gauss2_rho_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss2_sigma_x AS y_psfModel_TwoGaussian_gauss2_sigma_x_raw, + dp1.Object.y_psfModel_TwoGaussian_gauss2_sigma_y AS y_psfModel_TwoGaussian_gauss2_sigma_y_raw, + dp1.Object.y_psfModel_TwoGaussian_n_iter AS y_psfModel_TwoGaussian_n_iter_raw, + dp1.Object.y_psfModel_TwoGaussian_no_inputs_flag AS y_psfModel_TwoGaussian_no_inputs_flag_raw, + dp1.Object.y_psfModel_TwoGaussian_unknown_flag AS y_psfModel_TwoGaussian_unknown_flag_raw, + dp1.Object.y_ra AS y_ra_raw, + dp1.Object.y_ra_dec_Cov AS y_ra_dec_Cov_raw, + dp1.Object.y_raErr AS y_raErr_raw, + dp1.Object.y_sersicFlux AS y_sersicFlux_raw, + dp1.Object.y_sersicFluxErr AS y_sersicFluxErr_raw, + dp1.Object.y_sizeExtendedness AS y_sizeExtendedness_raw, + dp1.Object.y_sizeExtendedness_flag AS y_sizeExtendedness_flag_raw, + dp1.Object.yErr AS yErr_raw, + dp1.Object.z_ap03Flux AS z_ap03Flux_raw, + dp1.Object.z_ap03Flux_flag AS z_ap03Flux_flag_raw, + dp1.Object.z_ap03FluxErr AS z_ap03FluxErr_raw, + dp1.Object.z_ap06Flux AS z_ap06Flux_raw, + dp1.Object.z_ap06Flux_flag AS z_ap06Flux_flag_raw, + dp1.Object.z_ap06FluxErr AS z_ap06FluxErr_raw, + dp1.Object.z_ap09Flux AS z_ap09Flux_raw, + dp1.Object.z_ap09Flux_flag AS z_ap09Flux_flag_raw, + dp1.Object.z_ap09FluxErr AS z_ap09FluxErr_raw, + dp1.Object.z_ap12Flux AS z_ap12Flux_raw, + dp1.Object.z_ap12Flux_flag AS z_ap12Flux_flag_raw, + dp1.Object.z_ap12FluxErr AS z_ap12FluxErr_raw, + dp1.Object.z_ap17Flux AS z_ap17Flux_raw, + dp1.Object.z_ap17Flux_flag AS z_ap17Flux_flag_raw, + dp1.Object.z_ap17FluxErr AS z_ap17FluxErr_raw, + dp1.Object.z_ap25Flux AS z_ap25Flux_raw, + dp1.Object.z_ap25Flux_flag AS z_ap25Flux_flag_raw, + dp1.Object.z_ap25FluxErr AS z_ap25FluxErr_raw, + dp1.Object.z_ap35Flux AS z_ap35Flux_raw, + dp1.Object.z_ap35Flux_flag AS z_ap35Flux_flag_raw, + dp1.Object.z_ap35FluxErr AS z_ap35FluxErr_raw, + dp1.Object.z_ap50Flux AS z_ap50Flux_raw, + dp1.Object.z_ap50Flux_flag AS z_ap50Flux_flag_raw, + dp1.Object.z_ap50FluxErr AS z_ap50FluxErr_raw, + dp1.Object.z_ap70Flux AS z_ap70Flux_raw, + dp1.Object.z_ap70Flux_flag AS z_ap70Flux_flag_raw, + dp1.Object.z_ap70FluxErr AS z_ap70FluxErr_raw, + dp1.Object.z_apFlux_flag AS z_apFlux_flag_raw, + dp1.Object.z_apFlux_flag_apertureTruncated AS z_apFlux_flag_apertureTruncated_raw, + dp1.Object.z_apFlux_flag_sincCoeffsTruncated AS z_apFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.z_bdChi2 AS z_bdChi2_raw, + dp1.Object.z_bdE1 AS z_bdE1_raw, + dp1.Object.z_bdE2 AS z_bdE2_raw, + dp1.Object.z_bdFluxB AS z_bdFluxB_raw, + dp1.Object.z_bdFluxBErr AS z_bdFluxBErr_raw, + dp1.Object.z_bdFluxD AS z_bdFluxD_raw, + dp1.Object.z_bdFluxDErr AS z_bdFluxDErr_raw, + dp1.Object.z_bdReB AS z_bdReB_raw, + dp1.Object.z_bdReD AS z_bdReD_raw, + dp1.Object.z_blendedness AS z_blendedness_raw, + dp1.Object.z_blendedness_flag AS z_blendedness_flag_raw, + dp1.Object.z_calib_astrometry_used AS z_calib_astrometry_used_raw, + dp1.Object.z_calib_photometry_reserved AS z_calib_photometry_reserved_raw, + dp1.Object.z_calib_photometry_used AS z_calib_photometry_used_raw, + dp1.Object.z_calib_psf_candidate AS z_calib_psf_candidate_raw, + dp1.Object.z_calib_psf_reserved AS z_calib_psf_reserved_raw, + dp1.Object.z_calib_psf_used AS z_calib_psf_used_raw, + dp1.Object.z_calibFlux AS z_calibFlux_raw, + dp1.Object.z_calibFlux_flag AS z_calibFlux_flag_raw, + dp1.Object.z_calibFlux_flag_apertureTruncated AS z_calibFlux_flag_apertureTruncated_raw, + dp1.Object.z_calibFlux_flag_sincCoeffsTruncated AS z_calibFlux_flag_sincCoeffsTruncated_raw, + dp1.Object.z_calibFluxErr AS z_calibFluxErr_raw, + dp1.Object.z_centroid_flag AS z_centroid_flag_raw, + dp1.Object.z_centroid_x AS z_centroid_x_raw, + dp1.Object.z_centroid_xErr AS z_centroid_xErr_raw, + dp1.Object.z_centroid_y AS z_centroid_y_raw, + dp1.Object.z_centroid_yErr AS z_centroid_yErr_raw, + dp1.Object.z_cModel_flag AS z_cModel_flag_raw, + dp1.Object.z_cModel_flag_apCorr AS z_cModel_flag_apCorr_raw, + dp1.Object.z_cModelFlux AS z_cModelFlux_raw, + dp1.Object.z_cModelFlux_inner AS z_cModelFlux_inner_raw, + dp1.Object.z_cModelFluxErr AS z_cModelFluxErr_raw, + dp1.Object.z_cModelMag AS z_cModelMag_raw, + dp1.Object.z_cModelMagErr AS z_cModelMagErr_raw, + dp1.Object.z_deblend_blendedness AS z_deblend_blendedness_raw, + dp1.Object.z_deblend_dataCoverage AS z_deblend_dataCoverage_raw, + dp1.Object.z_deblend_fluxOverlap AS z_deblend_fluxOverlap_raw, + dp1.Object.z_deblend_fluxOverlapFraction AS z_deblend_fluxOverlapFraction_raw, + dp1.Object.z_deblend_zeroFlux AS z_deblend_zeroFlux_raw, + dp1.Object.z_dec AS z_dec_raw, + dp1.Object.z_decErr AS z_decErr_raw, + dp1.Object.z_epoch AS z_epoch_raw, + dp1.Object.z_extendedness AS z_extendedness_raw, + dp1.Object.z_extendedness_flag AS z_extendedness_flag_raw, + dp1.Object.z_free_cModelFlux AS z_free_cModelFlux_raw, + dp1.Object.z_free_cModelFlux_flag AS z_free_cModelFlux_flag_raw, + dp1.Object.z_free_cModelFlux_inner AS z_free_cModelFlux_inner_raw, + dp1.Object.z_free_cModelFluxErr AS z_free_cModelFluxErr_raw, + dp1.Object.z_free_psfFlux AS z_free_psfFlux_raw, + dp1.Object.z_free_psfFlux_flag AS z_free_psfFlux_flag_raw, + dp1.Object.z_free_psfFluxErr AS z_free_psfFluxErr_raw, + dp1.Object.z_gaap0p7Flux AS z_gaap0p7Flux_raw, + dp1.Object.z_gaap0p7Flux_flag_bigPsf AS z_gaap0p7Flux_flag_bigPsf_raw, + dp1.Object.z_gaap0p7FluxErr AS z_gaap0p7FluxErr_raw, + dp1.Object.z_gaap1p0Flux AS z_gaap1p0Flux_raw, + dp1.Object.z_gaap1p0Flux_flag_bigPsf AS z_gaap1p0Flux_flag_bigPsf_raw, + dp1.Object.z_gaap1p0FluxErr AS z_gaap1p0FluxErr_raw, + dp1.Object.z_gaap1p5Flux AS z_gaap1p5Flux_raw, + dp1.Object.z_gaap1p5Flux_flag_bigPsf AS z_gaap1p5Flux_flag_bigPsf_raw, + dp1.Object.z_gaap1p5FluxErr AS z_gaap1p5FluxErr_raw, + dp1.Object.z_gaap2p5Flux AS z_gaap2p5Flux_raw, + dp1.Object.z_gaap2p5Flux_flag_bigPsf AS z_gaap2p5Flux_flag_bigPsf_raw, + dp1.Object.z_gaap2p5FluxErr AS z_gaap2p5FluxErr_raw, + dp1.Object.z_gaap3p0Flux AS z_gaap3p0Flux_raw, + dp1.Object.z_gaap3p0Flux_flag_bigPsf AS z_gaap3p0Flux_flag_bigPsf_raw, + dp1.Object.z_gaap3p0FluxErr AS z_gaap3p0FluxErr_raw, + dp1.Object.z_gaapFlux_flag AS z_gaapFlux_flag_raw, + dp1.Object.z_gaapFlux_flag_edge AS z_gaapFlux_flag_edge_raw, + dp1.Object.z_gaapFlux_flag_gaussianization AS z_gaapFlux_flag_gaussianization_raw, + dp1.Object.z_gaapOptimalFlux AS z_gaapOptimalFlux_raw, + dp1.Object.z_gaapOptimalFlux_flag_bigPsf AS z_gaapOptimalFlux_flag_bigPsf_raw, + dp1.Object.z_gaapOptimalFluxErr AS z_gaapOptimalFluxErr_raw, + dp1.Object.z_gaapPsfFlux AS z_gaapPsfFlux_raw, + dp1.Object.z_gaapPsfFluxErr AS z_gaapPsfFluxErr_raw, + dp1.Object.z_hsm_moments_03 AS z_hsm_moments_03_raw, + dp1.Object.z_hsm_moments_04 AS z_hsm_moments_04_raw, + dp1.Object.z_hsm_moments_12 AS z_hsm_moments_12_raw, + dp1.Object.z_hsm_moments_13 AS z_hsm_moments_13_raw, + dp1.Object.z_hsm_moments_21 AS z_hsm_moments_21_raw, + dp1.Object.z_hsm_moments_22 AS z_hsm_moments_22_raw, + dp1.Object.z_hsm_moments_30 AS z_hsm_moments_30_raw, + dp1.Object.z_hsm_moments_31 AS z_hsm_moments_31_raw, + dp1.Object.z_hsm_moments_40 AS z_hsm_moments_40_raw, + dp1.Object.z_hsm_moments_flag AS z_hsm_moments_flag_raw, + dp1.Object.z_hsm_momentsPsf_03 AS z_hsm_momentsPsf_03_raw, + dp1.Object.z_hsm_momentsPsf_04 AS z_hsm_momentsPsf_04_raw, + dp1.Object.z_hsm_momentsPsf_12 AS z_hsm_momentsPsf_12_raw, + dp1.Object.z_hsm_momentsPsf_13 AS z_hsm_momentsPsf_13_raw, + dp1.Object.z_hsm_momentsPsf_21 AS z_hsm_momentsPsf_21_raw, + dp1.Object.z_hsm_momentsPsf_22 AS z_hsm_momentsPsf_22_raw, + dp1.Object.z_hsm_momentsPsf_30 AS z_hsm_momentsPsf_30_raw, + dp1.Object.z_hsm_momentsPsf_31 AS z_hsm_momentsPsf_31_raw, + dp1.Object.z_hsm_momentsPsf_40 AS z_hsm_momentsPsf_40_raw, + dp1.Object.z_hsm_momentsPsf_flag AS z_hsm_momentsPsf_flag_raw, + dp1.Object.z_hsmShapeRegauss_e1 AS z_hsmShapeRegauss_e1_raw, + dp1.Object.z_hsmShapeRegauss_e2 AS z_hsmShapeRegauss_e2_raw, + dp1.Object.z_hsmShapeRegauss_flag AS z_hsmShapeRegauss_flag_raw, + dp1.Object.z_hsmShapeRegauss_sigma AS z_hsmShapeRegauss_sigma_raw, + dp1.Object.z_i_flag AS z_i_flag_raw, + dp1.Object.z_iDebiasedPSF_flag AS z_iDebiasedPSF_flag_raw, + dp1.Object.z_inputCount AS z_inputCount_raw, + dp1.Object.z_inputCount_flag AS z_inputCount_flag_raw, + dp1.Object.z_inputCount_flag_noInputs AS z_inputCount_flag_noInputs_raw, + dp1.Object.z_invalidPsfFlag AS z_invalidPsfFlag_raw, + dp1.Object.z_iPSF_flag AS z_iPSF_flag_raw, + dp1.Object.z_iRound_flag AS z_iRound_flag_raw, + dp1.Object.z_ixx AS z_ixx_raw, + dp1.Object.z_ixxDebiasedPSF AS z_ixxDebiasedPSF_raw, + dp1.Object.z_ixxPSF AS z_ixxPSF_raw, + dp1.Object.z_ixxRound AS z_ixxRound_raw, + dp1.Object.z_ixy AS z_ixy_raw, + dp1.Object.z_ixyDebiasedPSF AS z_ixyDebiasedPSF_raw, + dp1.Object.z_ixyPSF AS z_ixyPSF_raw, + dp1.Object.z_ixyRound AS z_ixyRound_raw, + dp1.Object.z_iyy AS z_iyy_raw, + dp1.Object.z_iyyDebiasedPSF AS z_iyyDebiasedPSF_raw, + dp1.Object.z_iyyPSF AS z_iyyPSF_raw, + dp1.Object.z_iyyRound AS z_iyyRound_raw, + dp1.Object.z_kronFlux AS z_kronFlux_raw, + dp1.Object.z_kronFlux_flag AS z_kronFlux_flag_raw, + dp1.Object.z_kronFlux_flag_bad_radius AS z_kronFlux_flag_bad_radius_raw, + dp1.Object.z_kronFlux_flag_bad_shape AS z_kronFlux_flag_bad_shape_raw, + dp1.Object.z_kronFlux_flag_bad_shape_no_psf AS z_kronFlux_flag_bad_shape_no_psf_raw, + dp1.Object.z_kronFlux_flag_edge AS z_kronFlux_flag_edge_raw, + dp1.Object.z_kronFlux_flag_no_fallback_radius AS z_kronFlux_flag_no_fallback_radius_raw, + dp1.Object.z_kronFlux_flag_no_minimum_radius AS z_kronFlux_flag_no_minimum_radius_raw, + dp1.Object.z_kronFlux_flag_small_radius AS z_kronFlux_flag_small_radius_raw, + dp1.Object.z_kronFlux_flag_used_minimum_radius AS z_kronFlux_flag_used_minimum_radius_raw, + dp1.Object.z_kronFlux_flag_used_psf_radius AS z_kronFlux_flag_used_psf_radius_raw, + dp1.Object.z_kronFluxErr AS z_kronFluxErr_raw, + dp1.Object.z_kronRad AS z_kronRad_raw, + dp1.Object.z_pixelFlags_bad AS z_pixelFlags_bad_raw, + dp1.Object.z_pixelFlags_clipped AS z_pixelFlags_clipped_raw, + dp1.Object.z_pixelFlags_clippedCenter AS z_pixelFlags_clippedCenter_raw, + dp1.Object.z_pixelFlags_cr AS z_pixelFlags_cr_raw, + dp1.Object.z_pixelFlags_crCenter AS z_pixelFlags_crCenter_raw, + dp1.Object.z_pixelFlags_edge AS z_pixelFlags_edge_raw, + dp1.Object.z_pixelFlags_inexact_psf AS z_pixelFlags_inexact_psf_raw, + dp1.Object.z_pixelFlags_inexact_psfCenter AS z_pixelFlags_inexact_psfCenter_raw, + dp1.Object.z_pixelFlags_interpolated AS z_pixelFlags_interpolated_raw, + dp1.Object.z_pixelFlags_interpolatedCenter AS z_pixelFlags_interpolatedCenter_raw, + dp1.Object.z_pixelFlags_nodata AS z_pixelFlags_nodata_raw, + dp1.Object.z_pixelFlags_offimage AS z_pixelFlags_offimage_raw, + dp1.Object.z_pixelFlags_saturated AS z_pixelFlags_saturated_raw, + dp1.Object.z_pixelFlags_saturatedCenter AS z_pixelFlags_saturatedCenter_raw, + dp1.Object.z_pixelFlags_sensor_edge AS z_pixelFlags_sensor_edge_raw, + dp1.Object.z_pixelFlags_sensor_edgeCenter AS z_pixelFlags_sensor_edgeCenter_raw, + dp1.Object.z_pixelFlags_suspect AS z_pixelFlags_suspect_raw, + dp1.Object.z_pixelFlags_suspectCenter AS z_pixelFlags_suspectCenter_raw, + dp1.Object.z_psfFlux AS z_psfFlux_raw, + dp1.Object.z_psfFlux_area AS z_psfFlux_area_raw, + dp1.Object.z_psfFlux_flag AS z_psfFlux_flag_raw, + dp1.Object.z_psfFlux_flag_apCorr AS z_psfFlux_flag_apCorr_raw, + dp1.Object.z_psfFlux_flag_edge AS z_psfFlux_flag_edge_raw, + dp1.Object.z_psfFlux_flag_noGoodPixels AS z_psfFlux_flag_noGoodPixels_raw, + dp1.Object.z_psfFluxErr AS z_psfFluxErr_raw, + dp1.Object.z_psfMag AS z_psfMag_raw, + dp1.Object.z_psfMagErr AS z_psfMagErr_raw, + dp1.Object.z_psfModel_TwoGaussian_chisq_reduced AS z_psfModel_TwoGaussian_chisq_reduced_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss1_fluxfrac AS z_psfModel_TwoGaussian_gauss1_fluxfrac_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss1_rho AS z_psfModel_TwoGaussian_gauss1_rho_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss1_sigma_x AS z_psfModel_TwoGaussian_gauss1_sigma_x_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss1_sigma_y AS z_psfModel_TwoGaussian_gauss1_sigma_y_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss2_rho AS z_psfModel_TwoGaussian_gauss2_rho_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss2_sigma_x AS z_psfModel_TwoGaussian_gauss2_sigma_x_raw, + dp1.Object.z_psfModel_TwoGaussian_gauss2_sigma_y AS z_psfModel_TwoGaussian_gauss2_sigma_y_raw, + dp1.Object.z_psfModel_TwoGaussian_n_iter AS z_psfModel_TwoGaussian_n_iter_raw, + dp1.Object.z_psfModel_TwoGaussian_no_inputs_flag AS z_psfModel_TwoGaussian_no_inputs_flag_raw, + dp1.Object.z_psfModel_TwoGaussian_unknown_flag AS z_psfModel_TwoGaussian_unknown_flag_raw, + dp1.Object.z_ra AS z_ra_raw, + dp1.Object.z_ra_dec_Cov AS z_ra_dec_Cov_raw, + dp1.Object.z_raErr AS z_raErr_raw, + dp1.Object.z_sersicFlux AS z_sersicFlux_raw, + dp1.Object.z_sersicFluxErr AS z_sersicFluxErr_raw, + dp1.Object.z_sizeExtendedness AS z_sizeExtendedness_raw, + dp1.Object.z_sizeExtendedness_flag AS z_sizeExtendedness_flag_raw, + (dp1.Object.coord_dec + 0) AS coord_dec_plus_0, + (dp1.Object.coord_decErr + 1) AS coord_decErr_plus_1, + (dp1.Object.coord_ra + 2) AS coord_ra_plus_2, + (dp1.Object.coord_ra_dec_Cov + 3) AS coord_ra_dec_Cov_plus_3, + (dp1.Object.coord_raErr + 4) AS coord_raErr_plus_4, + (dp1.Object.deblend_failed + 5) AS deblend_failed_plus_5, + (dp1.Object.deblend_incompleteData + 6) AS deblend_incompleteData_plus_6, + (dp1.Object.deblend_isolatedParent + 7) AS deblend_isolatedParent_plus_7, + (dp1.Object.deblend_iterations + 8) AS deblend_iterations_plus_8, + (dp1.Object.deblend_logL + 9) AS deblend_logL_plus_9, + (dp1.Object.deblend_masked + 10) AS deblend_masked_plus_10, + (dp1.Object.deblend_nChild + 11) AS deblend_nChild_plus_11, + (dp1.Object.deblend_nPeaks + 12) AS deblend_nPeaks_plus_12, + (dp1.Object.deblend_parentTooBig + 13) AS deblend_parentTooBig_plus_13, + (dp1.Object.deblend_peak_center_x + 14) AS deblend_peak_center_x_plus_14, + (dp1.Object.deblend_peak_center_y + 15) AS deblend_peak_center_y_plus_15, + (dp1.Object.deblend_skipped + 16) AS deblend_skipped_plus_16, + (dp1.Object.deblend_tooManyPeaks + 0) AS deblend_tooManyPeaks_plus_17, + (dp1.Object.detect_fromBlend + 1) AS detect_fromBlend_plus_18, + (dp1.Object.detect_isDeblendedModelSource + 2) AS detect_isDeblendedModelSource_plus_19, + (dp1.Object.detect_isIsolated + 3) AS detect_isIsolated_plus_20, + (dp1.Object.ebv + 4) AS ebv_plus_21, + (dp1.Object.footprintArea + 5) AS footprintArea_plus_22, + (dp1.Object.g_ap03Flux + 6) AS g_ap03Flux_plus_23, + (dp1.Object.g_ap03Flux_flag + 7) AS g_ap03Flux_flag_plus_24, + (dp1.Object.g_ap03FluxErr + 8) AS g_ap03FluxErr_plus_25, + (dp1.Object.g_ap06Flux + 9) AS g_ap06Flux_plus_26, + (dp1.Object.g_ap06Flux_flag + 10) AS g_ap06Flux_flag_plus_27, + (dp1.Object.g_ap06FluxErr + 11) AS g_ap06FluxErr_plus_28, + (dp1.Object.g_ap09Flux + 12) AS g_ap09Flux_plus_29, + (dp1.Object.g_ap09Flux_flag + 13) AS g_ap09Flux_flag_plus_30, + (dp1.Object.g_ap09FluxErr + 14) AS g_ap09FluxErr_plus_31, + (dp1.Object.g_ap12Flux + 15) AS g_ap12Flux_plus_32, + (dp1.Object.g_ap12Flux_flag + 16) AS g_ap12Flux_flag_plus_33, + (dp1.Object.g_ap12FluxErr + 0) AS g_ap12FluxErr_plus_34, + (dp1.Object.g_ap17Flux + 1) AS g_ap17Flux_plus_35, + (dp1.Object.g_ap17Flux_flag + 2) AS g_ap17Flux_flag_plus_36, + (dp1.Object.g_ap17FluxErr + 3) AS g_ap17FluxErr_plus_37, + (dp1.Object.g_ap25Flux + 4) AS g_ap25Flux_plus_38, + (dp1.Object.g_ap25Flux_flag + 5) AS g_ap25Flux_flag_plus_39, + (dp1.Object.g_ap25FluxErr + 6) AS g_ap25FluxErr_plus_40, + (dp1.Object.g_ap35Flux + 7) AS g_ap35Flux_plus_41, + (dp1.Object.g_ap35Flux_flag + 8) AS g_ap35Flux_flag_plus_42, + (dp1.Object.g_ap35FluxErr + 9) AS g_ap35FluxErr_plus_43, + (dp1.Object.g_ap50Flux + 10) AS g_ap50Flux_plus_44, + (dp1.Object.g_ap50Flux_flag + 11) AS g_ap50Flux_flag_plus_45, + (dp1.Object.g_ap50FluxErr + 12) AS g_ap50FluxErr_plus_46, + (dp1.Object.g_ap70Flux + 13) AS g_ap70Flux_plus_47, + (dp1.Object.g_ap70Flux_flag + 14) AS g_ap70Flux_flag_plus_48, + (dp1.Object.g_ap70FluxErr + 15) AS g_ap70FluxErr_plus_49, + (dp1.Object.g_apFlux_flag + 16) AS g_apFlux_flag_plus_50, + (dp1.Object.g_apFlux_flag_apertureTruncated + 0) AS g_apFlux_flag_apertureTruncated_plus_51, + (dp1.Object.g_apFlux_flag_sincCoeffsTruncated + 1) AS g_apFlux_flag_sincCoeffsTruncated_plus_52, + (dp1.Object.g_bdChi2 + 2) AS g_bdChi2_plus_53, + (dp1.Object.g_bdE1 + 3) AS g_bdE1_plus_54, + (dp1.Object.g_bdE2 + 4) AS g_bdE2_plus_55, + (dp1.Object.g_bdFluxB + 5) AS g_bdFluxB_plus_56, + (dp1.Object.g_bdFluxBErr + 6) AS g_bdFluxBErr_plus_57, + (dp1.Object.g_bdFluxD + 7) AS g_bdFluxD_plus_58, + (dp1.Object.g_bdFluxDErr + 8) AS g_bdFluxDErr_plus_59, + (dp1.Object.g_bdReB + 9) AS g_bdReB_plus_60, + (dp1.Object.g_bdReD + 10) AS g_bdReD_plus_61, + (dp1.Object.g_blendedness + 11) AS g_blendedness_plus_62, + (dp1.Object.g_blendedness_flag + 12) AS g_blendedness_flag_plus_63, + (dp1.Object.g_calib_astrometry_used + 13) AS g_calib_astrometry_used_plus_64, + (dp1.Object.g_calib_photometry_reserved + 14) AS g_calib_photometry_reserved_plus_65, + (dp1.Object.g_calib_photometry_used + 15) AS g_calib_photometry_used_plus_66, + (dp1.Object.g_calib_psf_candidate + 16) AS g_calib_psf_candidate_plus_67, + (dp1.Object.g_calib_psf_reserved + 0) AS g_calib_psf_reserved_plus_68, + (dp1.Object.g_calib_psf_used + 1) AS g_calib_psf_used_plus_69, + (dp1.Object.g_calibFlux + 2) AS g_calibFlux_plus_70, + (dp1.Object.g_calibFlux_flag + 3) AS g_calibFlux_flag_plus_71, + (dp1.Object.g_calibFlux_flag_apertureTruncated + 4) AS g_calibFlux_flag_apertureTruncated_plus_72, + (dp1.Object.g_calibFlux_flag_sincCoeffsTruncated + 5) AS g_calibFlux_flag_sincCoeffsTruncated_plus_73, + (dp1.Object.g_calibFluxErr + 6) AS g_calibFluxErr_plus_74, + (dp1.Object.g_centroid_flag + 7) AS g_centroid_flag_plus_75, + (dp1.Object.g_centroid_x + 8) AS g_centroid_x_plus_76, + (dp1.Object.g_centroid_xErr + 9) AS g_centroid_xErr_plus_77, + (dp1.Object.g_centroid_y + 10) AS g_centroid_y_plus_78, + (dp1.Object.g_centroid_yErr + 11) AS g_centroid_yErr_plus_79, + (dp1.Object.g_cModel_flag + 12) AS g_cModel_flag_plus_80, + (dp1.Object.g_cModel_flag_apCorr + 13) AS g_cModel_flag_apCorr_plus_81, + (dp1.Object.g_cModelFlux + 14) AS g_cModelFlux_plus_82, + (dp1.Object.g_cModelFlux_inner + 15) AS g_cModelFlux_inner_plus_83, + (dp1.Object.g_cModelFluxErr + 16) AS g_cModelFluxErr_plus_84, + (dp1.Object.g_cModelMag + 0) AS g_cModelMag_plus_85, + (dp1.Object.g_cModelMagErr + 1) AS g_cModelMagErr_plus_86, + (dp1.Object.g_deblend_blendedness + 2) AS g_deblend_blendedness_plus_87, + (dp1.Object.g_deblend_dataCoverage + 3) AS g_deblend_dataCoverage_plus_88, + (dp1.Object.g_deblend_fluxOverlap + 4) AS g_deblend_fluxOverlap_plus_89, + (dp1.Object.g_deblend_fluxOverlapFraction + 5) AS g_deblend_fluxOverlapFraction_plus_90, + (dp1.Object.g_deblend_zeroFlux + 6) AS g_deblend_zeroFlux_plus_91, + (dp1.Object.g_dec + 7) AS g_dec_plus_92, + (dp1.Object.g_decErr + 8) AS g_decErr_plus_93, + (dp1.Object.g_epoch + 9) AS g_epoch_plus_94, + (dp1.Object.g_extendedness + 10) AS g_extendedness_plus_95, + (dp1.Object.g_extendedness_flag + 11) AS g_extendedness_flag_plus_96, + (dp1.Object.g_free_cModelFlux + 12) AS g_free_cModelFlux_plus_97, + (dp1.Object.g_free_cModelFlux_flag + 13) AS g_free_cModelFlux_flag_plus_98, + (dp1.Object.g_free_cModelFlux_inner + 14) AS g_free_cModelFlux_inner_plus_99, + (dp1.Object.g_free_cModelFluxErr + 15) AS g_free_cModelFluxErr_plus_100, + (dp1.Object.g_free_psfFlux + 16) AS g_free_psfFlux_plus_101, + (dp1.Object.g_free_psfFlux_flag + 0) AS g_free_psfFlux_flag_plus_102, + (dp1.Object.g_free_psfFluxErr + 1) AS g_free_psfFluxErr_plus_103, + (dp1.Object.g_gaap0p7Flux + 2) AS g_gaap0p7Flux_plus_104, + (dp1.Object.g_gaap0p7Flux_flag_bigPsf + 3) AS g_gaap0p7Flux_flag_bigPsf_plus_105, + (dp1.Object.g_gaap0p7FluxErr + 4) AS g_gaap0p7FluxErr_plus_106, + (dp1.Object.g_gaap1p0Flux + 5) AS g_gaap1p0Flux_plus_107, + (dp1.Object.g_gaap1p0Flux_flag_bigPsf + 6) AS g_gaap1p0Flux_flag_bigPsf_plus_108, + (dp1.Object.g_gaap1p0FluxErr + 7) AS g_gaap1p0FluxErr_plus_109, + (dp1.Object.g_gaap1p5Flux + 8) AS g_gaap1p5Flux_plus_110, + (dp1.Object.g_gaap1p5Flux_flag_bigPsf + 9) AS g_gaap1p5Flux_flag_bigPsf_plus_111, + (dp1.Object.g_gaap1p5FluxErr + 10) AS g_gaap1p5FluxErr_plus_112, + (dp1.Object.g_gaap2p5Flux + 11) AS g_gaap2p5Flux_plus_113, + (dp1.Object.g_gaap2p5Flux_flag_bigPsf + 12) AS g_gaap2p5Flux_flag_bigPsf_plus_114, + (dp1.Object.g_gaap2p5FluxErr + 13) AS g_gaap2p5FluxErr_plus_115, + (dp1.Object.g_gaap3p0Flux + 14) AS g_gaap3p0Flux_plus_116, + (dp1.Object.g_gaap3p0Flux_flag_bigPsf + 15) AS g_gaap3p0Flux_flag_bigPsf_plus_117, + (dp1.Object.g_gaap3p0FluxErr + 16) AS g_gaap3p0FluxErr_plus_118, + (dp1.Object.g_gaapFlux_flag + 0) AS g_gaapFlux_flag_plus_119, + (dp1.Object.g_gaapFlux_flag_edge + 1) AS g_gaapFlux_flag_edge_plus_120, + (dp1.Object.g_gaapFlux_flag_gaussianization + 2) AS g_gaapFlux_flag_gaussianization_plus_121, + (dp1.Object.g_gaapOptimalFlux + 3) AS g_gaapOptimalFlux_plus_122, + (dp1.Object.g_gaapOptimalFlux_flag_bigPsf + 4) AS g_gaapOptimalFlux_flag_bigPsf_plus_123, + (dp1.Object.g_gaapOptimalFluxErr + 5) AS g_gaapOptimalFluxErr_plus_124, + (dp1.Object.g_gaapPsfFlux + 6) AS g_gaapPsfFlux_plus_125, + (dp1.Object.g_gaapPsfFluxErr + 7) AS g_gaapPsfFluxErr_plus_126, + (dp1.Object.g_hsm_moments_03 + 8) AS g_hsm_moments_03_plus_127, + (dp1.Object.g_hsm_moments_04 + 9) AS g_hsm_moments_04_plus_128, + (dp1.Object.g_hsm_moments_12 + 10) AS g_hsm_moments_12_plus_129, + (dp1.Object.g_hsm_moments_13 + 11) AS g_hsm_moments_13_plus_130, + (dp1.Object.g_hsm_moments_21 + 12) AS g_hsm_moments_21_plus_131, + (dp1.Object.g_hsm_moments_22 + 13) AS g_hsm_moments_22_plus_132, + (dp1.Object.g_hsm_moments_30 + 14) AS g_hsm_moments_30_plus_133, + (dp1.Object.g_hsm_moments_31 + 15) AS g_hsm_moments_31_plus_134, + (dp1.Object.g_hsm_moments_40 + 16) AS g_hsm_moments_40_plus_135, + (dp1.Object.g_hsm_moments_flag + 0) AS g_hsm_moments_flag_plus_136, + (dp1.Object.g_hsm_momentsPsf_03 + 1) AS g_hsm_momentsPsf_03_plus_137, + (dp1.Object.g_hsm_momentsPsf_04 + 2) AS g_hsm_momentsPsf_04_plus_138, + (dp1.Object.g_hsm_momentsPsf_12 + 3) AS g_hsm_momentsPsf_12_plus_139, + (dp1.Object.g_hsm_momentsPsf_13 + 4) AS g_hsm_momentsPsf_13_plus_140, + (dp1.Object.g_hsm_momentsPsf_21 + 5) AS g_hsm_momentsPsf_21_plus_141, + (dp1.Object.g_hsm_momentsPsf_22 + 6) AS g_hsm_momentsPsf_22_plus_142, + (dp1.Object.g_hsm_momentsPsf_30 + 7) AS g_hsm_momentsPsf_30_plus_143, + (dp1.Object.g_hsm_momentsPsf_31 + 8) AS g_hsm_momentsPsf_31_plus_144, + (dp1.Object.g_hsm_momentsPsf_40 + 9) AS g_hsm_momentsPsf_40_plus_145, + (dp1.Object.g_hsm_momentsPsf_flag + 10) AS g_hsm_momentsPsf_flag_plus_146, + (dp1.Object.g_hsmShapeRegauss_e1 + 11) AS g_hsmShapeRegauss_e1_plus_147, + (dp1.Object.g_hsmShapeRegauss_e2 + 12) AS g_hsmShapeRegauss_e2_plus_148, + (dp1.Object.g_hsmShapeRegauss_flag + 13) AS g_hsmShapeRegauss_flag_plus_149, + (dp1.Object.g_hsmShapeRegauss_sigma + 14) AS g_hsmShapeRegauss_sigma_plus_150, + (dp1.Object.g_i_flag + 15) AS g_i_flag_plus_151, + (dp1.Object.g_iDebiasedPSF_flag + 16) AS g_iDebiasedPSF_flag_plus_152, + (dp1.Object.g_inputCount + 0) AS g_inputCount_plus_153, + (dp1.Object.g_inputCount_flag + 1) AS g_inputCount_flag_plus_154, + (dp1.Object.g_inputCount_flag_noInputs + 2) AS g_inputCount_flag_noInputs_plus_155, + (dp1.Object.g_invalidPsfFlag + 3) AS g_invalidPsfFlag_plus_156, + (dp1.Object.g_iPSF_flag + 4) AS g_iPSF_flag_plus_157, + (dp1.Object.g_iRound_flag + 5) AS g_iRound_flag_plus_158, + (dp1.Object.g_ixx + 6) AS g_ixx_plus_159, + (dp1.Object.g_ixxDebiasedPSF + 7) AS g_ixxDebiasedPSF_plus_160, + (dp1.Object.g_ixxPSF + 8) AS g_ixxPSF_plus_161, + (dp1.Object.g_ixxRound + 9) AS g_ixxRound_plus_162, + (dp1.Object.g_ixy + 10) AS g_ixy_plus_163, + (dp1.Object.g_ixyDebiasedPSF + 11) AS g_ixyDebiasedPSF_plus_164, + (dp1.Object.g_ixyPSF + 12) AS g_ixyPSF_plus_165, + (dp1.Object.g_ixyRound + 13) AS g_ixyRound_plus_166, + (dp1.Object.g_iyy + 14) AS g_iyy_plus_167, + (dp1.Object.g_iyyDebiasedPSF + 15) AS g_iyyDebiasedPSF_plus_168, + (dp1.Object.g_iyyPSF + 16) AS g_iyyPSF_plus_169, + (dp1.Object.g_iyyRound + 0) AS g_iyyRound_plus_170, + (dp1.Object.g_kronFlux + 1) AS g_kronFlux_plus_171, + (dp1.Object.g_kronFlux_flag + 2) AS g_kronFlux_flag_plus_172, + (dp1.Object.g_kronFlux_flag_bad_radius + 3) AS g_kronFlux_flag_bad_radius_plus_173, + (dp1.Object.g_kronFlux_flag_bad_shape + 4) AS g_kronFlux_flag_bad_shape_plus_174, + (dp1.Object.g_kronFlux_flag_bad_shape_no_psf + 5) AS g_kronFlux_flag_bad_shape_no_psf_plus_175, + (dp1.Object.g_kronFlux_flag_edge + 6) AS g_kronFlux_flag_edge_plus_176, + (dp1.Object.g_kronFlux_flag_no_fallback_radius + 7) AS g_kronFlux_flag_no_fallback_radius_plus_177, + (dp1.Object.g_kronFlux_flag_no_minimum_radius + 8) AS g_kronFlux_flag_no_minimum_radius_plus_178, + (dp1.Object.g_kronFlux_flag_small_radius + 9) AS g_kronFlux_flag_small_radius_plus_179, + (dp1.Object.g_kronFlux_flag_used_minimum_radius + 10) AS g_kronFlux_flag_used_minimum_radius_plus_180, + (dp1.Object.g_kronFlux_flag_used_psf_radius + 11) AS g_kronFlux_flag_used_psf_radius_plus_181, + (dp1.Object.g_kronFluxErr + 12) AS g_kronFluxErr_plus_182, + (dp1.Object.g_kronRad + 13) AS g_kronRad_plus_183, + (dp1.Object.g_pixelFlags_bad + 14) AS g_pixelFlags_bad_plus_184, + (dp1.Object.g_pixelFlags_clipped + 15) AS g_pixelFlags_clipped_plus_185, + (dp1.Object.g_pixelFlags_clippedCenter + 16) AS g_pixelFlags_clippedCenter_plus_186, + (dp1.Object.g_pixelFlags_cr + 0) AS g_pixelFlags_cr_plus_187, + (dp1.Object.g_pixelFlags_crCenter + 1) AS g_pixelFlags_crCenter_plus_188, + (dp1.Object.g_pixelFlags_edge + 2) AS g_pixelFlags_edge_plus_189, + (dp1.Object.g_pixelFlags_inexact_psf + 3) AS g_pixelFlags_inexact_psf_plus_190, + (dp1.Object.g_pixelFlags_inexact_psfCenter + 4) AS g_pixelFlags_inexact_psfCenter_plus_191, + (dp1.Object.g_pixelFlags_interpolated + 5) AS g_pixelFlags_interpolated_plus_192, + (dp1.Object.g_pixelFlags_interpolatedCenter + 6) AS g_pixelFlags_interpolatedCenter_plus_193, + (dp1.Object.g_pixelFlags_nodata + 7) AS g_pixelFlags_nodata_plus_194, + (dp1.Object.g_pixelFlags_offimage + 8) AS g_pixelFlags_offimage_plus_195, + (dp1.Object.g_pixelFlags_saturated + 9) AS g_pixelFlags_saturated_plus_196, + (dp1.Object.g_pixelFlags_saturatedCenter + 10) AS g_pixelFlags_saturatedCenter_plus_197, + (dp1.Object.g_pixelFlags_sensor_edge + 11) AS g_pixelFlags_sensor_edge_plus_198, + (dp1.Object.g_pixelFlags_sensor_edgeCenter + 12) AS g_pixelFlags_sensor_edgeCenter_plus_199, + (dp1.Object.g_pixelFlags_suspect + 13) AS g_pixelFlags_suspect_plus_200, + (dp1.Object.g_pixelFlags_suspectCenter + 14) AS g_pixelFlags_suspectCenter_plus_201, + (dp1.Object.g_psfFlux + 15) AS g_psfFlux_plus_202, + (dp1.Object.g_psfFlux_area + 16) AS g_psfFlux_area_plus_203, + (dp1.Object.g_psfFlux_flag + 0) AS g_psfFlux_flag_plus_204, + (dp1.Object.g_psfFlux_flag_apCorr + 1) AS g_psfFlux_flag_apCorr_plus_205, + (dp1.Object.g_psfFlux_flag_edge + 2) AS g_psfFlux_flag_edge_plus_206, + (dp1.Object.g_psfFlux_flag_noGoodPixels + 3) AS g_psfFlux_flag_noGoodPixels_plus_207, + (dp1.Object.g_psfFluxErr + 4) AS g_psfFluxErr_plus_208, + (dp1.Object.g_psfMag + 5) AS g_psfMag_plus_209, + (dp1.Object.g_psfMagErr + 6) AS g_psfMagErr_plus_210, + (dp1.Object.g_psfModel_TwoGaussian_chisq_reduced + 7) AS g_psfModel_TwoGaussian_chisq_reduced_plus_211, + (dp1.Object.g_psfModel_TwoGaussian_gauss1_fluxfrac + 8) AS g_psfModel_TwoGaussian_gauss1_fluxfrac_plus_212, + (dp1.Object.g_psfModel_TwoGaussian_gauss1_rho + 9) AS g_psfModel_TwoGaussian_gauss1_rho_plus_213, + (dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_x + 10) AS g_psfModel_TwoGaussian_gauss1_sigma_x_plus_214, + (dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_y + 11) AS g_psfModel_TwoGaussian_gauss1_sigma_y_plus_215, + (dp1.Object.g_psfModel_TwoGaussian_gauss2_rho + 12) AS g_psfModel_TwoGaussian_gauss2_rho_plus_216, + (dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_x + 13) AS g_psfModel_TwoGaussian_gauss2_sigma_x_plus_217, + (dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_y + 14) AS g_psfModel_TwoGaussian_gauss2_sigma_y_plus_218, + (dp1.Object.g_psfModel_TwoGaussian_n_iter + 15) AS g_psfModel_TwoGaussian_n_iter_plus_219, + (dp1.Object.g_psfModel_TwoGaussian_no_inputs_flag + 16) AS g_psfModel_TwoGaussian_no_inputs_flag_plus_220, + (dp1.Object.g_psfModel_TwoGaussian_unknown_flag + 0) AS g_psfModel_TwoGaussian_unknown_flag_plus_221, + (dp1.Object.g_ra + 1) AS g_ra_plus_222, + (dp1.Object.g_ra_dec_Cov + 2) AS g_ra_dec_Cov_plus_223, + (dp1.Object.g_raErr + 3) AS g_raErr_plus_224, + (dp1.Object.g_sersicFlux + 4) AS g_sersicFlux_plus_225, + (dp1.Object.g_sersicFluxErr + 5) AS g_sersicFluxErr_plus_226, + (dp1.Object.g_sizeExtendedness + 6) AS g_sizeExtendedness_plus_227, + (dp1.Object.g_sizeExtendedness_flag + 7) AS g_sizeExtendedness_flag_plus_228, + (dp1.Object.i_ap03Flux + 8) AS i_ap03Flux_plus_229, + (dp1.Object.i_ap03Flux_flag + 9) AS i_ap03Flux_flag_plus_230, + (dp1.Object.i_ap03FluxErr + 10) AS i_ap03FluxErr_plus_231, + (dp1.Object.i_ap06Flux + 11) AS i_ap06Flux_plus_232, + (dp1.Object.i_ap06Flux_flag + 12) AS i_ap06Flux_flag_plus_233, + (dp1.Object.i_ap06FluxErr + 13) AS i_ap06FluxErr_plus_234, + (dp1.Object.i_ap09Flux + 14) AS i_ap09Flux_plus_235, + (dp1.Object.i_ap09Flux_flag + 15) AS i_ap09Flux_flag_plus_236, + (dp1.Object.i_ap09FluxErr + 16) AS i_ap09FluxErr_plus_237, + (dp1.Object.i_ap12Flux + 0) AS i_ap12Flux_plus_238, + (dp1.Object.i_ap12Flux_flag + 1) AS i_ap12Flux_flag_plus_239, + (dp1.Object.i_ap12FluxErr + 2) AS i_ap12FluxErr_plus_240, + (dp1.Object.i_ap17Flux + 3) AS i_ap17Flux_plus_241, + (dp1.Object.i_ap17Flux_flag + 4) AS i_ap17Flux_flag_plus_242, + (dp1.Object.i_ap17FluxErr + 5) AS i_ap17FluxErr_plus_243, + (dp1.Object.i_ap25Flux + 6) AS i_ap25Flux_plus_244, + (dp1.Object.i_ap25Flux_flag + 7) AS i_ap25Flux_flag_plus_245, + (dp1.Object.i_ap25FluxErr + 8) AS i_ap25FluxErr_plus_246, + (dp1.Object.i_ap35Flux + 9) AS i_ap35Flux_plus_247, + (dp1.Object.i_ap35Flux_flag + 10) AS i_ap35Flux_flag_plus_248, + (dp1.Object.i_ap35FluxErr + 11) AS i_ap35FluxErr_plus_249, + (dp1.Object.i_ap50Flux + 12) AS i_ap50Flux_plus_250, + (dp1.Object.i_ap50Flux_flag + 13) AS i_ap50Flux_flag_plus_251, + (dp1.Object.i_ap50FluxErr + 14) AS i_ap50FluxErr_plus_252, + (dp1.Object.i_ap70Flux + 15) AS i_ap70Flux_plus_253, + (dp1.Object.i_ap70Flux_flag + 16) AS i_ap70Flux_flag_plus_254, + (dp1.Object.i_ap70FluxErr + 0) AS i_ap70FluxErr_plus_255, + (dp1.Object.i_apFlux_flag + 1) AS i_apFlux_flag_plus_256, + (dp1.Object.i_apFlux_flag_apertureTruncated + 2) AS i_apFlux_flag_apertureTruncated_plus_257, + (dp1.Object.i_apFlux_flag_sincCoeffsTruncated + 3) AS i_apFlux_flag_sincCoeffsTruncated_plus_258, + (dp1.Object.i_bdChi2 + 4) AS i_bdChi2_plus_259, + (dp1.Object.i_bdE1 + 5) AS i_bdE1_plus_260, + (dp1.Object.i_bdE2 + 6) AS i_bdE2_plus_261, + (dp1.Object.i_bdFluxB + 7) AS i_bdFluxB_plus_262, + (dp1.Object.i_bdFluxBErr + 8) AS i_bdFluxBErr_plus_263, + (dp1.Object.i_bdFluxD + 9) AS i_bdFluxD_plus_264, + (dp1.Object.i_bdFluxDErr + 10) AS i_bdFluxDErr_plus_265, + (dp1.Object.i_bdReB + 11) AS i_bdReB_plus_266, + (dp1.Object.i_bdReD + 12) AS i_bdReD_plus_267, + (dp1.Object.i_blendedness + 13) AS i_blendedness_plus_268, + (dp1.Object.i_blendedness_flag + 14) AS i_blendedness_flag_plus_269, + (dp1.Object.i_calib_astrometry_used + 15) AS i_calib_astrometry_used_plus_270, + (dp1.Object.i_calib_photometry_reserved + 16) AS i_calib_photometry_reserved_plus_271, + (dp1.Object.i_calib_photometry_used + 0) AS i_calib_photometry_used_plus_272, + (dp1.Object.i_calib_psf_candidate + 1) AS i_calib_psf_candidate_plus_273, + (dp1.Object.i_calib_psf_reserved + 2) AS i_calib_psf_reserved_plus_274, + (dp1.Object.i_calib_psf_used + 3) AS i_calib_psf_used_plus_275, + (dp1.Object.i_calibFlux + 4) AS i_calibFlux_plus_276, + (dp1.Object.i_calibFlux_flag + 5) AS i_calibFlux_flag_plus_277, + (dp1.Object.i_calibFlux_flag_apertureTruncated + 6) AS i_calibFlux_flag_apertureTruncated_plus_278, + (dp1.Object.i_calibFlux_flag_sincCoeffsTruncated + 7) AS i_calibFlux_flag_sincCoeffsTruncated_plus_279, + (dp1.Object.i_calibFluxErr + 8) AS i_calibFluxErr_plus_280, + (dp1.Object.i_centroid_flag + 9) AS i_centroid_flag_plus_281, + (dp1.Object.i_centroid_x + 10) AS i_centroid_x_plus_282, + (dp1.Object.i_centroid_xErr + 11) AS i_centroid_xErr_plus_283, + (dp1.Object.i_centroid_y + 12) AS i_centroid_y_plus_284, + (dp1.Object.i_centroid_yErr + 13) AS i_centroid_yErr_plus_285, + (dp1.Object.i_cModel_flag + 14) AS i_cModel_flag_plus_286, + (dp1.Object.i_cModel_flag_apCorr + 15) AS i_cModel_flag_apCorr_plus_287, + (dp1.Object.i_cModelFlux + 16) AS i_cModelFlux_plus_288, + (dp1.Object.i_cModelFlux_inner + 0) AS i_cModelFlux_inner_plus_289, + (dp1.Object.i_cModelFluxErr + 1) AS i_cModelFluxErr_plus_290, + (dp1.Object.i_cModelMag + 2) AS i_cModelMag_plus_291, + (dp1.Object.i_cModelMagErr + 3) AS i_cModelMagErr_plus_292, + (dp1.Object.i_deblend_blendedness + 4) AS i_deblend_blendedness_plus_293, + (dp1.Object.i_deblend_dataCoverage + 5) AS i_deblend_dataCoverage_plus_294, + (dp1.Object.i_deblend_fluxOverlap + 6) AS i_deblend_fluxOverlap_plus_295, + (dp1.Object.i_deblend_fluxOverlapFraction + 7) AS i_deblend_fluxOverlapFraction_plus_296, + (dp1.Object.i_deblend_zeroFlux + 8) AS i_deblend_zeroFlux_plus_297, + (dp1.Object.i_dec + 9) AS i_dec_plus_298, + (dp1.Object.i_decErr + 10) AS i_decErr_plus_299, + (dp1.Object.i_epoch + 11) AS i_epoch_plus_300, + (dp1.Object.i_extendedness + 12) AS i_extendedness_plus_301, + (dp1.Object.i_extendedness_flag + 13) AS i_extendedness_flag_plus_302, + (dp1.Object.i_free_cModelFlux + 14) AS i_free_cModelFlux_plus_303, + (dp1.Object.i_free_cModelFlux_flag + 15) AS i_free_cModelFlux_flag_plus_304, + (dp1.Object.i_free_cModelFlux_inner + 16) AS i_free_cModelFlux_inner_plus_305, + (dp1.Object.i_free_cModelFluxErr + 0) AS i_free_cModelFluxErr_plus_306, + (dp1.Object.i_free_psfFlux + 1) AS i_free_psfFlux_plus_307, + (dp1.Object.i_free_psfFlux_flag + 2) AS i_free_psfFlux_flag_plus_308, + (dp1.Object.i_free_psfFluxErr + 3) AS i_free_psfFluxErr_plus_309, + (dp1.Object.i_gaap0p7Flux + 4) AS i_gaap0p7Flux_plus_310, + (dp1.Object.i_gaap0p7Flux_flag_bigPsf + 5) AS i_gaap0p7Flux_flag_bigPsf_plus_311, + (dp1.Object.i_gaap0p7FluxErr + 6) AS i_gaap0p7FluxErr_plus_312, + (dp1.Object.i_gaap1p0Flux + 7) AS i_gaap1p0Flux_plus_313, + (dp1.Object.i_gaap1p0Flux_flag_bigPsf + 8) AS i_gaap1p0Flux_flag_bigPsf_plus_314, + (dp1.Object.i_gaap1p0FluxErr + 9) AS i_gaap1p0FluxErr_plus_315, + (dp1.Object.i_gaap1p5Flux + 10) AS i_gaap1p5Flux_plus_316, + (dp1.Object.i_gaap1p5Flux_flag_bigPsf + 11) AS i_gaap1p5Flux_flag_bigPsf_plus_317, + (dp1.Object.i_gaap1p5FluxErr + 12) AS i_gaap1p5FluxErr_plus_318, + (dp1.Object.i_gaap2p5Flux + 13) AS i_gaap2p5Flux_plus_319, + (dp1.Object.i_gaap2p5Flux_flag_bigPsf + 14) AS i_gaap2p5Flux_flag_bigPsf_plus_320, + (dp1.Object.i_gaap2p5FluxErr + 15) AS i_gaap2p5FluxErr_plus_321, + (dp1.Object.i_gaap3p0Flux + 16) AS i_gaap3p0Flux_plus_322, + (dp1.Object.i_gaap3p0Flux_flag_bigPsf + 0) AS i_gaap3p0Flux_flag_bigPsf_plus_323, + (dp1.Object.i_gaap3p0FluxErr + 1) AS i_gaap3p0FluxErr_plus_324, + (dp1.Object.i_gaapFlux_flag + 2) AS i_gaapFlux_flag_plus_325, + (dp1.Object.i_gaapFlux_flag_edge + 3) AS i_gaapFlux_flag_edge_plus_326, + (dp1.Object.i_gaapFlux_flag_gaussianization + 4) AS i_gaapFlux_flag_gaussianization_plus_327, + (dp1.Object.i_gaapOptimalFlux + 5) AS i_gaapOptimalFlux_plus_328, + (dp1.Object.i_gaapOptimalFlux_flag_bigPsf + 6) AS i_gaapOptimalFlux_flag_bigPsf_plus_329, + (dp1.Object.i_gaapOptimalFluxErr + 7) AS i_gaapOptimalFluxErr_plus_330, + (dp1.Object.i_gaapPsfFlux + 8) AS i_gaapPsfFlux_plus_331, + (dp1.Object.i_gaapPsfFluxErr + 9) AS i_gaapPsfFluxErr_plus_332, + (dp1.Object.i_hsm_moments_03 + 10) AS i_hsm_moments_03_plus_333, + (dp1.Object.i_hsm_moments_04 + 11) AS i_hsm_moments_04_plus_334, + (dp1.Object.i_hsm_moments_12 + 12) AS i_hsm_moments_12_plus_335, + (dp1.Object.i_hsm_moments_13 + 13) AS i_hsm_moments_13_plus_336, + (dp1.Object.i_hsm_moments_21 + 14) AS i_hsm_moments_21_plus_337, + (dp1.Object.i_hsm_moments_22 + 15) AS i_hsm_moments_22_plus_338, + (dp1.Object.i_hsm_moments_30 + 16) AS i_hsm_moments_30_plus_339, + (dp1.Object.i_hsm_moments_31 + 0) AS i_hsm_moments_31_plus_340, + (dp1.Object.i_hsm_moments_40 + 1) AS i_hsm_moments_40_plus_341, + (dp1.Object.i_hsm_moments_flag + 2) AS i_hsm_moments_flag_plus_342, + (dp1.Object.i_hsm_momentsPsf_03 + 3) AS i_hsm_momentsPsf_03_plus_343, + (dp1.Object.i_hsm_momentsPsf_04 + 4) AS i_hsm_momentsPsf_04_plus_344, + (dp1.Object.i_hsm_momentsPsf_12 + 5) AS i_hsm_momentsPsf_12_plus_345, + (dp1.Object.i_hsm_momentsPsf_13 + 6) AS i_hsm_momentsPsf_13_plus_346, + (dp1.Object.i_hsm_momentsPsf_21 + 7) AS i_hsm_momentsPsf_21_plus_347, + (dp1.Object.i_hsm_momentsPsf_22 + 8) AS i_hsm_momentsPsf_22_plus_348, + (dp1.Object.i_hsm_momentsPsf_30 + 9) AS i_hsm_momentsPsf_30_plus_349, + (dp1.Object.i_hsm_momentsPsf_31 + 10) AS i_hsm_momentsPsf_31_plus_350, + (dp1.Object.i_hsm_momentsPsf_40 + 11) AS i_hsm_momentsPsf_40_plus_351, + (dp1.Object.i_hsm_momentsPsf_flag + 12) AS i_hsm_momentsPsf_flag_plus_352, + (dp1.Object.i_hsmShapeRegauss_e1 + 13) AS i_hsmShapeRegauss_e1_plus_353, + (dp1.Object.i_hsmShapeRegauss_e2 + 14) AS i_hsmShapeRegauss_e2_plus_354, + (dp1.Object.i_hsmShapeRegauss_flag + 15) AS i_hsmShapeRegauss_flag_plus_355, + (dp1.Object.i_hsmShapeRegauss_sigma + 16) AS i_hsmShapeRegauss_sigma_plus_356, + (dp1.Object.i_i_flag + 0) AS i_i_flag_plus_357, + (dp1.Object.i_iDebiasedPSF_flag + 1) AS i_iDebiasedPSF_flag_plus_358, + (dp1.Object.i_inputCount + 2) AS i_inputCount_plus_359, + (dp1.Object.i_inputCount_flag + 3) AS i_inputCount_flag_plus_360, + (dp1.Object.i_inputCount_flag_noInputs + 4) AS i_inputCount_flag_noInputs_plus_361, + (dp1.Object.i_invalidPsfFlag + 5) AS i_invalidPsfFlag_plus_362, + (dp1.Object.i_iPSF_flag + 6) AS i_iPSF_flag_plus_363, + (dp1.Object.i_iRound_flag + 7) AS i_iRound_flag_plus_364, + (dp1.Object.i_ixx + 8) AS i_ixx_plus_365, + (dp1.Object.i_ixxDebiasedPSF + 9) AS i_ixxDebiasedPSF_plus_366, + (dp1.Object.i_ixxPSF + 10) AS i_ixxPSF_plus_367, + (dp1.Object.i_ixxRound + 11) AS i_ixxRound_plus_368, + (dp1.Object.i_ixy + 12) AS i_ixy_plus_369, + (dp1.Object.i_ixyDebiasedPSF + 13) AS i_ixyDebiasedPSF_plus_370, + (dp1.Object.i_ixyPSF + 14) AS i_ixyPSF_plus_371, + (dp1.Object.i_ixyRound + 15) AS i_ixyRound_plus_372, + (dp1.Object.i_iyy + 16) AS i_iyy_plus_373, + (dp1.Object.i_iyyDebiasedPSF + 0) AS i_iyyDebiasedPSF_plus_374, + (dp1.Object.i_iyyPSF + 1) AS i_iyyPSF_plus_375, + (dp1.Object.i_iyyRound + 2) AS i_iyyRound_plus_376, + (dp1.Object.i_kronFlux + 3) AS i_kronFlux_plus_377, + (dp1.Object.i_kronFlux_flag + 4) AS i_kronFlux_flag_plus_378, + (dp1.Object.i_kronFlux_flag_bad_radius + 5) AS i_kronFlux_flag_bad_radius_plus_379, + (dp1.Object.i_kronFlux_flag_bad_shape + 6) AS i_kronFlux_flag_bad_shape_plus_380, + (dp1.Object.i_kronFlux_flag_bad_shape_no_psf + 7) AS i_kronFlux_flag_bad_shape_no_psf_plus_381, + (dp1.Object.i_kronFlux_flag_edge + 8) AS i_kronFlux_flag_edge_plus_382, + (dp1.Object.i_kronFlux_flag_no_fallback_radius + 9) AS i_kronFlux_flag_no_fallback_radius_plus_383, + (dp1.Object.i_kronFlux_flag_no_minimum_radius + 10) AS i_kronFlux_flag_no_minimum_radius_plus_384, + (dp1.Object.i_kronFlux_flag_small_radius + 11) AS i_kronFlux_flag_small_radius_plus_385, + (dp1.Object.i_kronFlux_flag_used_minimum_radius + 12) AS i_kronFlux_flag_used_minimum_radius_plus_386, + (dp1.Object.i_kronFlux_flag_used_psf_radius + 13) AS i_kronFlux_flag_used_psf_radius_plus_387, + (dp1.Object.i_kronFluxErr + 14) AS i_kronFluxErr_plus_388, + (dp1.Object.i_kronRad + 15) AS i_kronRad_plus_389, + (dp1.Object.i_pixelFlags_bad + 16) AS i_pixelFlags_bad_plus_390, + (dp1.Object.i_pixelFlags_clipped + 0) AS i_pixelFlags_clipped_plus_391, + (dp1.Object.i_pixelFlags_clippedCenter + 1) AS i_pixelFlags_clippedCenter_plus_392, + (dp1.Object.i_pixelFlags_cr + 2) AS i_pixelFlags_cr_plus_393, + (dp1.Object.i_pixelFlags_crCenter + 3) AS i_pixelFlags_crCenter_plus_394, + (dp1.Object.i_pixelFlags_edge + 4) AS i_pixelFlags_edge_plus_395, + (dp1.Object.i_pixelFlags_inexact_psf + 5) AS i_pixelFlags_inexact_psf_plus_396, + (dp1.Object.i_pixelFlags_inexact_psfCenter + 6) AS i_pixelFlags_inexact_psfCenter_plus_397, + (dp1.Object.i_pixelFlags_interpolated + 7) AS i_pixelFlags_interpolated_plus_398, + (dp1.Object.i_pixelFlags_interpolatedCenter + 8) AS i_pixelFlags_interpolatedCenter_plus_399, + (dp1.Object.i_pixelFlags_nodata + 9) AS i_pixelFlags_nodata_plus_400, + (dp1.Object.i_pixelFlags_offimage + 10) AS i_pixelFlags_offimage_plus_401, + (dp1.Object.i_pixelFlags_saturated + 11) AS i_pixelFlags_saturated_plus_402, + (dp1.Object.i_pixelFlags_saturatedCenter + 12) AS i_pixelFlags_saturatedCenter_plus_403, + (dp1.Object.i_pixelFlags_sensor_edge + 13) AS i_pixelFlags_sensor_edge_plus_404, + (dp1.Object.i_pixelFlags_sensor_edgeCenter + 14) AS i_pixelFlags_sensor_edgeCenter_plus_405, + (dp1.Object.i_pixelFlags_suspect + 15) AS i_pixelFlags_suspect_plus_406, + (dp1.Object.i_pixelFlags_suspectCenter + 16) AS i_pixelFlags_suspectCenter_plus_407, + (dp1.Object.i_psfFlux + 0) AS i_psfFlux_plus_408, + (dp1.Object.i_psfFlux_area + 1) AS i_psfFlux_area_plus_409, + (dp1.Object.i_psfFlux_flag + 2) AS i_psfFlux_flag_plus_410, + (dp1.Object.i_psfFlux_flag_apCorr + 3) AS i_psfFlux_flag_apCorr_plus_411, + (dp1.Object.i_psfFlux_flag_edge + 4) AS i_psfFlux_flag_edge_plus_412, + (dp1.Object.i_psfFlux_flag_noGoodPixels + 5) AS i_psfFlux_flag_noGoodPixels_plus_413, + (dp1.Object.i_psfFluxErr + 6) AS i_psfFluxErr_plus_414, + (dp1.Object.i_psfMag + 7) AS i_psfMag_plus_415, + (dp1.Object.i_psfMagErr + 8) AS i_psfMagErr_plus_416, + (dp1.Object.i_psfModel_TwoGaussian_chisq_reduced + 9) AS i_psfModel_TwoGaussian_chisq_reduced_plus_417, + (dp1.Object.i_psfModel_TwoGaussian_gauss1_fluxfrac + 10) AS i_psfModel_TwoGaussian_gauss1_fluxfrac_plus_418, + (dp1.Object.i_psfModel_TwoGaussian_gauss1_rho + 11) AS i_psfModel_TwoGaussian_gauss1_rho_plus_419 +FROM dp1.Object +WHERE objectId = 0 + AND coord_ra BETWEEN 0 AND 360 + AND coord_dec BETWEEN -90 AND 90 diff --git a/src/ccontrol/testdata/parser-corpus/q06_object_table_aggregates.sql b/src/ccontrol/testdata/parser-corpus/q06_object_table_aggregates.sql new file mode 100644 index 0000000000..d2eef5f827 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q06_object_table_aggregates.sql @@ -0,0 +1,703 @@ +SELECT + dp1.Object.canonicalFilterId, + dp1.Object.extendedness, + COUNT(dp1.Object.qserv_trans_id) AS count_qserv_trans_id, + MIN(dp1.Object.qserv_trans_id) AS min_qserv_trans_id, + MAX(dp1.Object.qserv_trans_id) AS max_qserv_trans_id, + COUNT(dp1.Object.objectId) AS count_objectId, + MIN(dp1.Object.objectId) AS min_objectId, + MAX(dp1.Object.objectId) AS max_objectId, + COUNT(dp1.Object.iauId) AS count_iauId, + MIN(dp1.Object.iauId) AS min_iauId, + MAX(dp1.Object.iauId) AS max_iauId, + COUNT(dp1.Object.ra_PS) AS count_ra_PS, + MIN(dp1.Object.ra_PS) AS min_ra_PS, + MAX(dp1.Object.ra_PS) AS max_ra_PS, + COUNT(dp1.Object.ra_PS_Sigma) AS count_ra_PS_Sigma, + MIN(dp1.Object.ra_PS_Sigma) AS min_ra_PS_Sigma, + MAX(dp1.Object.ra_PS_Sigma) AS max_ra_PS_Sigma, + COUNT(dp1.Object.decl_PS) AS count_decl_PS, + MIN(dp1.Object.decl_PS) AS min_decl_PS, + MAX(dp1.Object.decl_PS) AS max_decl_PS, + COUNT(dp1.Object.decl_PS_Sigma) AS count_decl_PS_Sigma, + MIN(dp1.Object.decl_PS_Sigma) AS min_decl_PS_Sigma, + MAX(dp1.Object.decl_PS_Sigma) AS max_decl_PS_Sigma, + COUNT(dp1.Object.radecl_PS_Cov) AS count_radecl_PS_Cov, + MIN(dp1.Object.radecl_PS_Cov) AS min_radecl_PS_Cov, + MAX(dp1.Object.radecl_PS_Cov) AS max_radecl_PS_Cov, + COUNT(dp1.Object.htmId20) AS count_htmId20, + MIN(dp1.Object.htmId20) AS min_htmId20, + MAX(dp1.Object.htmId20) AS max_htmId20, + COUNT(dp1.Object.ra_SG) AS count_ra_SG, + MIN(dp1.Object.ra_SG) AS min_ra_SG, + MAX(dp1.Object.ra_SG) AS max_ra_SG, + COUNT(dp1.Object.ra_SG_Sigma) AS count_ra_SG_Sigma, + MIN(dp1.Object.ra_SG_Sigma) AS min_ra_SG_Sigma, + MAX(dp1.Object.ra_SG_Sigma) AS max_ra_SG_Sigma, + COUNT(dp1.Object.decl_SG) AS count_decl_SG, + MIN(dp1.Object.decl_SG) AS min_decl_SG, + MAX(dp1.Object.decl_SG) AS max_decl_SG, + COUNT(dp1.Object.decl_SG_Sigma) AS count_decl_SG_Sigma, + MIN(dp1.Object.decl_SG_Sigma) AS min_decl_SG_Sigma, + MAX(dp1.Object.decl_SG_Sigma) AS max_decl_SG_Sigma, + COUNT(dp1.Object.radecl_SG_Cov) AS count_radecl_SG_Cov, + MIN(dp1.Object.radecl_SG_Cov) AS min_radecl_SG_Cov, + MAX(dp1.Object.radecl_SG_Cov) AS max_radecl_SG_Cov, + COUNT(dp1.Object.raRange) AS count_raRange, + MIN(dp1.Object.raRange) AS min_raRange, + MAX(dp1.Object.raRange) AS max_raRange, + COUNT(dp1.Object.declRange) AS count_declRange, + MIN(dp1.Object.declRange) AS min_declRange, + MAX(dp1.Object.declRange) AS max_declRange, + COUNT(dp1.Object.muRa_PS) AS count_muRa_PS, + MIN(dp1.Object.muRa_PS) AS min_muRa_PS, + MAX(dp1.Object.muRa_PS) AS max_muRa_PS, + COUNT(dp1.Object.muRa_PS_Sigma) AS count_muRa_PS_Sigma, + MIN(dp1.Object.muRa_PS_Sigma) AS min_muRa_PS_Sigma, + MAX(dp1.Object.muRa_PS_Sigma) AS max_muRa_PS_Sigma, + COUNT(dp1.Object.muDecl_PS) AS count_muDecl_PS, + MIN(dp1.Object.muDecl_PS) AS min_muDecl_PS, + MAX(dp1.Object.muDecl_PS) AS max_muDecl_PS, + COUNT(dp1.Object.muDecl_PS_Sigma) AS count_muDecl_PS_Sigma, + MIN(dp1.Object.muDecl_PS_Sigma) AS min_muDecl_PS_Sigma, + MAX(dp1.Object.muDecl_PS_Sigma) AS max_muDecl_PS_Sigma, + COUNT(dp1.Object.muRaDecl_PS_Cov) AS count_muRaDecl_PS_Cov, + MIN(dp1.Object.muRaDecl_PS_Cov) AS min_muRaDecl_PS_Cov, + MAX(dp1.Object.muRaDecl_PS_Cov) AS max_muRaDecl_PS_Cov, + COUNT(dp1.Object.parallax_PS) AS count_parallax_PS, + MIN(dp1.Object.parallax_PS) AS min_parallax_PS, + MAX(dp1.Object.parallax_PS) AS max_parallax_PS, + COUNT(dp1.Object.parallax_PS_Sigma) AS count_parallax_PS_Sigma, + MIN(dp1.Object.parallax_PS_Sigma) AS min_parallax_PS_Sigma, + MAX(dp1.Object.parallax_PS_Sigma) AS max_parallax_PS_Sigma, + COUNT(dp1.Object.canonicalFilterId) AS count_canonicalFilterId, + MIN(dp1.Object.canonicalFilterId) AS min_canonicalFilterId, + MAX(dp1.Object.canonicalFilterId) AS max_canonicalFilterId, + COUNT(dp1.Object.extendedness) AS count_extendedness, + MIN(dp1.Object.extendedness) AS min_extendedness, + MAX(dp1.Object.extendedness) AS max_extendedness, + COUNT(dp1.Object.varProb) AS count_varProb, + MIN(dp1.Object.varProb) AS min_varProb, + MAX(dp1.Object.varProb) AS max_varProb, + COUNT(dp1.Object.earliestObsTime) AS count_earliestObsTime, + MIN(dp1.Object.earliestObsTime) AS min_earliestObsTime, + MAX(dp1.Object.earliestObsTime) AS max_earliestObsTime, + COUNT(dp1.Object.latestObsTime) AS count_latestObsTime, + MIN(dp1.Object.latestObsTime) AS min_latestObsTime, + MAX(dp1.Object.latestObsTime) AS max_latestObsTime, + COUNT(dp1.Object.meanObsTime) AS count_meanObsTime, + MIN(dp1.Object.meanObsTime) AS min_meanObsTime, + MAX(dp1.Object.meanObsTime) AS max_meanObsTime, + COUNT(dp1.Object.flags) AS count_flags, + MIN(dp1.Object.flags) AS min_flags, + MAX(dp1.Object.flags) AS max_flags, + COUNT(dp1.Object.uNumObs) AS count_uNumObs, + MIN(dp1.Object.uNumObs) AS min_uNumObs, + MAX(dp1.Object.uNumObs) AS max_uNumObs, + COUNT(dp1.Object.uExtendedness) AS count_uExtendedness, + MIN(dp1.Object.uExtendedness) AS min_uExtendedness, + MAX(dp1.Object.uExtendedness) AS max_uExtendedness, + COUNT(dp1.Object.uVarProb) AS count_uVarProb, + MIN(dp1.Object.uVarProb) AS min_uVarProb, + MAX(dp1.Object.uVarProb) AS max_uVarProb, + COUNT(dp1.Object.uRaOffset_PS) AS count_uRaOffset_PS, + MIN(dp1.Object.uRaOffset_PS) AS min_uRaOffset_PS, + MAX(dp1.Object.uRaOffset_PS) AS max_uRaOffset_PS, + COUNT(dp1.Object.uRaOffset_PS_Sigma) AS count_uRaOffset_PS_Sigma, + MIN(dp1.Object.uRaOffset_PS_Sigma) AS min_uRaOffset_PS_Sigma, + MAX(dp1.Object.uRaOffset_PS_Sigma) AS max_uRaOffset_PS_Sigma, + COUNT(dp1.Object.uDeclOffset_PS) AS count_uDeclOffset_PS, + MIN(dp1.Object.uDeclOffset_PS) AS min_uDeclOffset_PS, + MAX(dp1.Object.uDeclOffset_PS) AS max_uDeclOffset_PS, + COUNT(dp1.Object.uDeclOffset_PS_Sigma) AS count_uDeclOffset_PS_Sigma, + MIN(dp1.Object.uDeclOffset_PS_Sigma) AS min_uDeclOffset_PS_Sigma, + MAX(dp1.Object.uDeclOffset_PS_Sigma) AS max_uDeclOffset_PS_Sigma, + COUNT(dp1.Object.uRaDeclOffset_PS_Cov) AS count_uRaDeclOffset_PS_Cov, + MIN(dp1.Object.uRaDeclOffset_PS_Cov) AS min_uRaDeclOffset_PS_Cov, + MAX(dp1.Object.uRaDeclOffset_PS_Cov) AS max_uRaDeclOffset_PS_Cov, + COUNT(dp1.Object.uRaOffset_SG) AS count_uRaOffset_SG, + MIN(dp1.Object.uRaOffset_SG) AS min_uRaOffset_SG, + MAX(dp1.Object.uRaOffset_SG) AS max_uRaOffset_SG, + COUNT(dp1.Object.uRaOffset_SG_Sigma) AS count_uRaOffset_SG_Sigma, + MIN(dp1.Object.uRaOffset_SG_Sigma) AS min_uRaOffset_SG_Sigma, + MAX(dp1.Object.uRaOffset_SG_Sigma) AS max_uRaOffset_SG_Sigma, + COUNT(dp1.Object.uDeclOffset_SG) AS count_uDeclOffset_SG, + MIN(dp1.Object.uDeclOffset_SG) AS min_uDeclOffset_SG, + MAX(dp1.Object.uDeclOffset_SG) AS max_uDeclOffset_SG, + COUNT(dp1.Object.uDeclOffset_SG_Sigma) AS count_uDeclOffset_SG_Sigma, + MIN(dp1.Object.uDeclOffset_SG_Sigma) AS min_uDeclOffset_SG_Sigma, + MAX(dp1.Object.uDeclOffset_SG_Sigma) AS max_uDeclOffset_SG_Sigma, + COUNT(dp1.Object.uRaDeclOffset_SG_Cov) AS count_uRaDeclOffset_SG_Cov, + MIN(dp1.Object.uRaDeclOffset_SG_Cov) AS min_uRaDeclOffset_SG_Cov, + MAX(dp1.Object.uRaDeclOffset_SG_Cov) AS max_uRaDeclOffset_SG_Cov, + COUNT(dp1.Object.uLnL_PS) AS count_uLnL_PS, + MIN(dp1.Object.uLnL_PS) AS min_uLnL_PS, + MAX(dp1.Object.uLnL_PS) AS max_uLnL_PS, + COUNT(dp1.Object.uLnL_SG) AS count_uLnL_SG, + MIN(dp1.Object.uLnL_SG) AS min_uLnL_SG, + MAX(dp1.Object.uLnL_SG) AS max_uLnL_SG, + COUNT(dp1.Object.uFlux_PS) AS count_uFlux_PS, + MIN(dp1.Object.uFlux_PS) AS min_uFlux_PS, + MAX(dp1.Object.uFlux_PS) AS max_uFlux_PS, + COUNT(dp1.Object.uFlux_PS_Sigma) AS count_uFlux_PS_Sigma, + MIN(dp1.Object.uFlux_PS_Sigma) AS min_uFlux_PS_Sigma, + MAX(dp1.Object.uFlux_PS_Sigma) AS max_uFlux_PS_Sigma, + COUNT(dp1.Object.uFlux_ESG) AS count_uFlux_ESG, + MIN(dp1.Object.uFlux_ESG) AS min_uFlux_ESG, + MAX(dp1.Object.uFlux_ESG) AS max_uFlux_ESG, + COUNT(dp1.Object.uFlux_ESG_Sigma) AS count_uFlux_ESG_Sigma, + MIN(dp1.Object.uFlux_ESG_Sigma) AS min_uFlux_ESG_Sigma, + MAX(dp1.Object.uFlux_ESG_Sigma) AS max_uFlux_ESG_Sigma, + COUNT(dp1.Object.uFlux_Gaussian) AS count_uFlux_Gaussian, + MIN(dp1.Object.uFlux_Gaussian) AS min_uFlux_Gaussian, + MAX(dp1.Object.uFlux_Gaussian) AS max_uFlux_Gaussian, + COUNT(dp1.Object.uFlux_Gaussian_Sigma) AS count_uFlux_Gaussian_Sigma, + MIN(dp1.Object.uFlux_Gaussian_Sigma) AS min_uFlux_Gaussian_Sigma, + MAX(dp1.Object.uFlux_Gaussian_Sigma) AS max_uFlux_Gaussian_Sigma, + COUNT(dp1.Object.uTimescale) AS count_uTimescale, + MIN(dp1.Object.uTimescale) AS min_uTimescale, + MAX(dp1.Object.uTimescale) AS max_uTimescale, + COUNT(dp1.Object.uEarliestObsTime) AS count_uEarliestObsTime, + MIN(dp1.Object.uEarliestObsTime) AS min_uEarliestObsTime, + MAX(dp1.Object.uEarliestObsTime) AS max_uEarliestObsTime, + COUNT(dp1.Object.uLatestObsTime) AS count_uLatestObsTime, + MIN(dp1.Object.uLatestObsTime) AS min_uLatestObsTime, + MAX(dp1.Object.uLatestObsTime) AS max_uLatestObsTime, + COUNT(dp1.Object.uSersicN_SG) AS count_uSersicN_SG, + MIN(dp1.Object.uSersicN_SG) AS min_uSersicN_SG, + MAX(dp1.Object.uSersicN_SG) AS max_uSersicN_SG, + COUNT(dp1.Object.uSersicN_SG_Sigma) AS count_uSersicN_SG_Sigma, + MIN(dp1.Object.uSersicN_SG_Sigma) AS min_uSersicN_SG_Sigma, + MAX(dp1.Object.uSersicN_SG_Sigma) AS max_uSersicN_SG_Sigma, + COUNT(dp1.Object.uE1_SG) AS count_uE1_SG, + MIN(dp1.Object.uE1_SG) AS min_uE1_SG, + MAX(dp1.Object.uE1_SG) AS max_uE1_SG, + COUNT(dp1.Object.uE1_SG_Sigma) AS count_uE1_SG_Sigma, + MIN(dp1.Object.uE1_SG_Sigma) AS min_uE1_SG_Sigma, + MAX(dp1.Object.uE1_SG_Sigma) AS max_uE1_SG_Sigma, + COUNT(dp1.Object.uE2_SG) AS count_uE2_SG, + MIN(dp1.Object.uE2_SG) AS min_uE2_SG, + MAX(dp1.Object.uE2_SG) AS max_uE2_SG, + COUNT(dp1.Object.uE2_SG_Sigma) AS count_uE2_SG_Sigma, + MIN(dp1.Object.uE2_SG_Sigma) AS min_uE2_SG_Sigma, + MAX(dp1.Object.uE2_SG_Sigma) AS max_uE2_SG_Sigma, + COUNT(dp1.Object.uRadius_SG) AS count_uRadius_SG, + MIN(dp1.Object.uRadius_SG) AS min_uRadius_SG, + MAX(dp1.Object.uRadius_SG) AS max_uRadius_SG, + COUNT(dp1.Object.uRadius_SG_Sigma) AS count_uRadius_SG_Sigma, + MIN(dp1.Object.uRadius_SG_Sigma) AS min_uRadius_SG_Sigma, + MAX(dp1.Object.uRadius_SG_Sigma) AS max_uRadius_SG_Sigma, + COUNT(dp1.Object.uFlags) AS count_uFlags, + MIN(dp1.Object.uFlags) AS min_uFlags, + MAX(dp1.Object.uFlags) AS max_uFlags, + COUNT(dp1.Object.gNumObs) AS count_gNumObs, + MIN(dp1.Object.gNumObs) AS min_gNumObs, + MAX(dp1.Object.gNumObs) AS max_gNumObs, + COUNT(dp1.Object.gExtendedness) AS count_gExtendedness, + MIN(dp1.Object.gExtendedness) AS min_gExtendedness, + MAX(dp1.Object.gExtendedness) AS max_gExtendedness, + COUNT(dp1.Object.gVarProb) AS count_gVarProb, + MIN(dp1.Object.gVarProb) AS min_gVarProb, + MAX(dp1.Object.gVarProb) AS max_gVarProb, + COUNT(dp1.Object.gRaOffset_PS) AS count_gRaOffset_PS, + MIN(dp1.Object.gRaOffset_PS) AS min_gRaOffset_PS, + MAX(dp1.Object.gRaOffset_PS) AS max_gRaOffset_PS, + COUNT(dp1.Object.gRaOffset_PS_Sigma) AS count_gRaOffset_PS_Sigma, + MIN(dp1.Object.gRaOffset_PS_Sigma) AS min_gRaOffset_PS_Sigma, + MAX(dp1.Object.gRaOffset_PS_Sigma) AS max_gRaOffset_PS_Sigma, + COUNT(dp1.Object.gDeclOffset_PS) AS count_gDeclOffset_PS, + MIN(dp1.Object.gDeclOffset_PS) AS min_gDeclOffset_PS, + MAX(dp1.Object.gDeclOffset_PS) AS max_gDeclOffset_PS, + COUNT(dp1.Object.gDeclOffset_PS_Sigma) AS count_gDeclOffset_PS_Sigma, + MIN(dp1.Object.gDeclOffset_PS_Sigma) AS min_gDeclOffset_PS_Sigma, + MAX(dp1.Object.gDeclOffset_PS_Sigma) AS max_gDeclOffset_PS_Sigma, + COUNT(dp1.Object.gRaDeclOffset_PS_Cov) AS count_gRaDeclOffset_PS_Cov, + MIN(dp1.Object.gRaDeclOffset_PS_Cov) AS min_gRaDeclOffset_PS_Cov, + MAX(dp1.Object.gRaDeclOffset_PS_Cov) AS max_gRaDeclOffset_PS_Cov, + COUNT(dp1.Object.gRaOffset_SG) AS count_gRaOffset_SG, + MIN(dp1.Object.gRaOffset_SG) AS min_gRaOffset_SG, + MAX(dp1.Object.gRaOffset_SG) AS max_gRaOffset_SG, + COUNT(dp1.Object.gRaOffset_SG_Sigma) AS count_gRaOffset_SG_Sigma, + MIN(dp1.Object.gRaOffset_SG_Sigma) AS min_gRaOffset_SG_Sigma, + MAX(dp1.Object.gRaOffset_SG_Sigma) AS max_gRaOffset_SG_Sigma, + COUNT(dp1.Object.gDeclOffset_SG) AS count_gDeclOffset_SG, + MIN(dp1.Object.gDeclOffset_SG) AS min_gDeclOffset_SG, + MAX(dp1.Object.gDeclOffset_SG) AS max_gDeclOffset_SG, + COUNT(dp1.Object.gDeclOffset_SG_Sigma) AS count_gDeclOffset_SG_Sigma, + MIN(dp1.Object.gDeclOffset_SG_Sigma) AS min_gDeclOffset_SG_Sigma, + MAX(dp1.Object.gDeclOffset_SG_Sigma) AS max_gDeclOffset_SG_Sigma, + COUNT(dp1.Object.gRaDeclOffset_SG_Cov) AS count_gRaDeclOffset_SG_Cov, + MIN(dp1.Object.gRaDeclOffset_SG_Cov) AS min_gRaDeclOffset_SG_Cov, + MAX(dp1.Object.gRaDeclOffset_SG_Cov) AS max_gRaDeclOffset_SG_Cov, + COUNT(dp1.Object.gLnL_PS) AS count_gLnL_PS, + MIN(dp1.Object.gLnL_PS) AS min_gLnL_PS, + MAX(dp1.Object.gLnL_PS) AS max_gLnL_PS, + COUNT(dp1.Object.gLnL_SG) AS count_gLnL_SG, + MIN(dp1.Object.gLnL_SG) AS min_gLnL_SG, + MAX(dp1.Object.gLnL_SG) AS max_gLnL_SG, + COUNT(dp1.Object.gFlux_PS) AS count_gFlux_PS, + MIN(dp1.Object.gFlux_PS) AS min_gFlux_PS, + MAX(dp1.Object.gFlux_PS) AS max_gFlux_PS, + COUNT(dp1.Object.gFlux_PS_Sigma) AS count_gFlux_PS_Sigma, + MIN(dp1.Object.gFlux_PS_Sigma) AS min_gFlux_PS_Sigma, + MAX(dp1.Object.gFlux_PS_Sigma) AS max_gFlux_PS_Sigma, + COUNT(dp1.Object.gFlux_ESG) AS count_gFlux_ESG, + MIN(dp1.Object.gFlux_ESG) AS min_gFlux_ESG, + MAX(dp1.Object.gFlux_ESG) AS max_gFlux_ESG, + COUNT(dp1.Object.gFlux_ESG_Sigma) AS count_gFlux_ESG_Sigma, + MIN(dp1.Object.gFlux_ESG_Sigma) AS min_gFlux_ESG_Sigma, + MAX(dp1.Object.gFlux_ESG_Sigma) AS max_gFlux_ESG_Sigma, + COUNT(dp1.Object.gFlux_Gaussian) AS count_gFlux_Gaussian, + MIN(dp1.Object.gFlux_Gaussian) AS min_gFlux_Gaussian, + MAX(dp1.Object.gFlux_Gaussian) AS max_gFlux_Gaussian, + COUNT(dp1.Object.gFlux_Gaussian_Sigma) AS count_gFlux_Gaussian_Sigma, + MIN(dp1.Object.gFlux_Gaussian_Sigma) AS min_gFlux_Gaussian_Sigma, + MAX(dp1.Object.gFlux_Gaussian_Sigma) AS max_gFlux_Gaussian_Sigma, + COUNT(dp1.Object.gTimescale) AS count_gTimescale, + MIN(dp1.Object.gTimescale) AS min_gTimescale, + MAX(dp1.Object.gTimescale) AS max_gTimescale, + COUNT(dp1.Object.gEarliestObsTime) AS count_gEarliestObsTime, + MIN(dp1.Object.gEarliestObsTime) AS min_gEarliestObsTime, + MAX(dp1.Object.gEarliestObsTime) AS max_gEarliestObsTime, + COUNT(dp1.Object.gLatestObsTime) AS count_gLatestObsTime, + MIN(dp1.Object.gLatestObsTime) AS min_gLatestObsTime, + MAX(dp1.Object.gLatestObsTime) AS max_gLatestObsTime, + COUNT(dp1.Object.gSersicN_SG) AS count_gSersicN_SG, + MIN(dp1.Object.gSersicN_SG) AS min_gSersicN_SG, + MAX(dp1.Object.gSersicN_SG) AS max_gSersicN_SG, + COUNT(dp1.Object.gSersicN_SG_Sigma) AS count_gSersicN_SG_Sigma, + MIN(dp1.Object.gSersicN_SG_Sigma) AS min_gSersicN_SG_Sigma, + MAX(dp1.Object.gSersicN_SG_Sigma) AS max_gSersicN_SG_Sigma, + COUNT(dp1.Object.gE1_SG) AS count_gE1_SG, + MIN(dp1.Object.gE1_SG) AS min_gE1_SG, + MAX(dp1.Object.gE1_SG) AS max_gE1_SG, + COUNT(dp1.Object.gE1_SG_Sigma) AS count_gE1_SG_Sigma, + MIN(dp1.Object.gE1_SG_Sigma) AS min_gE1_SG_Sigma, + MAX(dp1.Object.gE1_SG_Sigma) AS max_gE1_SG_Sigma, + COUNT(dp1.Object.gE2_SG) AS count_gE2_SG, + MIN(dp1.Object.gE2_SG) AS min_gE2_SG, + MAX(dp1.Object.gE2_SG) AS max_gE2_SG, + COUNT(dp1.Object.gE2_SG_Sigma) AS count_gE2_SG_Sigma, + MIN(dp1.Object.gE2_SG_Sigma) AS min_gE2_SG_Sigma, + MAX(dp1.Object.gE2_SG_Sigma) AS max_gE2_SG_Sigma, + COUNT(dp1.Object.gRadius_SG) AS count_gRadius_SG, + MIN(dp1.Object.gRadius_SG) AS min_gRadius_SG, + MAX(dp1.Object.gRadius_SG) AS max_gRadius_SG, + COUNT(dp1.Object.gRadius_SG_Sigma) AS count_gRadius_SG_Sigma, + MIN(dp1.Object.gRadius_SG_Sigma) AS min_gRadius_SG_Sigma, + MAX(dp1.Object.gRadius_SG_Sigma) AS max_gRadius_SG_Sigma, + COUNT(dp1.Object.gFlags) AS count_gFlags, + MIN(dp1.Object.gFlags) AS min_gFlags, + MAX(dp1.Object.gFlags) AS max_gFlags, + COUNT(dp1.Object.rNumObs) AS count_rNumObs, + MIN(dp1.Object.rNumObs) AS min_rNumObs, + MAX(dp1.Object.rNumObs) AS max_rNumObs, + COUNT(dp1.Object.rExtendedness) AS count_rExtendedness, + MIN(dp1.Object.rExtendedness) AS min_rExtendedness, + MAX(dp1.Object.rExtendedness) AS max_rExtendedness, + COUNT(dp1.Object.rVarProb) AS count_rVarProb, + MIN(dp1.Object.rVarProb) AS min_rVarProb, + MAX(dp1.Object.rVarProb) AS max_rVarProb, + COUNT(dp1.Object.rRaOffset_PS) AS count_rRaOffset_PS, + MIN(dp1.Object.rRaOffset_PS) AS min_rRaOffset_PS, + MAX(dp1.Object.rRaOffset_PS) AS max_rRaOffset_PS, + COUNT(dp1.Object.rRaOffset_PS_Sigma) AS count_rRaOffset_PS_Sigma, + MIN(dp1.Object.rRaOffset_PS_Sigma) AS min_rRaOffset_PS_Sigma, + MAX(dp1.Object.rRaOffset_PS_Sigma) AS max_rRaOffset_PS_Sigma, + COUNT(dp1.Object.rDeclOffset_PS) AS count_rDeclOffset_PS, + MIN(dp1.Object.rDeclOffset_PS) AS min_rDeclOffset_PS, + MAX(dp1.Object.rDeclOffset_PS) AS max_rDeclOffset_PS, + COUNT(dp1.Object.rDeclOffset_PS_Sigma) AS count_rDeclOffset_PS_Sigma, + MIN(dp1.Object.rDeclOffset_PS_Sigma) AS min_rDeclOffset_PS_Sigma, + MAX(dp1.Object.rDeclOffset_PS_Sigma) AS max_rDeclOffset_PS_Sigma, + COUNT(dp1.Object.rRaDeclOffset_PS_Cov) AS count_rRaDeclOffset_PS_Cov, + MIN(dp1.Object.rRaDeclOffset_PS_Cov) AS min_rRaDeclOffset_PS_Cov, + MAX(dp1.Object.rRaDeclOffset_PS_Cov) AS max_rRaDeclOffset_PS_Cov, + COUNT(dp1.Object.rRaOffset_SG) AS count_rRaOffset_SG, + MIN(dp1.Object.rRaOffset_SG) AS min_rRaOffset_SG, + MAX(dp1.Object.rRaOffset_SG) AS max_rRaOffset_SG, + COUNT(dp1.Object.rRaOffset_SG_Sigma) AS count_rRaOffset_SG_Sigma, + MIN(dp1.Object.rRaOffset_SG_Sigma) AS min_rRaOffset_SG_Sigma, + MAX(dp1.Object.rRaOffset_SG_Sigma) AS max_rRaOffset_SG_Sigma, + COUNT(dp1.Object.rDeclOffset_SG) AS count_rDeclOffset_SG, + MIN(dp1.Object.rDeclOffset_SG) AS min_rDeclOffset_SG, + MAX(dp1.Object.rDeclOffset_SG) AS max_rDeclOffset_SG, + COUNT(dp1.Object.rDeclOffset_SG_Sigma) AS count_rDeclOffset_SG_Sigma, + MIN(dp1.Object.rDeclOffset_SG_Sigma) AS min_rDeclOffset_SG_Sigma, + MAX(dp1.Object.rDeclOffset_SG_Sigma) AS max_rDeclOffset_SG_Sigma, + COUNT(dp1.Object.rRaDeclOffset_SG_Cov) AS count_rRaDeclOffset_SG_Cov, + MIN(dp1.Object.rRaDeclOffset_SG_Cov) AS min_rRaDeclOffset_SG_Cov, + MAX(dp1.Object.rRaDeclOffset_SG_Cov) AS max_rRaDeclOffset_SG_Cov, + COUNT(dp1.Object.rLnL_PS) AS count_rLnL_PS, + MIN(dp1.Object.rLnL_PS) AS min_rLnL_PS, + MAX(dp1.Object.rLnL_PS) AS max_rLnL_PS, + COUNT(dp1.Object.rLnL_SG) AS count_rLnL_SG, + MIN(dp1.Object.rLnL_SG) AS min_rLnL_SG, + MAX(dp1.Object.rLnL_SG) AS max_rLnL_SG, + COUNT(dp1.Object.rFlux_PS) AS count_rFlux_PS, + MIN(dp1.Object.rFlux_PS) AS min_rFlux_PS, + MAX(dp1.Object.rFlux_PS) AS max_rFlux_PS, + COUNT(dp1.Object.rFlux_PS_Sigma) AS count_rFlux_PS_Sigma, + MIN(dp1.Object.rFlux_PS_Sigma) AS min_rFlux_PS_Sigma, + MAX(dp1.Object.rFlux_PS_Sigma) AS max_rFlux_PS_Sigma, + COUNT(dp1.Object.rFlux_ESG) AS count_rFlux_ESG, + MIN(dp1.Object.rFlux_ESG) AS min_rFlux_ESG, + MAX(dp1.Object.rFlux_ESG) AS max_rFlux_ESG, + COUNT(dp1.Object.rFlux_ESG_Sigma) AS count_rFlux_ESG_Sigma, + MIN(dp1.Object.rFlux_ESG_Sigma) AS min_rFlux_ESG_Sigma, + MAX(dp1.Object.rFlux_ESG_Sigma) AS max_rFlux_ESG_Sigma, + COUNT(dp1.Object.rFlux_Gaussian) AS count_rFlux_Gaussian, + MIN(dp1.Object.rFlux_Gaussian) AS min_rFlux_Gaussian, + MAX(dp1.Object.rFlux_Gaussian) AS max_rFlux_Gaussian, + COUNT(dp1.Object.rFlux_Gaussian_Sigma) AS count_rFlux_Gaussian_Sigma, + MIN(dp1.Object.rFlux_Gaussian_Sigma) AS min_rFlux_Gaussian_Sigma, + MAX(dp1.Object.rFlux_Gaussian_Sigma) AS max_rFlux_Gaussian_Sigma, + COUNT(dp1.Object.rTimescale) AS count_rTimescale, + MIN(dp1.Object.rTimescale) AS min_rTimescale, + MAX(dp1.Object.rTimescale) AS max_rTimescale, + COUNT(dp1.Object.rEarliestObsTime) AS count_rEarliestObsTime, + MIN(dp1.Object.rEarliestObsTime) AS min_rEarliestObsTime, + MAX(dp1.Object.rEarliestObsTime) AS max_rEarliestObsTime, + COUNT(dp1.Object.rLatestObsTime) AS count_rLatestObsTime, + MIN(dp1.Object.rLatestObsTime) AS min_rLatestObsTime, + MAX(dp1.Object.rLatestObsTime) AS max_rLatestObsTime, + COUNT(dp1.Object.rSersicN_SG) AS count_rSersicN_SG, + MIN(dp1.Object.rSersicN_SG) AS min_rSersicN_SG, + MAX(dp1.Object.rSersicN_SG) AS max_rSersicN_SG, + COUNT(dp1.Object.rSersicN_SG_Sigma) AS count_rSersicN_SG_Sigma, + MIN(dp1.Object.rSersicN_SG_Sigma) AS min_rSersicN_SG_Sigma, + MAX(dp1.Object.rSersicN_SG_Sigma) AS max_rSersicN_SG_Sigma, + COUNT(dp1.Object.rE1_SG) AS count_rE1_SG, + MIN(dp1.Object.rE1_SG) AS min_rE1_SG, + MAX(dp1.Object.rE1_SG) AS max_rE1_SG, + COUNT(dp1.Object.rE1_SG_Sigma) AS count_rE1_SG_Sigma, + MIN(dp1.Object.rE1_SG_Sigma) AS min_rE1_SG_Sigma, + MAX(dp1.Object.rE1_SG_Sigma) AS max_rE1_SG_Sigma, + COUNT(dp1.Object.rE2_SG) AS count_rE2_SG, + MIN(dp1.Object.rE2_SG) AS min_rE2_SG, + MAX(dp1.Object.rE2_SG) AS max_rE2_SG, + COUNT(dp1.Object.rE2_SG_Sigma) AS count_rE2_SG_Sigma, + MIN(dp1.Object.rE2_SG_Sigma) AS min_rE2_SG_Sigma, + MAX(dp1.Object.rE2_SG_Sigma) AS max_rE2_SG_Sigma, + COUNT(dp1.Object.rRadius_SG) AS count_rRadius_SG, + MIN(dp1.Object.rRadius_SG) AS min_rRadius_SG, + MAX(dp1.Object.rRadius_SG) AS max_rRadius_SG, + COUNT(dp1.Object.rRadius_SG_Sigma) AS count_rRadius_SG_Sigma, + MIN(dp1.Object.rRadius_SG_Sigma) AS min_rRadius_SG_Sigma, + MAX(dp1.Object.rRadius_SG_Sigma) AS max_rRadius_SG_Sigma, + COUNT(dp1.Object.rFlags) AS count_rFlags, + MIN(dp1.Object.rFlags) AS min_rFlags, + MAX(dp1.Object.rFlags) AS max_rFlags, + COUNT(dp1.Object.iNumObs) AS count_iNumObs, + MIN(dp1.Object.iNumObs) AS min_iNumObs, + MAX(dp1.Object.iNumObs) AS max_iNumObs, + COUNT(dp1.Object.iExtendedness) AS count_iExtendedness, + MIN(dp1.Object.iExtendedness) AS min_iExtendedness, + MAX(dp1.Object.iExtendedness) AS max_iExtendedness, + COUNT(dp1.Object.iVarProb) AS count_iVarProb, + MIN(dp1.Object.iVarProb) AS min_iVarProb, + MAX(dp1.Object.iVarProb) AS max_iVarProb, + COUNT(dp1.Object.iRaOffset_PS) AS count_iRaOffset_PS, + MIN(dp1.Object.iRaOffset_PS) AS min_iRaOffset_PS, + MAX(dp1.Object.iRaOffset_PS) AS max_iRaOffset_PS, + COUNT(dp1.Object.iRaOffset_PS_Sigma) AS count_iRaOffset_PS_Sigma, + MIN(dp1.Object.iRaOffset_PS_Sigma) AS min_iRaOffset_PS_Sigma, + MAX(dp1.Object.iRaOffset_PS_Sigma) AS max_iRaOffset_PS_Sigma, + COUNT(dp1.Object.iDeclOffset_PS) AS count_iDeclOffset_PS, + MIN(dp1.Object.iDeclOffset_PS) AS min_iDeclOffset_PS, + MAX(dp1.Object.iDeclOffset_PS) AS max_iDeclOffset_PS, + COUNT(dp1.Object.iDeclOffset_PS_Sigma) AS count_iDeclOffset_PS_Sigma, + MIN(dp1.Object.iDeclOffset_PS_Sigma) AS min_iDeclOffset_PS_Sigma, + MAX(dp1.Object.iDeclOffset_PS_Sigma) AS max_iDeclOffset_PS_Sigma, + COUNT(dp1.Object.iRaDeclOffset_PS_Cov) AS count_iRaDeclOffset_PS_Cov, + MIN(dp1.Object.iRaDeclOffset_PS_Cov) AS min_iRaDeclOffset_PS_Cov, + MAX(dp1.Object.iRaDeclOffset_PS_Cov) AS max_iRaDeclOffset_PS_Cov, + COUNT(dp1.Object.iRaOffset_SG) AS count_iRaOffset_SG, + MIN(dp1.Object.iRaOffset_SG) AS min_iRaOffset_SG, + MAX(dp1.Object.iRaOffset_SG) AS max_iRaOffset_SG, + COUNT(dp1.Object.iRaOffset_SG_Sigma) AS count_iRaOffset_SG_Sigma, + MIN(dp1.Object.iRaOffset_SG_Sigma) AS min_iRaOffset_SG_Sigma, + MAX(dp1.Object.iRaOffset_SG_Sigma) AS max_iRaOffset_SG_Sigma, + COUNT(dp1.Object.iDeclOffset_SG) AS count_iDeclOffset_SG, + MIN(dp1.Object.iDeclOffset_SG) AS min_iDeclOffset_SG, + MAX(dp1.Object.iDeclOffset_SG) AS max_iDeclOffset_SG, + COUNT(dp1.Object.iDeclOffset_SG_Sigma) AS count_iDeclOffset_SG_Sigma, + MIN(dp1.Object.iDeclOffset_SG_Sigma) AS min_iDeclOffset_SG_Sigma, + MAX(dp1.Object.iDeclOffset_SG_Sigma) AS max_iDeclOffset_SG_Sigma, + COUNT(dp1.Object.iRaDeclOffset_SG_Cov) AS count_iRaDeclOffset_SG_Cov, + MIN(dp1.Object.iRaDeclOffset_SG_Cov) AS min_iRaDeclOffset_SG_Cov, + MAX(dp1.Object.iRaDeclOffset_SG_Cov) AS max_iRaDeclOffset_SG_Cov, + COUNT(dp1.Object.iLnL_PS) AS count_iLnL_PS, + MIN(dp1.Object.iLnL_PS) AS min_iLnL_PS, + MAX(dp1.Object.iLnL_PS) AS max_iLnL_PS, + COUNT(dp1.Object.iLnL_SG) AS count_iLnL_SG, + MIN(dp1.Object.iLnL_SG) AS min_iLnL_SG, + MAX(dp1.Object.iLnL_SG) AS max_iLnL_SG, + COUNT(dp1.Object.iFlux_PS) AS count_iFlux_PS, + MIN(dp1.Object.iFlux_PS) AS min_iFlux_PS, + MAX(dp1.Object.iFlux_PS) AS max_iFlux_PS, + COUNT(dp1.Object.iFlux_PS_Sigma) AS count_iFlux_PS_Sigma, + MIN(dp1.Object.iFlux_PS_Sigma) AS min_iFlux_PS_Sigma, + MAX(dp1.Object.iFlux_PS_Sigma) AS max_iFlux_PS_Sigma, + COUNT(dp1.Object.iFlux_ESG) AS count_iFlux_ESG, + MIN(dp1.Object.iFlux_ESG) AS min_iFlux_ESG, + MAX(dp1.Object.iFlux_ESG) AS max_iFlux_ESG, + COUNT(dp1.Object.iFlux_ESG_Sigma) AS count_iFlux_ESG_Sigma, + MIN(dp1.Object.iFlux_ESG_Sigma) AS min_iFlux_ESG_Sigma, + MAX(dp1.Object.iFlux_ESG_Sigma) AS max_iFlux_ESG_Sigma, + COUNT(dp1.Object.iFlux_Gaussian) AS count_iFlux_Gaussian, + MIN(dp1.Object.iFlux_Gaussian) AS min_iFlux_Gaussian, + MAX(dp1.Object.iFlux_Gaussian) AS max_iFlux_Gaussian, + COUNT(dp1.Object.iFlux_Gaussian_Sigma) AS count_iFlux_Gaussian_Sigma, + MIN(dp1.Object.iFlux_Gaussian_Sigma) AS min_iFlux_Gaussian_Sigma, + MAX(dp1.Object.iFlux_Gaussian_Sigma) AS max_iFlux_Gaussian_Sigma, + COUNT(dp1.Object.iTimescale) AS count_iTimescale, + MIN(dp1.Object.iTimescale) AS min_iTimescale, + MAX(dp1.Object.iTimescale) AS max_iTimescale, + COUNT(dp1.Object.iEarliestObsTime) AS count_iEarliestObsTime, + MIN(dp1.Object.iEarliestObsTime) AS min_iEarliestObsTime, + MAX(dp1.Object.iEarliestObsTime) AS max_iEarliestObsTime, + COUNT(dp1.Object.iLatestObsTime) AS count_iLatestObsTime, + MIN(dp1.Object.iLatestObsTime) AS min_iLatestObsTime, + MAX(dp1.Object.iLatestObsTime) AS max_iLatestObsTime, + COUNT(dp1.Object.iSersicN_SG) AS count_iSersicN_SG, + MIN(dp1.Object.iSersicN_SG) AS min_iSersicN_SG, + MAX(dp1.Object.iSersicN_SG) AS max_iSersicN_SG, + COUNT(dp1.Object.iSersicN_SG_Sigma) AS count_iSersicN_SG_Sigma, + MIN(dp1.Object.iSersicN_SG_Sigma) AS min_iSersicN_SG_Sigma, + MAX(dp1.Object.iSersicN_SG_Sigma) AS max_iSersicN_SG_Sigma, + COUNT(dp1.Object.iE1_SG) AS count_iE1_SG, + MIN(dp1.Object.iE1_SG) AS min_iE1_SG, + MAX(dp1.Object.iE1_SG) AS max_iE1_SG, + COUNT(dp1.Object.iE1_SG_Sigma) AS count_iE1_SG_Sigma, + MIN(dp1.Object.iE1_SG_Sigma) AS min_iE1_SG_Sigma, + MAX(dp1.Object.iE1_SG_Sigma) AS max_iE1_SG_Sigma, + COUNT(dp1.Object.iE2_SG) AS count_iE2_SG, + MIN(dp1.Object.iE2_SG) AS min_iE2_SG, + MAX(dp1.Object.iE2_SG) AS max_iE2_SG, + COUNT(dp1.Object.iE2_SG_Sigma) AS count_iE2_SG_Sigma, + MIN(dp1.Object.iE2_SG_Sigma) AS min_iE2_SG_Sigma, + MAX(dp1.Object.iE2_SG_Sigma) AS max_iE2_SG_Sigma, + COUNT(dp1.Object.iRadius_SG) AS count_iRadius_SG, + MIN(dp1.Object.iRadius_SG) AS min_iRadius_SG, + MAX(dp1.Object.iRadius_SG) AS max_iRadius_SG, + COUNT(dp1.Object.iRadius_SG_Sigma) AS count_iRadius_SG_Sigma, + MIN(dp1.Object.iRadius_SG_Sigma) AS min_iRadius_SG_Sigma, + MAX(dp1.Object.iRadius_SG_Sigma) AS max_iRadius_SG_Sigma, + COUNT(dp1.Object.iFlags) AS count_iFlags, + MIN(dp1.Object.iFlags) AS min_iFlags, + MAX(dp1.Object.iFlags) AS max_iFlags, + COUNT(dp1.Object.zNumObs) AS count_zNumObs, + MIN(dp1.Object.zNumObs) AS min_zNumObs, + MAX(dp1.Object.zNumObs) AS max_zNumObs, + COUNT(dp1.Object.zExtendedness) AS count_zExtendedness, + MIN(dp1.Object.zExtendedness) AS min_zExtendedness, + MAX(dp1.Object.zExtendedness) AS max_zExtendedness, + COUNT(dp1.Object.zVarProb) AS count_zVarProb, + MIN(dp1.Object.zVarProb) AS min_zVarProb, + MAX(dp1.Object.zVarProb) AS max_zVarProb, + COUNT(dp1.Object.zRaOffset_PS) AS count_zRaOffset_PS, + MIN(dp1.Object.zRaOffset_PS) AS min_zRaOffset_PS, + MAX(dp1.Object.zRaOffset_PS) AS max_zRaOffset_PS, + COUNT(dp1.Object.zRaOffset_PS_Sigma) AS count_zRaOffset_PS_Sigma, + MIN(dp1.Object.zRaOffset_PS_Sigma) AS min_zRaOffset_PS_Sigma, + MAX(dp1.Object.zRaOffset_PS_Sigma) AS max_zRaOffset_PS_Sigma, + COUNT(dp1.Object.zDeclOffset_PS) AS count_zDeclOffset_PS, + MIN(dp1.Object.zDeclOffset_PS) AS min_zDeclOffset_PS, + MAX(dp1.Object.zDeclOffset_PS) AS max_zDeclOffset_PS, + COUNT(dp1.Object.zDeclOffset_PS_Sigma) AS count_zDeclOffset_PS_Sigma, + MIN(dp1.Object.zDeclOffset_PS_Sigma) AS min_zDeclOffset_PS_Sigma, + MAX(dp1.Object.zDeclOffset_PS_Sigma) AS max_zDeclOffset_PS_Sigma, + COUNT(dp1.Object.zRaDeclOffset_PS_Cov) AS count_zRaDeclOffset_PS_Cov, + MIN(dp1.Object.zRaDeclOffset_PS_Cov) AS min_zRaDeclOffset_PS_Cov, + MAX(dp1.Object.zRaDeclOffset_PS_Cov) AS max_zRaDeclOffset_PS_Cov, + COUNT(dp1.Object.zRaOffset_SG) AS count_zRaOffset_SG, + MIN(dp1.Object.zRaOffset_SG) AS min_zRaOffset_SG, + MAX(dp1.Object.zRaOffset_SG) AS max_zRaOffset_SG, + COUNT(dp1.Object.zRaOffset_SG_Sigma) AS count_zRaOffset_SG_Sigma, + MIN(dp1.Object.zRaOffset_SG_Sigma) AS min_zRaOffset_SG_Sigma, + MAX(dp1.Object.zRaOffset_SG_Sigma) AS max_zRaOffset_SG_Sigma, + COUNT(dp1.Object.zDeclOffset_SG) AS count_zDeclOffset_SG, + MIN(dp1.Object.zDeclOffset_SG) AS min_zDeclOffset_SG, + MAX(dp1.Object.zDeclOffset_SG) AS max_zDeclOffset_SG, + COUNT(dp1.Object.zDeclOffset_SG_Sigma) AS count_zDeclOffset_SG_Sigma, + MIN(dp1.Object.zDeclOffset_SG_Sigma) AS min_zDeclOffset_SG_Sigma, + MAX(dp1.Object.zDeclOffset_SG_Sigma) AS max_zDeclOffset_SG_Sigma, + COUNT(dp1.Object.zRaDeclOffset_SG_Cov) AS count_zRaDeclOffset_SG_Cov, + MIN(dp1.Object.zRaDeclOffset_SG_Cov) AS min_zRaDeclOffset_SG_Cov, + MAX(dp1.Object.zRaDeclOffset_SG_Cov) AS max_zRaDeclOffset_SG_Cov, + COUNT(dp1.Object.zLnL_PS) AS count_zLnL_PS, + MIN(dp1.Object.zLnL_PS) AS min_zLnL_PS, + MAX(dp1.Object.zLnL_PS) AS max_zLnL_PS, + COUNT(dp1.Object.zLnL_SG) AS count_zLnL_SG, + MIN(dp1.Object.zLnL_SG) AS min_zLnL_SG, + MAX(dp1.Object.zLnL_SG) AS max_zLnL_SG, + COUNT(dp1.Object.zFlux_PS) AS count_zFlux_PS, + MIN(dp1.Object.zFlux_PS) AS min_zFlux_PS, + MAX(dp1.Object.zFlux_PS) AS max_zFlux_PS, + COUNT(dp1.Object.zFlux_PS_Sigma) AS count_zFlux_PS_Sigma, + MIN(dp1.Object.zFlux_PS_Sigma) AS min_zFlux_PS_Sigma, + MAX(dp1.Object.zFlux_PS_Sigma) AS max_zFlux_PS_Sigma, + COUNT(dp1.Object.zFlux_ESG) AS count_zFlux_ESG, + MIN(dp1.Object.zFlux_ESG) AS min_zFlux_ESG, + MAX(dp1.Object.zFlux_ESG) AS max_zFlux_ESG, + COUNT(dp1.Object.zFlux_ESG_Sigma) AS count_zFlux_ESG_Sigma, + MIN(dp1.Object.zFlux_ESG_Sigma) AS min_zFlux_ESG_Sigma, + MAX(dp1.Object.zFlux_ESG_Sigma) AS max_zFlux_ESG_Sigma, + COUNT(dp1.Object.zFlux_Gaussian) AS count_zFlux_Gaussian, + MIN(dp1.Object.zFlux_Gaussian) AS min_zFlux_Gaussian, + MAX(dp1.Object.zFlux_Gaussian) AS max_zFlux_Gaussian, + COUNT(dp1.Object.zFlux_Gaussian_Sigma) AS count_zFlux_Gaussian_Sigma, + MIN(dp1.Object.zFlux_Gaussian_Sigma) AS min_zFlux_Gaussian_Sigma, + MAX(dp1.Object.zFlux_Gaussian_Sigma) AS max_zFlux_Gaussian_Sigma, + COUNT(dp1.Object.zTimescale) AS count_zTimescale, + MIN(dp1.Object.zTimescale) AS min_zTimescale, + MAX(dp1.Object.zTimescale) AS max_zTimescale, + COUNT(dp1.Object.zEarliestObsTime) AS count_zEarliestObsTime, + MIN(dp1.Object.zEarliestObsTime) AS min_zEarliestObsTime, + MAX(dp1.Object.zEarliestObsTime) AS max_zEarliestObsTime, + COUNT(dp1.Object.zLatestObsTime) AS count_zLatestObsTime, + MIN(dp1.Object.zLatestObsTime) AS min_zLatestObsTime, + MAX(dp1.Object.zLatestObsTime) AS max_zLatestObsTime, + COUNT(dp1.Object.zSersicN_SG) AS count_zSersicN_SG, + MIN(dp1.Object.zSersicN_SG) AS min_zSersicN_SG, + MAX(dp1.Object.zSersicN_SG) AS max_zSersicN_SG, + COUNT(dp1.Object.zSersicN_SG_Sigma) AS count_zSersicN_SG_Sigma, + MIN(dp1.Object.zSersicN_SG_Sigma) AS min_zSersicN_SG_Sigma, + MAX(dp1.Object.zSersicN_SG_Sigma) AS max_zSersicN_SG_Sigma, + COUNT(dp1.Object.zE1_SG) AS count_zE1_SG, + MIN(dp1.Object.zE1_SG) AS min_zE1_SG, + MAX(dp1.Object.zE1_SG) AS max_zE1_SG, + COUNT(dp1.Object.zE1_SG_Sigma) AS count_zE1_SG_Sigma, + MIN(dp1.Object.zE1_SG_Sigma) AS min_zE1_SG_Sigma, + MAX(dp1.Object.zE1_SG_Sigma) AS max_zE1_SG_Sigma, + COUNT(dp1.Object.zE2_SG) AS count_zE2_SG, + MIN(dp1.Object.zE2_SG) AS min_zE2_SG, + MAX(dp1.Object.zE2_SG) AS max_zE2_SG, + COUNT(dp1.Object.zE2_SG_Sigma) AS count_zE2_SG_Sigma, + MIN(dp1.Object.zE2_SG_Sigma) AS min_zE2_SG_Sigma, + MAX(dp1.Object.zE2_SG_Sigma) AS max_zE2_SG_Sigma, + COUNT(dp1.Object.zRadius_SG) AS count_zRadius_SG, + MIN(dp1.Object.zRadius_SG) AS min_zRadius_SG, + MAX(dp1.Object.zRadius_SG) AS max_zRadius_SG, + COUNT(dp1.Object.zRadius_SG_Sigma) AS count_zRadius_SG_Sigma, + MIN(dp1.Object.zRadius_SG_Sigma) AS min_zRadius_SG_Sigma, + MAX(dp1.Object.zRadius_SG_Sigma) AS max_zRadius_SG_Sigma, + COUNT(dp1.Object.zFlags) AS count_zFlags, + MIN(dp1.Object.zFlags) AS min_zFlags, + MAX(dp1.Object.zFlags) AS max_zFlags, + COUNT(dp1.Object.yNumObs) AS count_yNumObs, + MIN(dp1.Object.yNumObs) AS min_yNumObs, + MAX(dp1.Object.yNumObs) AS max_yNumObs, + COUNT(dp1.Object.yExtendedness) AS count_yExtendedness, + MIN(dp1.Object.yExtendedness) AS min_yExtendedness, + MAX(dp1.Object.yExtendedness) AS max_yExtendedness, + COUNT(dp1.Object.yVarProb) AS count_yVarProb, + MIN(dp1.Object.yVarProb) AS min_yVarProb, + MAX(dp1.Object.yVarProb) AS max_yVarProb, + COUNT(dp1.Object.yRaOffset_PS) AS count_yRaOffset_PS, + MIN(dp1.Object.yRaOffset_PS) AS min_yRaOffset_PS, + MAX(dp1.Object.yRaOffset_PS) AS max_yRaOffset_PS, + COUNT(dp1.Object.yRaOffset_PS_Sigma) AS count_yRaOffset_PS_Sigma, + MIN(dp1.Object.yRaOffset_PS_Sigma) AS min_yRaOffset_PS_Sigma, + MAX(dp1.Object.yRaOffset_PS_Sigma) AS max_yRaOffset_PS_Sigma, + COUNT(dp1.Object.yDeclOffset_PS) AS count_yDeclOffset_PS, + MIN(dp1.Object.yDeclOffset_PS) AS min_yDeclOffset_PS, + MAX(dp1.Object.yDeclOffset_PS) AS max_yDeclOffset_PS, + COUNT(dp1.Object.yDeclOffset_PS_Sigma) AS count_yDeclOffset_PS_Sigma, + MIN(dp1.Object.yDeclOffset_PS_Sigma) AS min_yDeclOffset_PS_Sigma, + MAX(dp1.Object.yDeclOffset_PS_Sigma) AS max_yDeclOffset_PS_Sigma, + COUNT(dp1.Object.yRaDeclOffset_PS_Cov) AS count_yRaDeclOffset_PS_Cov, + MIN(dp1.Object.yRaDeclOffset_PS_Cov) AS min_yRaDeclOffset_PS_Cov, + MAX(dp1.Object.yRaDeclOffset_PS_Cov) AS max_yRaDeclOffset_PS_Cov, + COUNT(dp1.Object.yRaOffset_SG) AS count_yRaOffset_SG, + MIN(dp1.Object.yRaOffset_SG) AS min_yRaOffset_SG, + MAX(dp1.Object.yRaOffset_SG) AS max_yRaOffset_SG, + COUNT(dp1.Object.yRaOffset_SG_Sigma) AS count_yRaOffset_SG_Sigma, + MIN(dp1.Object.yRaOffset_SG_Sigma) AS min_yRaOffset_SG_Sigma, + MAX(dp1.Object.yRaOffset_SG_Sigma) AS max_yRaOffset_SG_Sigma, + COUNT(dp1.Object.yDeclOffset_SG) AS count_yDeclOffset_SG, + MIN(dp1.Object.yDeclOffset_SG) AS min_yDeclOffset_SG, + MAX(dp1.Object.yDeclOffset_SG) AS max_yDeclOffset_SG, + COUNT(dp1.Object.yDeclOffset_SG_Sigma) AS count_yDeclOffset_SG_Sigma, + MIN(dp1.Object.yDeclOffset_SG_Sigma) AS min_yDeclOffset_SG_Sigma, + MAX(dp1.Object.yDeclOffset_SG_Sigma) AS max_yDeclOffset_SG_Sigma, + COUNT(dp1.Object.yRaDeclOffset_SG_Cov) AS count_yRaDeclOffset_SG_Cov, + MIN(dp1.Object.yRaDeclOffset_SG_Cov) AS min_yRaDeclOffset_SG_Cov, + MAX(dp1.Object.yRaDeclOffset_SG_Cov) AS max_yRaDeclOffset_SG_Cov, + COUNT(dp1.Object.yLnL_PS) AS count_yLnL_PS, + MIN(dp1.Object.yLnL_PS) AS min_yLnL_PS, + MAX(dp1.Object.yLnL_PS) AS max_yLnL_PS, + COUNT(dp1.Object.yLnL_SG) AS count_yLnL_SG, + MIN(dp1.Object.yLnL_SG) AS min_yLnL_SG, + MAX(dp1.Object.yLnL_SG) AS max_yLnL_SG, + COUNT(dp1.Object.yFlux_PS) AS count_yFlux_PS, + MIN(dp1.Object.yFlux_PS) AS min_yFlux_PS, + MAX(dp1.Object.yFlux_PS) AS max_yFlux_PS, + COUNT(dp1.Object.yFlux_PS_Sigma) AS count_yFlux_PS_Sigma, + MIN(dp1.Object.yFlux_PS_Sigma) AS min_yFlux_PS_Sigma, + MAX(dp1.Object.yFlux_PS_Sigma) AS max_yFlux_PS_Sigma, + COUNT(dp1.Object.yFlux_ESG) AS count_yFlux_ESG, + MIN(dp1.Object.yFlux_ESG) AS min_yFlux_ESG, + MAX(dp1.Object.yFlux_ESG) AS max_yFlux_ESG, + COUNT(dp1.Object.yFlux_ESG_Sigma) AS count_yFlux_ESG_Sigma, + MIN(dp1.Object.yFlux_ESG_Sigma) AS min_yFlux_ESG_Sigma, + MAX(dp1.Object.yFlux_ESG_Sigma) AS max_yFlux_ESG_Sigma, + COUNT(dp1.Object.yFlux_Gaussian) AS count_yFlux_Gaussian, + MIN(dp1.Object.yFlux_Gaussian) AS min_yFlux_Gaussian, + MAX(dp1.Object.yFlux_Gaussian) AS max_yFlux_Gaussian, + COUNT(dp1.Object.yFlux_Gaussian_Sigma) AS count_yFlux_Gaussian_Sigma, + MIN(dp1.Object.yFlux_Gaussian_Sigma) AS min_yFlux_Gaussian_Sigma, + MAX(dp1.Object.yFlux_Gaussian_Sigma) AS max_yFlux_Gaussian_Sigma, + COUNT(dp1.Object.yTimescale) AS count_yTimescale, + MIN(dp1.Object.yTimescale) AS min_yTimescale, + MAX(dp1.Object.yTimescale) AS max_yTimescale, + COUNT(dp1.Object.yEarliestObsTime) AS count_yEarliestObsTime, + MIN(dp1.Object.yEarliestObsTime) AS min_yEarliestObsTime, + MAX(dp1.Object.yEarliestObsTime) AS max_yEarliestObsTime, + COUNT(dp1.Object.yLatestObsTime) AS count_yLatestObsTime, + MIN(dp1.Object.yLatestObsTime) AS min_yLatestObsTime, + MAX(dp1.Object.yLatestObsTime) AS max_yLatestObsTime, + COUNT(dp1.Object.ySersicN_SG) AS count_ySersicN_SG, + MIN(dp1.Object.ySersicN_SG) AS min_ySersicN_SG, + MAX(dp1.Object.ySersicN_SG) AS max_ySersicN_SG, + COUNT(dp1.Object.ySersicN_SG_Sigma) AS count_ySersicN_SG_Sigma, + MIN(dp1.Object.ySersicN_SG_Sigma) AS min_ySersicN_SG_Sigma, + MAX(dp1.Object.ySersicN_SG_Sigma) AS max_ySersicN_SG_Sigma, + COUNT(dp1.Object.yE1_SG) AS count_yE1_SG, + MIN(dp1.Object.yE1_SG) AS min_yE1_SG, + MAX(dp1.Object.yE1_SG) AS max_yE1_SG, + COUNT(dp1.Object.yE1_SG_Sigma) AS count_yE1_SG_Sigma, + MIN(dp1.Object.yE1_SG_Sigma) AS min_yE1_SG_Sigma, + MAX(dp1.Object.yE1_SG_Sigma) AS max_yE1_SG_Sigma, + COUNT(dp1.Object.yE2_SG) AS count_yE2_SG, + MIN(dp1.Object.yE2_SG) AS min_yE2_SG, + MAX(dp1.Object.yE2_SG) AS max_yE2_SG, + COUNT(dp1.Object.yE2_SG_Sigma) AS count_yE2_SG_Sigma, + MIN(dp1.Object.yE2_SG_Sigma) AS min_yE2_SG_Sigma, + MAX(dp1.Object.yE2_SG_Sigma) AS max_yE2_SG_Sigma, + COUNT(dp1.Object.yRadius_SG) AS count_yRadius_SG, + MIN(dp1.Object.yRadius_SG) AS min_yRadius_SG, + MAX(dp1.Object.yRadius_SG) AS max_yRadius_SG, + COUNT(dp1.Object.yRadius_SG_Sigma) AS count_yRadius_SG_Sigma, + MIN(dp1.Object.yRadius_SG_Sigma) AS min_yRadius_SG_Sigma, + MAX(dp1.Object.yRadius_SG_Sigma) AS max_yRadius_SG_Sigma, + COUNT(dp1.Object.yFlags) AS count_yFlags, + MIN(dp1.Object.yFlags) AS min_yFlags, + MAX(dp1.Object.yFlags) AS max_yFlags, + COUNT(dp1.Object.varBinaryField) AS count_varBinaryField, + MIN(dp1.Object.varBinaryField) AS min_varBinaryField, + MAX(dp1.Object.varBinaryField) AS max_varBinaryField, + COUNT(dp1.Object.chunkId) AS count_chunkId, + MIN(dp1.Object.chunkId) AS min_chunkId, + MAX(dp1.Object.chunkId) AS max_chunkId, + COUNT(dp1.Object.subChunkId) AS count_subChunkId, + MIN(dp1.Object.subChunkId) AS min_subChunkId, + MAX(dp1.Object.subChunkId) AS max_subChunkId +FROM dp1.Object +WHERE objectId > 0 + AND flags >= 0 + AND ra_PS BETWEEN 0 AND 360 + AND decl_PS BETWEEN -90 AND 90 +GROUP BY dp1.Object.canonicalFilterId, dp1.Object.extendedness +ORDER BY dp1.Object.canonicalFilterId, dp1.Object.extendedness diff --git a/src/ccontrol/testdata/parser-corpus/q07_object_table_predicate_stress.sql b/src/ccontrol/testdata/parser-corpus/q07_object_table_predicate_stress.sql new file mode 100644 index 0000000000..7424916f06 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q07_object_table_predicate_stress.sql @@ -0,0 +1,504 @@ +SELECT + dp1.Object.qserv_trans_id AS selected_qserv_trans_id, + dp1.Object.objectId AS selected_objectId, + dp1.Object.iauId AS selected_iauId, + dp1.Object.ra_PS AS selected_ra_PS, + dp1.Object.ra_PS_Sigma AS selected_ra_PS_Sigma, + dp1.Object.decl_PS AS selected_decl_PS, + dp1.Object.decl_PS_Sigma AS selected_decl_PS_Sigma, + dp1.Object.radecl_PS_Cov AS selected_radecl_PS_Cov, + dp1.Object.htmId20 AS selected_htmId20, + dp1.Object.ra_SG AS selected_ra_SG, + dp1.Object.ra_SG_Sigma AS selected_ra_SG_Sigma, + dp1.Object.decl_SG AS selected_decl_SG, + dp1.Object.decl_SG_Sigma AS selected_decl_SG_Sigma, + dp1.Object.radecl_SG_Cov AS selected_radecl_SG_Cov, + dp1.Object.raRange AS selected_raRange, + dp1.Object.declRange AS selected_declRange, + dp1.Object.muRa_PS AS selected_muRa_PS, + dp1.Object.muRa_PS_Sigma AS selected_muRa_PS_Sigma, + dp1.Object.muDecl_PS AS selected_muDecl_PS, + dp1.Object.muDecl_PS_Sigma AS selected_muDecl_PS_Sigma, + dp1.Object.muRaDecl_PS_Cov AS selected_muRaDecl_PS_Cov, + dp1.Object.parallax_PS AS selected_parallax_PS, + dp1.Object.parallax_PS_Sigma AS selected_parallax_PS_Sigma, + dp1.Object.canonicalFilterId AS selected_canonicalFilterId, + dp1.Object.extendedness AS selected_extendedness, + dp1.Object.varProb AS selected_varProb, + dp1.Object.earliestObsTime AS selected_earliestObsTime, + dp1.Object.latestObsTime AS selected_latestObsTime, + dp1.Object.meanObsTime AS selected_meanObsTime, + dp1.Object.flags AS selected_flags, + dp1.Object.uNumObs AS selected_uNumObs, + dp1.Object.uExtendedness AS selected_uExtendedness, + dp1.Object.uVarProb AS selected_uVarProb, + dp1.Object.uRaOffset_PS AS selected_uRaOffset_PS, + dp1.Object.uRaOffset_PS_Sigma AS selected_uRaOffset_PS_Sigma, + dp1.Object.uDeclOffset_PS AS selected_uDeclOffset_PS, + dp1.Object.uDeclOffset_PS_Sigma AS selected_uDeclOffset_PS_Sigma, + dp1.Object.uRaDeclOffset_PS_Cov AS selected_uRaDeclOffset_PS_Cov, + dp1.Object.uRaOffset_SG AS selected_uRaOffset_SG, + dp1.Object.uRaOffset_SG_Sigma AS selected_uRaOffset_SG_Sigma, + dp1.Object.uDeclOffset_SG AS selected_uDeclOffset_SG, + dp1.Object.uDeclOffset_SG_Sigma AS selected_uDeclOffset_SG_Sigma, + dp1.Object.uRaDeclOffset_SG_Cov AS selected_uRaDeclOffset_SG_Cov, + dp1.Object.uLnL_PS AS selected_uLnL_PS, + dp1.Object.uLnL_SG AS selected_uLnL_SG, + dp1.Object.uFlux_PS AS selected_uFlux_PS, + dp1.Object.uFlux_PS_Sigma AS selected_uFlux_PS_Sigma, + dp1.Object.uFlux_ESG AS selected_uFlux_ESG, + dp1.Object.uFlux_ESG_Sigma AS selected_uFlux_ESG_Sigma, + dp1.Object.uFlux_Gaussian AS selected_uFlux_Gaussian, + dp1.Object.uFlux_Gaussian_Sigma AS selected_uFlux_Gaussian_Sigma, + dp1.Object.uTimescale AS selected_uTimescale, + dp1.Object.uEarliestObsTime AS selected_uEarliestObsTime, + dp1.Object.uLatestObsTime AS selected_uLatestObsTime, + dp1.Object.uSersicN_SG AS selected_uSersicN_SG, + dp1.Object.uSersicN_SG_Sigma AS selected_uSersicN_SG_Sigma, + dp1.Object.uE1_SG AS selected_uE1_SG, + dp1.Object.uE1_SG_Sigma AS selected_uE1_SG_Sigma, + dp1.Object.uE2_SG AS selected_uE2_SG, + dp1.Object.uE2_SG_Sigma AS selected_uE2_SG_Sigma, + dp1.Object.uRadius_SG AS selected_uRadius_SG, + dp1.Object.uRadius_SG_Sigma AS selected_uRadius_SG_Sigma, + dp1.Object.uFlags AS selected_uFlags, + dp1.Object.gNumObs AS selected_gNumObs, + dp1.Object.gExtendedness AS selected_gExtendedness, + dp1.Object.gVarProb AS selected_gVarProb, + dp1.Object.gRaOffset_PS AS selected_gRaOffset_PS, + dp1.Object.gRaOffset_PS_Sigma AS selected_gRaOffset_PS_Sigma, + dp1.Object.gDeclOffset_PS AS selected_gDeclOffset_PS, + dp1.Object.gDeclOffset_PS_Sigma AS selected_gDeclOffset_PS_Sigma, + dp1.Object.gRaDeclOffset_PS_Cov AS selected_gRaDeclOffset_PS_Cov, + dp1.Object.gRaOffset_SG AS selected_gRaOffset_SG, + dp1.Object.gRaOffset_SG_Sigma AS selected_gRaOffset_SG_Sigma, + dp1.Object.gDeclOffset_SG AS selected_gDeclOffset_SG, + dp1.Object.gDeclOffset_SG_Sigma AS selected_gDeclOffset_SG_Sigma, + dp1.Object.gRaDeclOffset_SG_Cov AS selected_gRaDeclOffset_SG_Cov, + dp1.Object.gLnL_PS AS selected_gLnL_PS, + dp1.Object.gLnL_SG AS selected_gLnL_SG, + dp1.Object.gFlux_PS AS selected_gFlux_PS, + dp1.Object.gFlux_PS_Sigma AS selected_gFlux_PS_Sigma, + dp1.Object.gFlux_ESG AS selected_gFlux_ESG, + dp1.Object.gFlux_ESG_Sigma AS selected_gFlux_ESG_Sigma, + dp1.Object.gFlux_Gaussian AS selected_gFlux_Gaussian, + dp1.Object.gFlux_Gaussian_Sigma AS selected_gFlux_Gaussian_Sigma, + dp1.Object.gTimescale AS selected_gTimescale, + dp1.Object.gEarliestObsTime AS selected_gEarliestObsTime, + dp1.Object.gLatestObsTime AS selected_gLatestObsTime, + dp1.Object.gSersicN_SG AS selected_gSersicN_SG, + dp1.Object.gSersicN_SG_Sigma AS selected_gSersicN_SG_Sigma, + dp1.Object.gE1_SG AS selected_gE1_SG, + dp1.Object.gE1_SG_Sigma AS selected_gE1_SG_Sigma, + dp1.Object.gE2_SG AS selected_gE2_SG, + dp1.Object.gE2_SG_Sigma AS selected_gE2_SG_Sigma, + dp1.Object.gRadius_SG AS selected_gRadius_SG, + dp1.Object.gRadius_SG_Sigma AS selected_gRadius_SG_Sigma, + dp1.Object.gFlags AS selected_gFlags, + dp1.Object.rNumObs AS selected_rNumObs, + dp1.Object.rExtendedness AS selected_rExtendedness, + dp1.Object.rVarProb AS selected_rVarProb, + dp1.Object.rRaOffset_PS AS selected_rRaOffset_PS, + dp1.Object.rRaOffset_PS_Sigma AS selected_rRaOffset_PS_Sigma, + dp1.Object.rDeclOffset_PS AS selected_rDeclOffset_PS, + dp1.Object.rDeclOffset_PS_Sigma AS selected_rDeclOffset_PS_Sigma, + dp1.Object.rRaDeclOffset_PS_Cov AS selected_rRaDeclOffset_PS_Cov, + dp1.Object.rRaOffset_SG AS selected_rRaOffset_SG, + dp1.Object.rRaOffset_SG_Sigma AS selected_rRaOffset_SG_Sigma, + dp1.Object.rDeclOffset_SG AS selected_rDeclOffset_SG, + dp1.Object.rDeclOffset_SG_Sigma AS selected_rDeclOffset_SG_Sigma, + dp1.Object.rRaDeclOffset_SG_Cov AS selected_rRaDeclOffset_SG_Cov, + dp1.Object.rLnL_PS AS selected_rLnL_PS, + dp1.Object.rLnL_SG AS selected_rLnL_SG, + dp1.Object.rFlux_PS AS selected_rFlux_PS, + dp1.Object.rFlux_PS_Sigma AS selected_rFlux_PS_Sigma, + dp1.Object.rFlux_ESG AS selected_rFlux_ESG, + dp1.Object.rFlux_ESG_Sigma AS selected_rFlux_ESG_Sigma, + dp1.Object.rFlux_Gaussian AS selected_rFlux_Gaussian, + dp1.Object.rFlux_Gaussian_Sigma AS selected_rFlux_Gaussian_Sigma, + dp1.Object.rTimescale AS selected_rTimescale, + dp1.Object.rEarliestObsTime AS selected_rEarliestObsTime, + dp1.Object.rLatestObsTime AS selected_rLatestObsTime, + dp1.Object.rSersicN_SG AS selected_rSersicN_SG, + dp1.Object.rSersicN_SG_Sigma AS selected_rSersicN_SG_Sigma, + dp1.Object.rE1_SG AS selected_rE1_SG, + dp1.Object.rE1_SG_Sigma AS selected_rE1_SG_Sigma, + dp1.Object.rE2_SG AS selected_rE2_SG, + dp1.Object.rE2_SG_Sigma AS selected_rE2_SG_Sigma, + dp1.Object.rRadius_SG AS selected_rRadius_SG, + dp1.Object.rRadius_SG_Sigma AS selected_rRadius_SG_Sigma, + dp1.Object.rFlags AS selected_rFlags, + dp1.Object.iNumObs AS selected_iNumObs, + dp1.Object.iExtendedness AS selected_iExtendedness, + dp1.Object.iVarProb AS selected_iVarProb, + dp1.Object.iRaOffset_PS AS selected_iRaOffset_PS, + dp1.Object.iRaOffset_PS_Sigma AS selected_iRaOffset_PS_Sigma, + dp1.Object.iDeclOffset_PS AS selected_iDeclOffset_PS, + dp1.Object.iDeclOffset_PS_Sigma AS selected_iDeclOffset_PS_Sigma, + dp1.Object.iRaDeclOffset_PS_Cov AS selected_iRaDeclOffset_PS_Cov, + dp1.Object.iRaOffset_SG AS selected_iRaOffset_SG, + dp1.Object.iRaOffset_SG_Sigma AS selected_iRaOffset_SG_Sigma, + dp1.Object.iDeclOffset_SG AS selected_iDeclOffset_SG, + dp1.Object.iDeclOffset_SG_Sigma AS selected_iDeclOffset_SG_Sigma, + dp1.Object.iRaDeclOffset_SG_Cov AS selected_iRaDeclOffset_SG_Cov, + dp1.Object.iLnL_PS AS selected_iLnL_PS, + dp1.Object.iLnL_SG AS selected_iLnL_SG, + dp1.Object.iFlux_PS AS selected_iFlux_PS, + dp1.Object.iFlux_PS_Sigma AS selected_iFlux_PS_Sigma, + dp1.Object.iFlux_ESG AS selected_iFlux_ESG, + dp1.Object.iFlux_ESG_Sigma AS selected_iFlux_ESG_Sigma, + dp1.Object.iFlux_Gaussian AS selected_iFlux_Gaussian, + dp1.Object.iFlux_Gaussian_Sigma AS selected_iFlux_Gaussian_Sigma, + dp1.Object.iTimescale AS selected_iTimescale, + dp1.Object.iEarliestObsTime AS selected_iEarliestObsTime, + dp1.Object.iLatestObsTime AS selected_iLatestObsTime, + dp1.Object.iSersicN_SG AS selected_iSersicN_SG, + dp1.Object.iSersicN_SG_Sigma AS selected_iSersicN_SG_Sigma, + dp1.Object.iE1_SG AS selected_iE1_SG, + dp1.Object.iE1_SG_Sigma AS selected_iE1_SG_Sigma, + dp1.Object.iE2_SG AS selected_iE2_SG, + dp1.Object.iE2_SG_Sigma AS selected_iE2_SG_Sigma, + dp1.Object.iRadius_SG AS selected_iRadius_SG, + dp1.Object.iRadius_SG_Sigma AS selected_iRadius_SG_Sigma, + dp1.Object.iFlags AS selected_iFlags, + dp1.Object.zNumObs AS selected_zNumObs, + dp1.Object.zExtendedness AS selected_zExtendedness, + dp1.Object.zVarProb AS selected_zVarProb, + dp1.Object.zRaOffset_PS AS selected_zRaOffset_PS, + dp1.Object.zRaOffset_PS_Sigma AS selected_zRaOffset_PS_Sigma, + dp1.Object.zDeclOffset_PS AS selected_zDeclOffset_PS, + dp1.Object.zDeclOffset_PS_Sigma AS selected_zDeclOffset_PS_Sigma, + dp1.Object.zRaDeclOffset_PS_Cov AS selected_zRaDeclOffset_PS_Cov, + dp1.Object.zRaOffset_SG AS selected_zRaOffset_SG, + dp1.Object.zRaOffset_SG_Sigma AS selected_zRaOffset_SG_Sigma, + dp1.Object.zDeclOffset_SG AS selected_zDeclOffset_SG, + dp1.Object.zDeclOffset_SG_Sigma AS selected_zDeclOffset_SG_Sigma, + dp1.Object.zRaDeclOffset_SG_Cov AS selected_zRaDeclOffset_SG_Cov, + dp1.Object.zLnL_PS AS selected_zLnL_PS, + dp1.Object.zLnL_SG AS selected_zLnL_SG, + dp1.Object.zFlux_PS AS selected_zFlux_PS, + dp1.Object.zFlux_PS_Sigma AS selected_zFlux_PS_Sigma, + dp1.Object.zFlux_ESG AS selected_zFlux_ESG, + dp1.Object.zFlux_ESG_Sigma AS selected_zFlux_ESG_Sigma, + dp1.Object.zFlux_Gaussian AS selected_zFlux_Gaussian, + dp1.Object.zFlux_Gaussian_Sigma AS selected_zFlux_Gaussian_Sigma, + dp1.Object.zTimescale AS selected_zTimescale, + dp1.Object.zEarliestObsTime AS selected_zEarliestObsTime, + dp1.Object.zLatestObsTime AS selected_zLatestObsTime, + dp1.Object.zSersicN_SG AS selected_zSersicN_SG, + dp1.Object.zSersicN_SG_Sigma AS selected_zSersicN_SG_Sigma, + dp1.Object.zE1_SG AS selected_zE1_SG, + dp1.Object.zE1_SG_Sigma AS selected_zE1_SG_Sigma, + dp1.Object.zE2_SG AS selected_zE2_SG, + dp1.Object.zE2_SG_Sigma AS selected_zE2_SG_Sigma, + dp1.Object.zRadius_SG AS selected_zRadius_SG, + dp1.Object.zRadius_SG_Sigma AS selected_zRadius_SG_Sigma, + dp1.Object.zFlags AS selected_zFlags, + dp1.Object.yNumObs AS selected_yNumObs, + dp1.Object.yExtendedness AS selected_yExtendedness, + dp1.Object.yVarProb AS selected_yVarProb, + dp1.Object.yRaOffset_PS AS selected_yRaOffset_PS, + dp1.Object.yRaOffset_PS_Sigma AS selected_yRaOffset_PS_Sigma, + dp1.Object.yDeclOffset_PS AS selected_yDeclOffset_PS, + dp1.Object.yDeclOffset_PS_Sigma AS selected_yDeclOffset_PS_Sigma, + dp1.Object.yRaDeclOffset_PS_Cov AS selected_yRaDeclOffset_PS_Cov, + dp1.Object.yRaOffset_SG AS selected_yRaOffset_SG, + dp1.Object.yRaOffset_SG_Sigma AS selected_yRaOffset_SG_Sigma, + dp1.Object.yDeclOffset_SG AS selected_yDeclOffset_SG, + dp1.Object.yDeclOffset_SG_Sigma AS selected_yDeclOffset_SG_Sigma, + dp1.Object.yRaDeclOffset_SG_Cov AS selected_yRaDeclOffset_SG_Cov, + dp1.Object.yLnL_PS AS selected_yLnL_PS, + dp1.Object.yLnL_SG AS selected_yLnL_SG, + dp1.Object.yFlux_PS AS selected_yFlux_PS, + dp1.Object.yFlux_PS_Sigma AS selected_yFlux_PS_Sigma, + dp1.Object.yFlux_ESG AS selected_yFlux_ESG, + dp1.Object.yFlux_ESG_Sigma AS selected_yFlux_ESG_Sigma, + dp1.Object.yFlux_Gaussian AS selected_yFlux_Gaussian, + dp1.Object.yFlux_Gaussian_Sigma AS selected_yFlux_Gaussian_Sigma, + dp1.Object.yTimescale AS selected_yTimescale, + dp1.Object.yEarliestObsTime AS selected_yEarliestObsTime, + dp1.Object.yLatestObsTime AS selected_yLatestObsTime, + dp1.Object.ySersicN_SG AS selected_ySersicN_SG, + dp1.Object.ySersicN_SG_Sigma AS selected_ySersicN_SG_Sigma, + dp1.Object.yE1_SG AS selected_yE1_SG, + dp1.Object.yE1_SG_Sigma AS selected_yE1_SG_Sigma, + dp1.Object.yE2_SG AS selected_yE2_SG, + dp1.Object.yE2_SG_Sigma AS selected_yE2_SG_Sigma, + dp1.Object.yRadius_SG AS selected_yRadius_SG, + dp1.Object.yRadius_SG_Sigma AS selected_yRadius_SG_Sigma, + dp1.Object.yFlags AS selected_yFlags, + dp1.Object.varBinaryField AS selected_varBinaryField, + dp1.Object.chunkId AS selected_chunkId, + dp1.Object.subChunkId AS selected_subChunkId, + (dp1.Object.qserv_trans_id + 0) AS selected_expr_0_qserv_trans_id, + (dp1.Object.objectId + 1) AS selected_expr_1_objectId, + (dp1.Object.iauId + 2) AS selected_expr_2_iauId, + (dp1.Object.ra_PS + 3) AS selected_expr_3_ra_PS, + (dp1.Object.ra_PS_Sigma + 4) AS selected_expr_4_ra_PS_Sigma, + (dp1.Object.decl_PS + 5) AS selected_expr_5_decl_PS, + (dp1.Object.decl_PS_Sigma + 6) AS selected_expr_6_decl_PS_Sigma, + (dp1.Object.radecl_PS_Cov + 7) AS selected_expr_7_radecl_PS_Cov, + (dp1.Object.htmId20 + 8) AS selected_expr_8_htmId20, + (dp1.Object.ra_SG + 9) AS selected_expr_9_ra_SG, + (dp1.Object.ra_SG_Sigma + 10) AS selected_expr_10_ra_SG_Sigma, + (dp1.Object.decl_SG + 11) AS selected_expr_11_decl_SG, + (dp1.Object.decl_SG_Sigma + 12) AS selected_expr_12_decl_SG_Sigma, + (dp1.Object.radecl_SG_Cov + 13) AS selected_expr_13_radecl_SG_Cov, + (dp1.Object.raRange + 14) AS selected_expr_14_raRange, + (dp1.Object.declRange + 15) AS selected_expr_15_declRange, + (dp1.Object.muRa_PS + 16) AS selected_expr_16_muRa_PS, + (dp1.Object.muRa_PS_Sigma + 17) AS selected_expr_17_muRa_PS_Sigma, + (dp1.Object.muDecl_PS + 18) AS selected_expr_18_muDecl_PS, + (dp1.Object.muDecl_PS_Sigma + 19) AS selected_expr_19_muDecl_PS_Sigma, + (dp1.Object.muRaDecl_PS_Cov + 20) AS selected_expr_20_muRaDecl_PS_Cov, + (dp1.Object.parallax_PS + 21) AS selected_expr_21_parallax_PS, + (dp1.Object.parallax_PS_Sigma + 22) AS selected_expr_22_parallax_PS_Sigma, + (dp1.Object.canonicalFilterId + 23) AS selected_expr_23_canonicalFilterId, + (dp1.Object.extendedness + 24) AS selected_expr_24_extendedness, + (dp1.Object.varProb + 25) AS selected_expr_25_varProb, + (dp1.Object.earliestObsTime + 26) AS selected_expr_26_earliestObsTime, + (dp1.Object.latestObsTime + 27) AS selected_expr_27_latestObsTime, + (dp1.Object.meanObsTime + 28) AS selected_expr_28_meanObsTime, + (dp1.Object.flags + 29) AS selected_expr_29_flags, + (dp1.Object.uNumObs + 30) AS selected_expr_30_uNumObs, + (dp1.Object.uExtendedness + 31) AS selected_expr_31_uExtendedness, + (dp1.Object.uVarProb + 32) AS selected_expr_32_uVarProb, + (dp1.Object.uRaOffset_PS + 33) AS selected_expr_33_uRaOffset_PS, + (dp1.Object.uRaOffset_PS_Sigma + 34) AS selected_expr_34_uRaOffset_PS_Sigma, + (dp1.Object.uDeclOffset_PS + 35) AS selected_expr_35_uDeclOffset_PS, + (dp1.Object.uDeclOffset_PS_Sigma + 36) AS selected_expr_36_uDeclOffset_PS_Sigma, + (dp1.Object.uRaDeclOffset_PS_Cov + 37) AS selected_expr_37_uRaDeclOffset_PS_Cov, + (dp1.Object.uRaOffset_SG + 38) AS selected_expr_38_uRaOffset_SG, + (dp1.Object.uRaOffset_SG_Sigma + 39) AS selected_expr_39_uRaOffset_SG_Sigma, + (dp1.Object.uDeclOffset_SG + 40) AS selected_expr_40_uDeclOffset_SG, + (dp1.Object.uDeclOffset_SG_Sigma + 41) AS selected_expr_41_uDeclOffset_SG_Sigma, + (dp1.Object.uRaDeclOffset_SG_Cov + 42) AS selected_expr_42_uRaDeclOffset_SG_Cov, + (dp1.Object.uLnL_PS + 43) AS selected_expr_43_uLnL_PS, + (dp1.Object.uLnL_SG + 44) AS selected_expr_44_uLnL_SG, + (dp1.Object.uFlux_PS + 45) AS selected_expr_45_uFlux_PS, + (dp1.Object.uFlux_PS_Sigma + 46) AS selected_expr_46_uFlux_PS_Sigma, + (dp1.Object.uFlux_ESG + 47) AS selected_expr_47_uFlux_ESG, + (dp1.Object.uFlux_ESG_Sigma + 48) AS selected_expr_48_uFlux_ESG_Sigma, + (dp1.Object.uFlux_Gaussian + 49) AS selected_expr_49_uFlux_Gaussian, + (dp1.Object.uFlux_Gaussian_Sigma + 50) AS selected_expr_50_uFlux_Gaussian_Sigma, + (dp1.Object.uTimescale + 51) AS selected_expr_51_uTimescale, + (dp1.Object.uEarliestObsTime + 52) AS selected_expr_52_uEarliestObsTime, + (dp1.Object.uLatestObsTime + 53) AS selected_expr_53_uLatestObsTime, + (dp1.Object.uSersicN_SG + 54) AS selected_expr_54_uSersicN_SG, + (dp1.Object.uSersicN_SG_Sigma + 55) AS selected_expr_55_uSersicN_SG_Sigma, + (dp1.Object.uE1_SG + 56) AS selected_expr_56_uE1_SG, + (dp1.Object.uE1_SG_Sigma + 57) AS selected_expr_57_uE1_SG_Sigma, + (dp1.Object.uE2_SG + 58) AS selected_expr_58_uE2_SG, + (dp1.Object.uE2_SG_Sigma + 59) AS selected_expr_59_uE2_SG_Sigma, + (dp1.Object.uRadius_SG + 60) AS selected_expr_60_uRadius_SG, + (dp1.Object.uRadius_SG_Sigma + 61) AS selected_expr_61_uRadius_SG_Sigma, + (dp1.Object.uFlags + 62) AS selected_expr_62_uFlags, + (dp1.Object.gNumObs + 63) AS selected_expr_63_gNumObs, + (dp1.Object.gExtendedness + 64) AS selected_expr_64_gExtendedness, + (dp1.Object.gVarProb + 65) AS selected_expr_65_gVarProb, + (dp1.Object.gRaOffset_PS + 66) AS selected_expr_66_gRaOffset_PS, + (dp1.Object.gRaOffset_PS_Sigma + 67) AS selected_expr_67_gRaOffset_PS_Sigma, + (dp1.Object.gDeclOffset_PS + 68) AS selected_expr_68_gDeclOffset_PS, + (dp1.Object.gDeclOffset_PS_Sigma + 69) AS selected_expr_69_gDeclOffset_PS_Sigma, + (dp1.Object.gRaDeclOffset_PS_Cov + 70) AS selected_expr_70_gRaDeclOffset_PS_Cov, + (dp1.Object.gRaOffset_SG + 71) AS selected_expr_71_gRaOffset_SG, + (dp1.Object.gRaOffset_SG_Sigma + 72) AS selected_expr_72_gRaOffset_SG_Sigma, + (dp1.Object.gDeclOffset_SG + 73) AS selected_expr_73_gDeclOffset_SG, + (dp1.Object.gDeclOffset_SG_Sigma + 74) AS selected_expr_74_gDeclOffset_SG_Sigma, + (dp1.Object.gRaDeclOffset_SG_Cov + 75) AS selected_expr_75_gRaDeclOffset_SG_Cov, + (dp1.Object.gLnL_PS + 76) AS selected_expr_76_gLnL_PS, + (dp1.Object.gLnL_SG + 77) AS selected_expr_77_gLnL_SG, + (dp1.Object.gFlux_PS + 78) AS selected_expr_78_gFlux_PS, + (dp1.Object.gFlux_PS_Sigma + 79) AS selected_expr_79_gFlux_PS_Sigma, + (dp1.Object.gFlux_ESG + 80) AS selected_expr_80_gFlux_ESG, + (dp1.Object.gFlux_ESG_Sigma + 81) AS selected_expr_81_gFlux_ESG_Sigma, + (dp1.Object.gFlux_Gaussian + 82) AS selected_expr_82_gFlux_Gaussian, + (dp1.Object.gFlux_Gaussian_Sigma + 83) AS selected_expr_83_gFlux_Gaussian_Sigma, + (dp1.Object.gTimescale + 84) AS selected_expr_84_gTimescale, + (dp1.Object.gEarliestObsTime + 85) AS selected_expr_85_gEarliestObsTime, + (dp1.Object.gLatestObsTime + 86) AS selected_expr_86_gLatestObsTime, + (dp1.Object.gSersicN_SG + 87) AS selected_expr_87_gSersicN_SG, + (dp1.Object.gSersicN_SG_Sigma + 88) AS selected_expr_88_gSersicN_SG_Sigma, + (dp1.Object.gE1_SG + 89) AS selected_expr_89_gE1_SG, + (dp1.Object.gE1_SG_Sigma + 90) AS selected_expr_90_gE1_SG_Sigma, + (dp1.Object.gE2_SG + 91) AS selected_expr_91_gE2_SG, + (dp1.Object.gE2_SG_Sigma + 92) AS selected_expr_92_gE2_SG_Sigma, + (dp1.Object.gRadius_SG + 93) AS selected_expr_93_gRadius_SG, + (dp1.Object.gRadius_SG_Sigma + 94) AS selected_expr_94_gRadius_SG_Sigma, + (dp1.Object.gFlags + 95) AS selected_expr_95_gFlags, + (dp1.Object.rNumObs + 96) AS selected_expr_96_rNumObs, + (dp1.Object.rExtendedness + 97) AS selected_expr_97_rExtendedness, + (dp1.Object.rVarProb + 98) AS selected_expr_98_rVarProb, + (dp1.Object.rRaOffset_PS + 99) AS selected_expr_99_rRaOffset_PS, + (dp1.Object.rRaOffset_PS_Sigma + 100) AS selected_expr_100_rRaOffset_PS_Sigma, + (dp1.Object.rDeclOffset_PS + 101) AS selected_expr_101_rDeclOffset_PS, + (dp1.Object.rDeclOffset_PS_Sigma + 102) AS selected_expr_102_rDeclOffset_PS_Sigma, + (dp1.Object.rRaDeclOffset_PS_Cov + 103) AS selected_expr_103_rRaDeclOffset_PS_Cov, + (dp1.Object.rRaOffset_SG + 104) AS selected_expr_104_rRaOffset_SG, + (dp1.Object.rRaOffset_SG_Sigma + 105) AS selected_expr_105_rRaOffset_SG_Sigma, + (dp1.Object.rDeclOffset_SG + 106) AS selected_expr_106_rDeclOffset_SG, + (dp1.Object.rDeclOffset_SG_Sigma + 107) AS selected_expr_107_rDeclOffset_SG_Sigma, + (dp1.Object.rRaDeclOffset_SG_Cov + 108) AS selected_expr_108_rRaDeclOffset_SG_Cov, + (dp1.Object.rLnL_PS + 109) AS selected_expr_109_rLnL_PS, + (dp1.Object.rLnL_SG + 110) AS selected_expr_110_rLnL_SG, + (dp1.Object.rFlux_PS + 111) AS selected_expr_111_rFlux_PS, + (dp1.Object.rFlux_PS_Sigma + 112) AS selected_expr_112_rFlux_PS_Sigma, + (dp1.Object.rFlux_ESG + 113) AS selected_expr_113_rFlux_ESG, + (dp1.Object.rFlux_ESG_Sigma + 114) AS selected_expr_114_rFlux_ESG_Sigma, + (dp1.Object.rFlux_Gaussian + 115) AS selected_expr_115_rFlux_Gaussian, + (dp1.Object.rFlux_Gaussian_Sigma + 116) AS selected_expr_116_rFlux_Gaussian_Sigma, + (dp1.Object.rTimescale + 117) AS selected_expr_117_rTimescale, + (dp1.Object.rEarliestObsTime + 118) AS selected_expr_118_rEarliestObsTime, + (dp1.Object.rLatestObsTime + 119) AS selected_expr_119_rLatestObsTime, + (dp1.Object.rSersicN_SG + 120) AS selected_expr_120_rSersicN_SG, + (dp1.Object.rSersicN_SG_Sigma + 121) AS selected_expr_121_rSersicN_SG_Sigma, + (dp1.Object.rE1_SG + 122) AS selected_expr_122_rE1_SG, + (dp1.Object.rE1_SG_Sigma + 123) AS selected_expr_123_rE1_SG_Sigma, + (dp1.Object.rE2_SG + 124) AS selected_expr_124_rE2_SG, + (dp1.Object.rE2_SG_Sigma + 125) AS selected_expr_125_rE2_SG_Sigma, + (dp1.Object.rRadius_SG + 126) AS selected_expr_126_rRadius_SG, + (dp1.Object.rRadius_SG_Sigma + 127) AS selected_expr_127_rRadius_SG_Sigma, + (dp1.Object.rFlags + 128) AS selected_expr_128_rFlags, + (dp1.Object.iNumObs + 129) AS selected_expr_129_iNumObs, + (dp1.Object.iExtendedness + 130) AS selected_expr_130_iExtendedness, + (dp1.Object.iVarProb + 131) AS selected_expr_131_iVarProb, + (dp1.Object.iRaOffset_PS + 132) AS selected_expr_132_iRaOffset_PS, + (dp1.Object.iRaOffset_PS_Sigma + 133) AS selected_expr_133_iRaOffset_PS_Sigma, + (dp1.Object.iDeclOffset_PS + 134) AS selected_expr_134_iDeclOffset_PS, + (dp1.Object.iDeclOffset_PS_Sigma + 135) AS selected_expr_135_iDeclOffset_PS_Sigma, + (dp1.Object.iRaDeclOffset_PS_Cov + 136) AS selected_expr_136_iRaDeclOffset_PS_Cov, + (dp1.Object.iRaOffset_SG + 137) AS selected_expr_137_iRaOffset_SG, + (dp1.Object.iRaOffset_SG_Sigma + 138) AS selected_expr_138_iRaOffset_SG_Sigma, + (dp1.Object.iDeclOffset_SG + 139) AS selected_expr_139_iDeclOffset_SG, + (dp1.Object.iDeclOffset_SG_Sigma + 140) AS selected_expr_140_iDeclOffset_SG_Sigma, + (dp1.Object.iRaDeclOffset_SG_Cov + 141) AS selected_expr_141_iRaDeclOffset_SG_Cov, + (dp1.Object.iLnL_PS + 142) AS selected_expr_142_iLnL_PS, + (dp1.Object.iLnL_SG + 143) AS selected_expr_143_iLnL_SG, + (dp1.Object.iFlux_PS + 144) AS selected_expr_144_iFlux_PS, + (dp1.Object.iFlux_PS_Sigma + 145) AS selected_expr_145_iFlux_PS_Sigma, + (dp1.Object.iFlux_ESG + 146) AS selected_expr_146_iFlux_ESG, + (dp1.Object.iFlux_ESG_Sigma + 147) AS selected_expr_147_iFlux_ESG_Sigma, + (dp1.Object.iFlux_Gaussian + 148) AS selected_expr_148_iFlux_Gaussian, + (dp1.Object.iFlux_Gaussian_Sigma + 149) AS selected_expr_149_iFlux_Gaussian_Sigma, + (dp1.Object.iTimescale + 150) AS selected_expr_150_iTimescale, + (dp1.Object.iEarliestObsTime + 151) AS selected_expr_151_iEarliestObsTime, + (dp1.Object.iLatestObsTime + 152) AS selected_expr_152_iLatestObsTime, + (dp1.Object.iSersicN_SG + 153) AS selected_expr_153_iSersicN_SG, + (dp1.Object.iSersicN_SG_Sigma + 154) AS selected_expr_154_iSersicN_SG_Sigma, + (dp1.Object.iE1_SG + 155) AS selected_expr_155_iE1_SG, + (dp1.Object.iE1_SG_Sigma + 156) AS selected_expr_156_iE1_SG_Sigma, + (dp1.Object.iE2_SG + 157) AS selected_expr_157_iE2_SG, + (dp1.Object.iE2_SG_Sigma + 158) AS selected_expr_158_iE2_SG_Sigma, + (dp1.Object.iRadius_SG + 159) AS selected_expr_159_iRadius_SG, + (dp1.Object.iRadius_SG_Sigma + 160) AS selected_expr_160_iRadius_SG_Sigma, + (dp1.Object.iFlags + 161) AS selected_expr_161_iFlags, + (dp1.Object.zNumObs + 162) AS selected_expr_162_zNumObs, + (dp1.Object.zExtendedness + 163) AS selected_expr_163_zExtendedness, + (dp1.Object.zVarProb + 164) AS selected_expr_164_zVarProb, + (dp1.Object.zRaOffset_PS + 165) AS selected_expr_165_zRaOffset_PS, + (dp1.Object.zRaOffset_PS_Sigma + 166) AS selected_expr_166_zRaOffset_PS_Sigma, + (dp1.Object.zDeclOffset_PS + 167) AS selected_expr_167_zDeclOffset_PS, + (dp1.Object.zDeclOffset_PS_Sigma + 168) AS selected_expr_168_zDeclOffset_PS_Sigma, + (dp1.Object.zRaDeclOffset_PS_Cov + 169) AS selected_expr_169_zRaDeclOffset_PS_Cov, + (dp1.Object.zRaOffset_SG + 170) AS selected_expr_170_zRaOffset_SG, + (dp1.Object.zRaOffset_SG_Sigma + 171) AS selected_expr_171_zRaOffset_SG_Sigma, + (dp1.Object.zDeclOffset_SG + 172) AS selected_expr_172_zDeclOffset_SG, + (dp1.Object.zDeclOffset_SG_Sigma + 173) AS selected_expr_173_zDeclOffset_SG_Sigma, + (dp1.Object.zRaDeclOffset_SG_Cov + 174) AS selected_expr_174_zRaDeclOffset_SG_Cov, + (dp1.Object.zLnL_PS + 175) AS selected_expr_175_zLnL_PS, + (dp1.Object.zLnL_SG + 176) AS selected_expr_176_zLnL_SG, + (dp1.Object.zFlux_PS + 177) AS selected_expr_177_zFlux_PS, + (dp1.Object.zFlux_PS_Sigma + 178) AS selected_expr_178_zFlux_PS_Sigma, + (dp1.Object.zFlux_ESG + 179) AS selected_expr_179_zFlux_ESG +FROM dp1.Object +WHERE + (dp1.Object.qserv_trans_id > 0 AND dp1.Object.objectId < 1 AND dp1.Object.iauId >= 2 AND dp1.Object.ra_PS <= 3) + OR (dp1.Object.ra_PS_Sigma > 4 AND dp1.Object.decl_PS < 5 AND dp1.Object.decl_PS_Sigma >= 6 AND dp1.Object.radecl_PS_Cov <= 7) + OR (dp1.Object.htmId20 > 8 AND dp1.Object.ra_SG < 9 AND dp1.Object.ra_SG_Sigma >= 10 AND dp1.Object.decl_SG <= 11) + OR (dp1.Object.decl_SG_Sigma > 12 AND dp1.Object.radecl_SG_Cov < 13 AND dp1.Object.raRange >= 14 AND dp1.Object.declRange <= 15) + OR (dp1.Object.muRa_PS > 16 AND dp1.Object.muRa_PS_Sigma < 17 AND dp1.Object.muDecl_PS >= 18 AND dp1.Object.muDecl_PS_Sigma <= 19) + OR (dp1.Object.muRaDecl_PS_Cov > 20 AND dp1.Object.parallax_PS < 21 AND dp1.Object.parallax_PS_Sigma >= 22 AND dp1.Object.canonicalFilterId <= 23) + OR (dp1.Object.extendedness > 24 AND dp1.Object.varProb < 25 AND dp1.Object.earliestObsTime >= 26 AND dp1.Object.latestObsTime <= 27) + OR (dp1.Object.meanObsTime > 28 AND dp1.Object.flags < 29 AND dp1.Object.uNumObs >= 30 AND dp1.Object.uExtendedness <= 31) + OR (dp1.Object.uVarProb > 32 AND dp1.Object.uRaOffset_PS < 33 AND dp1.Object.uRaOffset_PS_Sigma >= 34 AND dp1.Object.uDeclOffset_PS <= 35) + OR (dp1.Object.uDeclOffset_PS_Sigma > 36 AND dp1.Object.uRaDeclOffset_PS_Cov < 37 AND dp1.Object.uRaOffset_SG >= 38 AND dp1.Object.uRaOffset_SG_Sigma <= 39) + OR (dp1.Object.uDeclOffset_SG > 40 AND dp1.Object.uDeclOffset_SG_Sigma < 41 AND dp1.Object.uRaDeclOffset_SG_Cov >= 42 AND dp1.Object.uLnL_PS <= 43) + OR (dp1.Object.uLnL_SG > 44 AND dp1.Object.uFlux_PS < 45 AND dp1.Object.uFlux_PS_Sigma >= 46 AND dp1.Object.uFlux_ESG <= 47) + OR (dp1.Object.uFlux_ESG_Sigma > 48 AND dp1.Object.uFlux_Gaussian < 49 AND dp1.Object.uFlux_Gaussian_Sigma >= 50 AND dp1.Object.uTimescale <= 51) + OR (dp1.Object.uEarliestObsTime > 52 AND dp1.Object.uLatestObsTime < 53 AND dp1.Object.uSersicN_SG >= 54 AND dp1.Object.uSersicN_SG_Sigma <= 55) + OR (dp1.Object.uE1_SG > 56 AND dp1.Object.uE1_SG_Sigma < 57 AND dp1.Object.uE2_SG >= 58 AND dp1.Object.uE2_SG_Sigma <= 59) + OR (dp1.Object.uRadius_SG > 60 AND dp1.Object.uRadius_SG_Sigma < 61 AND dp1.Object.uFlags >= 62 AND dp1.Object.gNumObs <= 63) + OR (dp1.Object.gExtendedness > 64 AND dp1.Object.gVarProb < 65 AND dp1.Object.gRaOffset_PS >= 66 AND dp1.Object.gRaOffset_PS_Sigma <= 67) + OR (dp1.Object.gDeclOffset_PS > 68 AND dp1.Object.gDeclOffset_PS_Sigma < 69 AND dp1.Object.gRaDeclOffset_PS_Cov >= 70 AND dp1.Object.gRaOffset_SG <= 71) + OR (dp1.Object.gRaOffset_SG_Sigma > 72 AND dp1.Object.gDeclOffset_SG < 73 AND dp1.Object.gDeclOffset_SG_Sigma >= 74 AND dp1.Object.gRaDeclOffset_SG_Cov <= 75) + OR (dp1.Object.gLnL_PS > 76 AND dp1.Object.gLnL_SG < 77 AND dp1.Object.gFlux_PS >= 78 AND dp1.Object.gFlux_PS_Sigma <= 79) + OR (dp1.Object.gFlux_ESG > 80 AND dp1.Object.gFlux_ESG_Sigma < 81 AND dp1.Object.gFlux_Gaussian >= 82 AND dp1.Object.gFlux_Gaussian_Sigma <= 83) + OR (dp1.Object.gTimescale > 84 AND dp1.Object.gEarliestObsTime < 85 AND dp1.Object.gLatestObsTime >= 86 AND dp1.Object.gSersicN_SG <= 87) + OR (dp1.Object.gSersicN_SG_Sigma > 88 AND dp1.Object.gE1_SG < 89 AND dp1.Object.gE1_SG_Sigma >= 90 AND dp1.Object.gE2_SG <= 91) + OR (dp1.Object.gE2_SG_Sigma > 92 AND dp1.Object.gRadius_SG < 93 AND dp1.Object.gRadius_SG_Sigma >= 94 AND dp1.Object.gFlags <= 95) + OR (dp1.Object.rNumObs > 96 AND dp1.Object.rExtendedness < 97 AND dp1.Object.rVarProb >= 98 AND dp1.Object.rRaOffset_PS <= 99) + OR (dp1.Object.rRaOffset_PS_Sigma > 0 AND dp1.Object.rDeclOffset_PS < 1 AND dp1.Object.rDeclOffset_PS_Sigma >= 2 AND dp1.Object.rRaDeclOffset_PS_Cov <= 3) + OR (dp1.Object.rRaOffset_SG > 4 AND dp1.Object.rRaOffset_SG_Sigma < 5 AND dp1.Object.rDeclOffset_SG >= 6 AND dp1.Object.rDeclOffset_SG_Sigma <= 7) + OR (dp1.Object.rRaDeclOffset_SG_Cov > 8 AND dp1.Object.rLnL_PS < 9 AND dp1.Object.rLnL_SG >= 10 AND dp1.Object.rFlux_PS <= 11) + OR (dp1.Object.rFlux_PS_Sigma > 12 AND dp1.Object.rFlux_ESG < 13 AND dp1.Object.rFlux_ESG_Sigma >= 14 AND dp1.Object.rFlux_Gaussian <= 15) + OR (dp1.Object.rFlux_Gaussian_Sigma > 16 AND dp1.Object.rTimescale < 17 AND dp1.Object.rEarliestObsTime >= 18 AND dp1.Object.rLatestObsTime <= 19) + OR (dp1.Object.rSersicN_SG > 20 AND dp1.Object.rSersicN_SG_Sigma < 21 AND dp1.Object.rE1_SG >= 22 AND dp1.Object.rE1_SG_Sigma <= 23) + OR (dp1.Object.rE2_SG > 24 AND dp1.Object.rE2_SG_Sigma < 25 AND dp1.Object.rRadius_SG >= 26 AND dp1.Object.rRadius_SG_Sigma <= 27) + OR (dp1.Object.rFlags > 28 AND dp1.Object.iNumObs < 29 AND dp1.Object.iExtendedness >= 30 AND dp1.Object.iVarProb <= 31) + OR (dp1.Object.iRaOffset_PS > 32 AND dp1.Object.iRaOffset_PS_Sigma < 33 AND dp1.Object.iDeclOffset_PS >= 34 AND dp1.Object.iDeclOffset_PS_Sigma <= 35) + OR (dp1.Object.iRaDeclOffset_PS_Cov > 36 AND dp1.Object.iRaOffset_SG < 37 AND dp1.Object.iRaOffset_SG_Sigma >= 38 AND dp1.Object.iDeclOffset_SG <= 39) + OR (dp1.Object.iDeclOffset_SG_Sigma > 40 AND dp1.Object.iRaDeclOffset_SG_Cov < 41 AND dp1.Object.iLnL_PS >= 42 AND dp1.Object.iLnL_SG <= 43) + OR (dp1.Object.iFlux_PS > 44 AND dp1.Object.iFlux_PS_Sigma < 45 AND dp1.Object.iFlux_ESG >= 46 AND dp1.Object.iFlux_ESG_Sigma <= 47) + OR (dp1.Object.iFlux_Gaussian > 48 AND dp1.Object.iFlux_Gaussian_Sigma < 49 AND dp1.Object.iTimescale >= 50 AND dp1.Object.iEarliestObsTime <= 51) + OR (dp1.Object.iLatestObsTime > 52 AND dp1.Object.iSersicN_SG < 53 AND dp1.Object.iSersicN_SG_Sigma >= 54 AND dp1.Object.iE1_SG <= 55) + OR (dp1.Object.iE1_SG_Sigma > 56 AND dp1.Object.iE2_SG < 57 AND dp1.Object.iE2_SG_Sigma >= 58 AND dp1.Object.iRadius_SG <= 59) + OR (dp1.Object.iRadius_SG_Sigma > 60 AND dp1.Object.iFlags < 61 AND dp1.Object.zNumObs >= 62 AND dp1.Object.zExtendedness <= 63) + OR (dp1.Object.zVarProb > 64 AND dp1.Object.zRaOffset_PS < 65 AND dp1.Object.zRaOffset_PS_Sigma >= 66 AND dp1.Object.zDeclOffset_PS <= 67) + OR (dp1.Object.zDeclOffset_PS_Sigma > 68 AND dp1.Object.zRaDeclOffset_PS_Cov < 69 AND dp1.Object.zRaOffset_SG >= 70 AND dp1.Object.zRaOffset_SG_Sigma <= 71) + OR (dp1.Object.zDeclOffset_SG > 72 AND dp1.Object.zDeclOffset_SG_Sigma < 73 AND dp1.Object.zRaDeclOffset_SG_Cov >= 74 AND dp1.Object.zLnL_PS <= 75) + OR (dp1.Object.zLnL_SG > 76 AND dp1.Object.zFlux_PS < 77 AND dp1.Object.zFlux_PS_Sigma >= 78 AND dp1.Object.zFlux_ESG <= 79) + OR (dp1.Object.zFlux_ESG_Sigma > 80 AND dp1.Object.zFlux_Gaussian < 81 AND dp1.Object.zFlux_Gaussian_Sigma >= 82 AND dp1.Object.zTimescale <= 83) + OR (dp1.Object.zEarliestObsTime > 84 AND dp1.Object.zLatestObsTime < 85 AND dp1.Object.zSersicN_SG >= 86 AND dp1.Object.zSersicN_SG_Sigma <= 87) + OR (dp1.Object.zE1_SG > 88 AND dp1.Object.zE1_SG_Sigma < 89 AND dp1.Object.zE2_SG >= 90 AND dp1.Object.zE2_SG_Sigma <= 91) + OR (dp1.Object.zRadius_SG > 92 AND dp1.Object.zRadius_SG_Sigma < 93 AND dp1.Object.zFlags >= 94 AND dp1.Object.yNumObs <= 95) + OR (dp1.Object.yExtendedness > 96 AND dp1.Object.yVarProb < 97 AND dp1.Object.yRaOffset_PS >= 98 AND dp1.Object.yRaOffset_PS_Sigma <= 99) + OR (dp1.Object.yDeclOffset_PS > 0 AND dp1.Object.yDeclOffset_PS_Sigma < 1 AND dp1.Object.yRaDeclOffset_PS_Cov >= 2 AND dp1.Object.yRaOffset_SG <= 3) + OR (dp1.Object.yRaOffset_SG_Sigma > 4 AND dp1.Object.yDeclOffset_SG < 5 AND dp1.Object.yDeclOffset_SG_Sigma >= 6 AND dp1.Object.yRaDeclOffset_SG_Cov <= 7) + OR (dp1.Object.yLnL_PS > 8 AND dp1.Object.yLnL_SG < 9 AND dp1.Object.yFlux_PS >= 10 AND dp1.Object.yFlux_PS_Sigma <= 11) + OR (dp1.Object.yFlux_ESG > 12 AND dp1.Object.yFlux_ESG_Sigma < 13 AND dp1.Object.yFlux_Gaussian >= 14 AND dp1.Object.yFlux_Gaussian_Sigma <= 15) + OR (dp1.Object.yTimescale > 16 AND dp1.Object.yEarliestObsTime < 17 AND dp1.Object.yLatestObsTime >= 18 AND dp1.Object.ySersicN_SG <= 19) + OR (dp1.Object.ySersicN_SG_Sigma > 20 AND dp1.Object.yE1_SG < 21 AND dp1.Object.yE1_SG_Sigma >= 22 AND dp1.Object.yE2_SG <= 23) + OR (dp1.Object.yE2_SG_Sigma > 24 AND dp1.Object.yRadius_SG < 25 AND dp1.Object.yRadius_SG_Sigma >= 26 AND dp1.Object.yFlags <= 27) + OR (dp1.Object.varBinaryField > 28 AND dp1.Object.chunkId < 29 AND dp1.Object.subChunkId >= 30 AND dp1.Object.qserv_trans_id <= 31) + OR (dp1.Object.objectId > 32 AND dp1.Object.iauId < 33 AND dp1.Object.ra_PS >= 34 AND dp1.Object.ra_PS_Sigma <= 35) + OR (dp1.Object.decl_PS > 36 AND dp1.Object.decl_PS_Sigma < 37 AND dp1.Object.radecl_PS_Cov >= 38 AND dp1.Object.htmId20 <= 39) + OR (dp1.Object.ra_SG > 40 AND dp1.Object.ra_SG_Sigma < 41 AND dp1.Object.decl_SG >= 42 AND dp1.Object.decl_SG_Sigma <= 43) + OR (dp1.Object.radecl_SG_Cov > 44 AND dp1.Object.raRange < 45 AND dp1.Object.declRange >= 46 AND dp1.Object.muRa_PS <= 47) + OR (dp1.Object.muRa_PS_Sigma > 48 AND dp1.Object.muDecl_PS < 49 AND dp1.Object.muDecl_PS_Sigma >= 50 AND dp1.Object.muRaDecl_PS_Cov <= 51) + OR (dp1.Object.parallax_PS > 52 AND dp1.Object.parallax_PS_Sigma < 53 AND dp1.Object.canonicalFilterId >= 54 AND dp1.Object.extendedness <= 55) + OR (dp1.Object.varProb > 56 AND dp1.Object.earliestObsTime < 57 AND dp1.Object.latestObsTime >= 58 AND dp1.Object.meanObsTime <= 59) + OR (dp1.Object.flags > 60 AND dp1.Object.uNumObs < 61 AND dp1.Object.uExtendedness >= 62 AND dp1.Object.uVarProb <= 63) + OR (dp1.Object.uRaOffset_PS > 64 AND dp1.Object.uRaOffset_PS_Sigma < 65 AND dp1.Object.uDeclOffset_PS >= 66 AND dp1.Object.uDeclOffset_PS_Sigma <= 67) + OR (dp1.Object.uRaDeclOffset_PS_Cov > 68 AND dp1.Object.uRaOffset_SG < 69 AND dp1.Object.uRaOffset_SG_Sigma >= 70 AND dp1.Object.uDeclOffset_SG <= 71) + OR (dp1.Object.uDeclOffset_SG_Sigma > 72 AND dp1.Object.uRaDeclOffset_SG_Cov < 73 AND dp1.Object.uLnL_PS >= 74 AND dp1.Object.uLnL_SG <= 75) + OR (dp1.Object.uFlux_PS > 76 AND dp1.Object.uFlux_PS_Sigma < 77 AND dp1.Object.uFlux_ESG >= 78 AND dp1.Object.uFlux_ESG_Sigma <= 79) + OR (dp1.Object.uFlux_Gaussian > 80 AND dp1.Object.uFlux_Gaussian_Sigma < 81 AND dp1.Object.uTimescale >= 82 AND dp1.Object.uEarliestObsTime <= 83) + OR (dp1.Object.uLatestObsTime > 84 AND dp1.Object.uSersicN_SG < 85 AND dp1.Object.uSersicN_SG_Sigma >= 86 AND dp1.Object.uE1_SG <= 87) + OR (dp1.Object.uE1_SG_Sigma > 88 AND dp1.Object.uE2_SG < 89 AND dp1.Object.uE2_SG_Sigma >= 90 AND dp1.Object.uRadius_SG <= 91) + OR (dp1.Object.uRadius_SG_Sigma > 92 AND dp1.Object.uFlags < 93 AND dp1.Object.gNumObs >= 94 AND dp1.Object.gExtendedness <= 95) + OR (dp1.Object.gVarProb > 96 AND dp1.Object.gRaOffset_PS < 97 AND dp1.Object.gRaOffset_PS_Sigma >= 98 AND dp1.Object.gDeclOffset_PS <= 99) + OR (dp1.Object.gDeclOffset_PS_Sigma > 0 AND dp1.Object.gRaDeclOffset_PS_Cov < 1 AND dp1.Object.gRaOffset_SG >= 2 AND dp1.Object.gRaOffset_SG_Sigma <= 3) + OR (dp1.Object.gDeclOffset_SG > 4 AND dp1.Object.gDeclOffset_SG_Sigma < 5 AND dp1.Object.gRaDeclOffset_SG_Cov >= 6 AND dp1.Object.gLnL_PS <= 7) + OR (dp1.Object.gLnL_SG > 8 AND dp1.Object.gFlux_PS < 9 AND dp1.Object.gFlux_PS_Sigma >= 10 AND dp1.Object.gFlux_ESG <= 11) + OR (dp1.Object.gFlux_ESG_Sigma > 12 AND dp1.Object.gFlux_Gaussian < 13 AND dp1.Object.gFlux_Gaussian_Sigma >= 14 AND dp1.Object.gTimescale <= 15) + OR (dp1.Object.gEarliestObsTime > 16 AND dp1.Object.gLatestObsTime < 17 AND dp1.Object.gSersicN_SG >= 18 AND dp1.Object.gSersicN_SG_Sigma <= 19) + OR (dp1.Object.gE1_SG > 20 AND dp1.Object.gE1_SG_Sigma < 21 AND dp1.Object.gE2_SG >= 22 AND dp1.Object.gE2_SG_Sigma <= 23) + OR (dp1.Object.gRadius_SG > 24 AND dp1.Object.gRadius_SG_Sigma < 25 AND dp1.Object.gFlags >= 26 AND dp1.Object.rNumObs <= 27) + OR (dp1.Object.rExtendedness > 28 AND dp1.Object.rVarProb < 29 AND dp1.Object.rRaOffset_PS >= 30 AND dp1.Object.rRaOffset_PS_Sigma <= 31) + OR (dp1.Object.rDeclOffset_PS > 32 AND dp1.Object.rDeclOffset_PS_Sigma < 33 AND dp1.Object.rRaDeclOffset_PS_Cov >= 34 AND dp1.Object.rRaOffset_SG <= 35) + OR (dp1.Object.rRaOffset_SG_Sigma > 36 AND dp1.Object.rDeclOffset_SG < 37 AND dp1.Object.rDeclOffset_SG_Sigma >= 38 AND dp1.Object.rRaDeclOffset_SG_Cov <= 39) + OR (dp1.Object.rLnL_PS > 40 AND dp1.Object.rLnL_SG < 41 AND dp1.Object.rFlux_PS >= 42 AND dp1.Object.rFlux_PS_Sigma <= 43) + OR (dp1.Object.rFlux_ESG > 44 AND dp1.Object.rFlux_ESG_Sigma < 45 AND dp1.Object.rFlux_Gaussian >= 46 AND dp1.Object.rFlux_Gaussian_Sigma <= 47) + OR (dp1.Object.rTimescale > 48 AND dp1.Object.rEarliestObsTime < 49 AND dp1.Object.rLatestObsTime >= 50 AND dp1.Object.rSersicN_SG <= 51) + OR (dp1.Object.rSersicN_SG_Sigma > 52 AND dp1.Object.rE1_SG < 53 AND dp1.Object.rE1_SG_Sigma >= 54 AND dp1.Object.rE2_SG <= 55) + OR (dp1.Object.rE2_SG_Sigma > 56 AND dp1.Object.rRadius_SG < 57 AND dp1.Object.rRadius_SG_Sigma >= 58 AND dp1.Object.rFlags <= 59) diff --git a/src/ccontrol/testdata/parser-corpus/q08_object_source_join_wide.sql b/src/ccontrol/testdata/parser-corpus/q08_object_source_join_wide.sql new file mode 100644 index 0000000000..cb98098b4c --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q08_object_source_join_wide.sql @@ -0,0 +1,610 @@ +SELECT + dp1.Object.qserv_trans_id AS left_qserv_trans_id, + dp1.Object.objectId AS left_objectId, + dp1.Object.iauId AS left_iauId, + dp1.Object.ra_PS AS left_ra_PS, + dp1.Object.ra_PS_Sigma AS left_ra_PS_Sigma, + dp1.Object.decl_PS AS left_decl_PS, + dp1.Object.decl_PS_Sigma AS left_decl_PS_Sigma, + dp1.Object.radecl_PS_Cov AS left_radecl_PS_Cov, + dp1.Object.htmId20 AS left_htmId20, + dp1.Object.ra_SG AS left_ra_SG, + dp1.Object.ra_SG_Sigma AS left_ra_SG_Sigma, + dp1.Object.decl_SG AS left_decl_SG, + dp1.Object.decl_SG_Sigma AS left_decl_SG_Sigma, + dp1.Object.radecl_SG_Cov AS left_radecl_SG_Cov, + dp1.Object.raRange AS left_raRange, + dp1.Object.declRange AS left_declRange, + dp1.Object.muRa_PS AS left_muRa_PS, + dp1.Object.muRa_PS_Sigma AS left_muRa_PS_Sigma, + dp1.Object.muDecl_PS AS left_muDecl_PS, + dp1.Object.muDecl_PS_Sigma AS left_muDecl_PS_Sigma, + dp1.Object.muRaDecl_PS_Cov AS left_muRaDecl_PS_Cov, + dp1.Object.parallax_PS AS left_parallax_PS, + dp1.Object.parallax_PS_Sigma AS left_parallax_PS_Sigma, + dp1.Object.canonicalFilterId AS left_canonicalFilterId, + dp1.Object.extendedness AS left_extendedness, + dp1.Object.varProb AS left_varProb, + dp1.Object.earliestObsTime AS left_earliestObsTime, + dp1.Object.latestObsTime AS left_latestObsTime, + dp1.Object.meanObsTime AS left_meanObsTime, + dp1.Object.flags AS left_flags, + dp1.Object.uNumObs AS left_uNumObs, + dp1.Object.uExtendedness AS left_uExtendedness, + dp1.Object.uVarProb AS left_uVarProb, + dp1.Object.uRaOffset_PS AS left_uRaOffset_PS, + dp1.Object.uRaOffset_PS_Sigma AS left_uRaOffset_PS_Sigma, + dp1.Object.uDeclOffset_PS AS left_uDeclOffset_PS, + dp1.Object.uDeclOffset_PS_Sigma AS left_uDeclOffset_PS_Sigma, + dp1.Object.uRaDeclOffset_PS_Cov AS left_uRaDeclOffset_PS_Cov, + dp1.Object.uRaOffset_SG AS left_uRaOffset_SG, + dp1.Object.uRaOffset_SG_Sigma AS left_uRaOffset_SG_Sigma, + dp1.Object.uDeclOffset_SG AS left_uDeclOffset_SG, + dp1.Object.uDeclOffset_SG_Sigma AS left_uDeclOffset_SG_Sigma, + dp1.Object.uRaDeclOffset_SG_Cov AS left_uRaDeclOffset_SG_Cov, + dp1.Object.uLnL_PS AS left_uLnL_PS, + dp1.Object.uLnL_SG AS left_uLnL_SG, + dp1.Object.uFlux_PS AS left_uFlux_PS, + dp1.Object.uFlux_PS_Sigma AS left_uFlux_PS_Sigma, + dp1.Object.uFlux_ESG AS left_uFlux_ESG, + dp1.Object.uFlux_ESG_Sigma AS left_uFlux_ESG_Sigma, + dp1.Object.uFlux_Gaussian AS left_uFlux_Gaussian, + dp1.Object.uFlux_Gaussian_Sigma AS left_uFlux_Gaussian_Sigma, + dp1.Object.uTimescale AS left_uTimescale, + dp1.Object.uEarliestObsTime AS left_uEarliestObsTime, + dp1.Object.uLatestObsTime AS left_uLatestObsTime, + dp1.Object.uSersicN_SG AS left_uSersicN_SG, + dp1.Object.uSersicN_SG_Sigma AS left_uSersicN_SG_Sigma, + dp1.Object.uE1_SG AS left_uE1_SG, + dp1.Object.uE1_SG_Sigma AS left_uE1_SG_Sigma, + dp1.Object.uE2_SG AS left_uE2_SG, + dp1.Object.uE2_SG_Sigma AS left_uE2_SG_Sigma, + dp1.Object.uRadius_SG AS left_uRadius_SG, + dp1.Object.uRadius_SG_Sigma AS left_uRadius_SG_Sigma, + dp1.Object.uFlags AS left_uFlags, + dp1.Object.gNumObs AS left_gNumObs, + dp1.Object.gExtendedness AS left_gExtendedness, + dp1.Object.gVarProb AS left_gVarProb, + dp1.Object.gRaOffset_PS AS left_gRaOffset_PS, + dp1.Object.gRaOffset_PS_Sigma AS left_gRaOffset_PS_Sigma, + dp1.Object.gDeclOffset_PS AS left_gDeclOffset_PS, + dp1.Object.gDeclOffset_PS_Sigma AS left_gDeclOffset_PS_Sigma, + dp1.Object.gRaDeclOffset_PS_Cov AS left_gRaDeclOffset_PS_Cov, + dp1.Object.gRaOffset_SG AS left_gRaOffset_SG, + dp1.Object.gRaOffset_SG_Sigma AS left_gRaOffset_SG_Sigma, + dp1.Object.gDeclOffset_SG AS left_gDeclOffset_SG, + dp1.Object.gDeclOffset_SG_Sigma AS left_gDeclOffset_SG_Sigma, + dp1.Object.gRaDeclOffset_SG_Cov AS left_gRaDeclOffset_SG_Cov, + dp1.Object.gLnL_PS AS left_gLnL_PS, + dp1.Object.gLnL_SG AS left_gLnL_SG, + dp1.Object.gFlux_PS AS left_gFlux_PS, + dp1.Object.gFlux_PS_Sigma AS left_gFlux_PS_Sigma, + dp1.Object.gFlux_ESG AS left_gFlux_ESG, + dp1.Object.gFlux_ESG_Sigma AS left_gFlux_ESG_Sigma, + dp1.Object.gFlux_Gaussian AS left_gFlux_Gaussian, + dp1.Object.gFlux_Gaussian_Sigma AS left_gFlux_Gaussian_Sigma, + dp1.Object.gTimescale AS left_gTimescale, + dp1.Object.gEarliestObsTime AS left_gEarliestObsTime, + dp1.Object.gLatestObsTime AS left_gLatestObsTime, + dp1.Object.gSersicN_SG AS left_gSersicN_SG, + dp1.Object.gSersicN_SG_Sigma AS left_gSersicN_SG_Sigma, + dp1.Object.gE1_SG AS left_gE1_SG, + dp1.Object.gE1_SG_Sigma AS left_gE1_SG_Sigma, + dp1.Object.gE2_SG AS left_gE2_SG, + dp1.Object.gE2_SG_Sigma AS left_gE2_SG_Sigma, + dp1.Object.gRadius_SG AS left_gRadius_SG, + dp1.Object.gRadius_SG_Sigma AS left_gRadius_SG_Sigma, + dp1.Object.gFlags AS left_gFlags, + dp1.Object.rNumObs AS left_rNumObs, + dp1.Object.rExtendedness AS left_rExtendedness, + dp1.Object.rVarProb AS left_rVarProb, + dp1.Object.rRaOffset_PS AS left_rRaOffset_PS, + dp1.Object.rRaOffset_PS_Sigma AS left_rRaOffset_PS_Sigma, + dp1.Object.rDeclOffset_PS AS left_rDeclOffset_PS, + dp1.Object.rDeclOffset_PS_Sigma AS left_rDeclOffset_PS_Sigma, + dp1.Object.rRaDeclOffset_PS_Cov AS left_rRaDeclOffset_PS_Cov, + dp1.Object.rRaOffset_SG AS left_rRaOffset_SG, + dp1.Object.rRaOffset_SG_Sigma AS left_rRaOffset_SG_Sigma, + dp1.Object.rDeclOffset_SG AS left_rDeclOffset_SG, + dp1.Object.rDeclOffset_SG_Sigma AS left_rDeclOffset_SG_Sigma, + dp1.Object.rRaDeclOffset_SG_Cov AS left_rRaDeclOffset_SG_Cov, + dp1.Object.rLnL_PS AS left_rLnL_PS, + dp1.Object.rLnL_SG AS left_rLnL_SG, + dp1.Object.rFlux_PS AS left_rFlux_PS, + dp1.Object.rFlux_PS_Sigma AS left_rFlux_PS_Sigma, + dp1.Object.rFlux_ESG AS left_rFlux_ESG, + dp1.Object.rFlux_ESG_Sigma AS left_rFlux_ESG_Sigma, + dp1.Object.rFlux_Gaussian AS left_rFlux_Gaussian, + dp1.Object.rFlux_Gaussian_Sigma AS left_rFlux_Gaussian_Sigma, + dp1.Object.rTimescale AS left_rTimescale, + dp1.Object.rEarliestObsTime AS left_rEarliestObsTime, + dp1.Object.rLatestObsTime AS left_rLatestObsTime, + dp1.Object.rSersicN_SG AS left_rSersicN_SG, + dp1.Object.rSersicN_SG_Sigma AS left_rSersicN_SG_Sigma, + dp1.Object.rE1_SG AS left_rE1_SG, + dp1.Object.rE1_SG_Sigma AS left_rE1_SG_Sigma, + dp1.Object.rE2_SG AS left_rE2_SG, + dp1.Object.rE2_SG_Sigma AS left_rE2_SG_Sigma, + dp1.Object.rRadius_SG AS left_rRadius_SG, + dp1.Object.rRadius_SG_Sigma AS left_rRadius_SG_Sigma, + dp1.Object.rFlags AS left_rFlags, + dp1.Object.iNumObs AS left_iNumObs, + dp1.Object.iExtendedness AS left_iExtendedness, + dp1.Object.iVarProb AS left_iVarProb, + dp1.Object.iRaOffset_PS AS left_iRaOffset_PS, + dp1.Object.iRaOffset_PS_Sigma AS left_iRaOffset_PS_Sigma, + dp1.Object.iDeclOffset_PS AS left_iDeclOffset_PS, + dp1.Object.iDeclOffset_PS_Sigma AS left_iDeclOffset_PS_Sigma, + dp1.Object.iRaDeclOffset_PS_Cov AS left_iRaDeclOffset_PS_Cov, + dp1.Object.iRaOffset_SG AS left_iRaOffset_SG, + dp1.Object.iRaOffset_SG_Sigma AS left_iRaOffset_SG_Sigma, + dp1.Object.iDeclOffset_SG AS left_iDeclOffset_SG, + dp1.Object.iDeclOffset_SG_Sigma AS left_iDeclOffset_SG_Sigma, + dp1.Object.iRaDeclOffset_SG_Cov AS left_iRaDeclOffset_SG_Cov, + dp1.Object.iLnL_PS AS left_iLnL_PS, + dp1.Object.iLnL_SG AS left_iLnL_SG, + dp1.Object.iFlux_PS AS left_iFlux_PS, + dp1.Object.iFlux_PS_Sigma AS left_iFlux_PS_Sigma, + dp1.Object.iFlux_ESG AS left_iFlux_ESG, + dp1.Object.iFlux_ESG_Sigma AS left_iFlux_ESG_Sigma, + dp1.Object.iFlux_Gaussian AS left_iFlux_Gaussian, + dp1.Object.iFlux_Gaussian_Sigma AS left_iFlux_Gaussian_Sigma, + dp1.Object.iTimescale AS left_iTimescale, + dp1.Object.iEarliestObsTime AS left_iEarliestObsTime, + dp1.Object.iLatestObsTime AS left_iLatestObsTime, + dp1.Object.iSersicN_SG AS left_iSersicN_SG, + dp1.Object.iSersicN_SG_Sigma AS left_iSersicN_SG_Sigma, + dp1.Object.iE1_SG AS left_iE1_SG, + dp1.Object.iE1_SG_Sigma AS left_iE1_SG_Sigma, + dp1.Object.iE2_SG AS left_iE2_SG, + dp1.Object.iE2_SG_Sigma AS left_iE2_SG_Sigma, + dp1.Object.iRadius_SG AS left_iRadius_SG, + dp1.Object.iRadius_SG_Sigma AS left_iRadius_SG_Sigma, + dp1.Object.iFlags AS left_iFlags, + dp1.Object.zNumObs AS left_zNumObs, + dp1.Object.zExtendedness AS left_zExtendedness, + dp1.Object.zVarProb AS left_zVarProb, + dp1.Object.zRaOffset_PS AS left_zRaOffset_PS, + dp1.Object.zRaOffset_PS_Sigma AS left_zRaOffset_PS_Sigma, + dp1.Object.zDeclOffset_PS AS left_zDeclOffset_PS, + dp1.Object.zDeclOffset_PS_Sigma AS left_zDeclOffset_PS_Sigma, + dp1.Object.zRaDeclOffset_PS_Cov AS left_zRaDeclOffset_PS_Cov, + dp1.Object.zRaOffset_SG AS left_zRaOffset_SG, + dp1.Object.zRaOffset_SG_Sigma AS left_zRaOffset_SG_Sigma, + dp1.Object.zDeclOffset_SG AS left_zDeclOffset_SG, + dp1.Object.zDeclOffset_SG_Sigma AS left_zDeclOffset_SG_Sigma, + dp1.Object.zRaDeclOffset_SG_Cov AS left_zRaDeclOffset_SG_Cov, + dp1.Object.zLnL_PS AS left_zLnL_PS, + dp1.Object.zLnL_SG AS left_zLnL_SG, + dp1.Object.zFlux_PS AS left_zFlux_PS, + dp1.Object.zFlux_PS_Sigma AS left_zFlux_PS_Sigma, + dp1.Object.zFlux_ESG AS left_zFlux_ESG, + dp1.Object.zFlux_ESG_Sigma AS left_zFlux_ESG_Sigma, + dp1.Object.zFlux_Gaussian AS left_zFlux_Gaussian, + dp1.Object.zFlux_Gaussian_Sigma AS left_zFlux_Gaussian_Sigma, + dp1.Object.zTimescale AS left_zTimescale, + dp1.Object.zEarliestObsTime AS left_zEarliestObsTime, + dp1.Object.zLatestObsTime AS left_zLatestObsTime, + dp1.Object.zSersicN_SG AS left_zSersicN_SG, + dp1.Object.zSersicN_SG_Sigma AS left_zSersicN_SG_Sigma, + dp1.Object.zE1_SG AS left_zE1_SG, + dp1.Object.zE1_SG_Sigma AS left_zE1_SG_Sigma, + dp1.Object.zE2_SG AS left_zE2_SG, + dp1.Object.zE2_SG_Sigma AS left_zE2_SG_Sigma, + dp1.Object.zRadius_SG AS left_zRadius_SG, + dp1.Object.zRadius_SG_Sigma AS left_zRadius_SG_Sigma, + dp1.Object.zFlags AS left_zFlags, + dp1.Object.yNumObs AS left_yNumObs, + dp1.Object.yExtendedness AS left_yExtendedness, + dp1.Object.yVarProb AS left_yVarProb, + dp1.Object.yRaOffset_PS AS left_yRaOffset_PS, + dp1.Object.yRaOffset_PS_Sigma AS left_yRaOffset_PS_Sigma, + dp1.Object.yDeclOffset_PS AS left_yDeclOffset_PS, + dp1.Object.yDeclOffset_PS_Sigma AS left_yDeclOffset_PS_Sigma, + dp1.Object.yRaDeclOffset_PS_Cov AS left_yRaDeclOffset_PS_Cov, + dp1.Object.yRaOffset_SG AS left_yRaOffset_SG, + dp1.Object.yRaOffset_SG_Sigma AS left_yRaOffset_SG_Sigma, + dp1.Object.yDeclOffset_SG AS left_yDeclOffset_SG, + dp1.Object.yDeclOffset_SG_Sigma AS left_yDeclOffset_SG_Sigma, + dp1.Object.yRaDeclOffset_SG_Cov AS left_yRaDeclOffset_SG_Cov, + dp1.Object.yLnL_PS AS left_yLnL_PS, + dp1.Object.yLnL_SG AS left_yLnL_SG, + dp1.Object.yFlux_PS AS left_yFlux_PS, + dp1.Object.yFlux_PS_Sigma AS left_yFlux_PS_Sigma, + dp1.Object.yFlux_ESG AS left_yFlux_ESG, + dp1.Object.yFlux_ESG_Sigma AS left_yFlux_ESG_Sigma, + dp1.Object.yFlux_Gaussian AS left_yFlux_Gaussian, + dp1.Object.yFlux_Gaussian_Sigma AS left_yFlux_Gaussian_Sigma, + dp1.Object.yTimescale AS left_yTimescale, + dp1.Object.yEarliestObsTime AS left_yEarliestObsTime, + dp1.Object.yLatestObsTime AS left_yLatestObsTime, + dp1.Object.ySersicN_SG AS left_ySersicN_SG, + dp1.Object.ySersicN_SG_Sigma AS left_ySersicN_SG_Sigma, + dp1.Object.yE1_SG AS left_yE1_SG, + dp1.Object.yE1_SG_Sigma AS left_yE1_SG_Sigma, + dp1.Object.yE2_SG AS left_yE2_SG, + dp1.Object.yE2_SG_Sigma AS left_yE2_SG_Sigma, + dp1.Object.yRadius_SG AS left_yRadius_SG, + dp1.Object.yRadius_SG_Sigma AS left_yRadius_SG_Sigma, + dp1.Object.yFlags AS left_yFlags, + dp1.Object.varBinaryField AS left_varBinaryField, + dp1.Object.chunkId AS left_chunkId, + dp1.Object.subChunkId AS left_subChunkId, + dp1.Source.qserv_trans_id AS right_qserv_trans_id, + dp1.Source.objectId AS right_objectId, + dp1.Source.iauId AS right_iauId, + dp1.Source.ra_PS AS right_ra_PS, + dp1.Source.ra_PS_Sigma AS right_ra_PS_Sigma, + dp1.Source.decl_PS AS right_decl_PS, + dp1.Source.decl_PS_Sigma AS right_decl_PS_Sigma, + dp1.Source.radecl_PS_Cov AS right_radecl_PS_Cov, + dp1.Source.htmId20 AS right_htmId20, + dp1.Source.ra_SG AS right_ra_SG, + dp1.Source.ra_SG_Sigma AS right_ra_SG_Sigma, + dp1.Source.decl_SG AS right_decl_SG, + dp1.Source.decl_SG_Sigma AS right_decl_SG_Sigma, + dp1.Source.radecl_SG_Cov AS right_radecl_SG_Cov, + dp1.Source.raRange AS right_raRange, + dp1.Source.declRange AS right_declRange, + dp1.Source.muRa_PS AS right_muRa_PS, + dp1.Source.muRa_PS_Sigma AS right_muRa_PS_Sigma, + dp1.Source.muDecl_PS AS right_muDecl_PS, + dp1.Source.muDecl_PS_Sigma AS right_muDecl_PS_Sigma, + dp1.Source.muRaDecl_PS_Cov AS right_muRaDecl_PS_Cov, + dp1.Source.parallax_PS AS right_parallax_PS, + dp1.Source.parallax_PS_Sigma AS right_parallax_PS_Sigma, + dp1.Source.canonicalFilterId AS right_canonicalFilterId, + dp1.Source.extendedness AS right_extendedness, + dp1.Source.varProb AS right_varProb, + dp1.Source.earliestObsTime AS right_earliestObsTime, + dp1.Source.latestObsTime AS right_latestObsTime, + dp1.Source.meanObsTime AS right_meanObsTime, + dp1.Source.flags AS right_flags, + dp1.Source.uNumObs AS right_uNumObs, + dp1.Source.uExtendedness AS right_uExtendedness, + dp1.Source.uVarProb AS right_uVarProb, + dp1.Source.uRaOffset_PS AS right_uRaOffset_PS, + dp1.Source.uRaOffset_PS_Sigma AS right_uRaOffset_PS_Sigma, + dp1.Source.uDeclOffset_PS AS right_uDeclOffset_PS, + dp1.Source.uDeclOffset_PS_Sigma AS right_uDeclOffset_PS_Sigma, + dp1.Source.uRaDeclOffset_PS_Cov AS right_uRaDeclOffset_PS_Cov, + dp1.Source.uRaOffset_SG AS right_uRaOffset_SG, + dp1.Source.uRaOffset_SG_Sigma AS right_uRaOffset_SG_Sigma, + dp1.Source.uDeclOffset_SG AS right_uDeclOffset_SG, + dp1.Source.uDeclOffset_SG_Sigma AS right_uDeclOffset_SG_Sigma, + dp1.Source.uRaDeclOffset_SG_Cov AS right_uRaDeclOffset_SG_Cov, + dp1.Source.uLnL_PS AS right_uLnL_PS, + dp1.Source.uLnL_SG AS right_uLnL_SG, + dp1.Source.uFlux_PS AS right_uFlux_PS, + dp1.Source.uFlux_PS_Sigma AS right_uFlux_PS_Sigma, + dp1.Source.uFlux_ESG AS right_uFlux_ESG, + dp1.Source.uFlux_ESG_Sigma AS right_uFlux_ESG_Sigma, + dp1.Source.uFlux_Gaussian AS right_uFlux_Gaussian, + dp1.Source.uFlux_Gaussian_Sigma AS right_uFlux_Gaussian_Sigma, + dp1.Source.uTimescale AS right_uTimescale, + dp1.Source.uEarliestObsTime AS right_uEarliestObsTime, + dp1.Source.uLatestObsTime AS right_uLatestObsTime, + dp1.Source.uSersicN_SG AS right_uSersicN_SG, + dp1.Source.uSersicN_SG_Sigma AS right_uSersicN_SG_Sigma, + dp1.Source.uE1_SG AS right_uE1_SG, + dp1.Source.uE1_SG_Sigma AS right_uE1_SG_Sigma, + dp1.Source.uE2_SG AS right_uE2_SG, + dp1.Source.uE2_SG_Sigma AS right_uE2_SG_Sigma, + dp1.Source.uRadius_SG AS right_uRadius_SG, + dp1.Source.uRadius_SG_Sigma AS right_uRadius_SG_Sigma, + dp1.Source.uFlags AS right_uFlags, + dp1.Source.gNumObs AS right_gNumObs, + dp1.Source.gExtendedness AS right_gExtendedness, + dp1.Source.gVarProb AS right_gVarProb, + dp1.Source.gRaOffset_PS AS right_gRaOffset_PS, + dp1.Source.gRaOffset_PS_Sigma AS right_gRaOffset_PS_Sigma, + dp1.Source.gDeclOffset_PS AS right_gDeclOffset_PS, + dp1.Source.gDeclOffset_PS_Sigma AS right_gDeclOffset_PS_Sigma, + dp1.Source.gRaDeclOffset_PS_Cov AS right_gRaDeclOffset_PS_Cov, + dp1.Source.gRaOffset_SG AS right_gRaOffset_SG, + dp1.Source.gRaOffset_SG_Sigma AS right_gRaOffset_SG_Sigma, + dp1.Source.gDeclOffset_SG AS right_gDeclOffset_SG, + dp1.Source.gDeclOffset_SG_Sigma AS right_gDeclOffset_SG_Sigma, + dp1.Source.gRaDeclOffset_SG_Cov AS right_gRaDeclOffset_SG_Cov, + dp1.Source.gLnL_PS AS right_gLnL_PS, + dp1.Source.gLnL_SG AS right_gLnL_SG, + dp1.Source.gFlux_PS AS right_gFlux_PS, + dp1.Source.gFlux_PS_Sigma AS right_gFlux_PS_Sigma, + dp1.Source.gFlux_ESG AS right_gFlux_ESG, + dp1.Source.gFlux_ESG_Sigma AS right_gFlux_ESG_Sigma, + dp1.Source.gFlux_Gaussian AS right_gFlux_Gaussian, + dp1.Source.gFlux_Gaussian_Sigma AS right_gFlux_Gaussian_Sigma, + dp1.Source.gTimescale AS right_gTimescale, + dp1.Source.gEarliestObsTime AS right_gEarliestObsTime, + dp1.Source.gLatestObsTime AS right_gLatestObsTime, + dp1.Source.gSersicN_SG AS right_gSersicN_SG, + dp1.Source.gSersicN_SG_Sigma AS right_gSersicN_SG_Sigma, + dp1.Source.gE1_SG AS right_gE1_SG, + dp1.Source.gE1_SG_Sigma AS right_gE1_SG_Sigma, + dp1.Source.gE2_SG AS right_gE2_SG, + dp1.Source.gE2_SG_Sigma AS right_gE2_SG_Sigma, + dp1.Source.gRadius_SG AS right_gRadius_SG, + dp1.Source.gRadius_SG_Sigma AS right_gRadius_SG_Sigma, + dp1.Source.gFlags AS right_gFlags, + dp1.Source.rNumObs AS right_rNumObs, + dp1.Source.rExtendedness AS right_rExtendedness, + dp1.Source.rVarProb AS right_rVarProb, + dp1.Source.rRaOffset_PS AS right_rRaOffset_PS, + dp1.Source.rRaOffset_PS_Sigma AS right_rRaOffset_PS_Sigma, + dp1.Source.rDeclOffset_PS AS right_rDeclOffset_PS, + dp1.Source.rDeclOffset_PS_Sigma AS right_rDeclOffset_PS_Sigma, + dp1.Source.rRaDeclOffset_PS_Cov AS right_rRaDeclOffset_PS_Cov, + dp1.Source.rRaOffset_SG AS right_rRaOffset_SG, + dp1.Source.rRaOffset_SG_Sigma AS right_rRaOffset_SG_Sigma, + dp1.Source.rDeclOffset_SG AS right_rDeclOffset_SG, + dp1.Source.rDeclOffset_SG_Sigma AS right_rDeclOffset_SG_Sigma, + dp1.Source.rRaDeclOffset_SG_Cov AS right_rRaDeclOffset_SG_Cov, + dp1.Source.rLnL_PS AS right_rLnL_PS, + dp1.Source.rLnL_SG AS right_rLnL_SG, + dp1.Source.rFlux_PS AS right_rFlux_PS, + dp1.Source.rFlux_PS_Sigma AS right_rFlux_PS_Sigma, + dp1.Source.rFlux_ESG AS right_rFlux_ESG, + dp1.Source.rFlux_ESG_Sigma AS right_rFlux_ESG_Sigma, + dp1.Source.rFlux_Gaussian AS right_rFlux_Gaussian, + dp1.Source.rFlux_Gaussian_Sigma AS right_rFlux_Gaussian_Sigma, + dp1.Source.rTimescale AS right_rTimescale, + dp1.Source.rEarliestObsTime AS right_rEarliestObsTime, + dp1.Source.rLatestObsTime AS right_rLatestObsTime, + dp1.Source.rSersicN_SG AS right_rSersicN_SG, + dp1.Source.rSersicN_SG_Sigma AS right_rSersicN_SG_Sigma, + dp1.Source.rE1_SG AS right_rE1_SG, + dp1.Source.rE1_SG_Sigma AS right_rE1_SG_Sigma, + dp1.Source.rE2_SG AS right_rE2_SG, + dp1.Source.rE2_SG_Sigma AS right_rE2_SG_Sigma, + dp1.Source.rRadius_SG AS right_rRadius_SG, + dp1.Source.rRadius_SG_Sigma AS right_rRadius_SG_Sigma, + dp1.Source.rFlags AS right_rFlags, + dp1.Source.iNumObs AS right_iNumObs, + dp1.Source.iExtendedness AS right_iExtendedness, + dp1.Source.iVarProb AS right_iVarProb, + dp1.Source.iRaOffset_PS AS right_iRaOffset_PS, + dp1.Source.iRaOffset_PS_Sigma AS right_iRaOffset_PS_Sigma, + dp1.Source.iDeclOffset_PS AS right_iDeclOffset_PS, + dp1.Source.iDeclOffset_PS_Sigma AS right_iDeclOffset_PS_Sigma, + dp1.Source.iRaDeclOffset_PS_Cov AS right_iRaDeclOffset_PS_Cov, + dp1.Source.iRaOffset_SG AS right_iRaOffset_SG, + dp1.Source.iRaOffset_SG_Sigma AS right_iRaOffset_SG_Sigma, + dp1.Source.iDeclOffset_SG AS right_iDeclOffset_SG, + dp1.Source.iDeclOffset_SG_Sigma AS right_iDeclOffset_SG_Sigma, + dp1.Source.iRaDeclOffset_SG_Cov AS right_iRaDeclOffset_SG_Cov, + dp1.Source.iLnL_PS AS right_iLnL_PS, + dp1.Source.iLnL_SG AS right_iLnL_SG, + dp1.Source.iFlux_PS AS right_iFlux_PS, + dp1.Source.iFlux_PS_Sigma AS right_iFlux_PS_Sigma, + dp1.Source.iFlux_ESG AS right_iFlux_ESG, + dp1.Source.iFlux_ESG_Sigma AS right_iFlux_ESG_Sigma, + dp1.Source.iFlux_Gaussian AS right_iFlux_Gaussian, + dp1.Source.iFlux_Gaussian_Sigma AS right_iFlux_Gaussian_Sigma, + dp1.Source.iTimescale AS right_iTimescale, + dp1.Source.iEarliestObsTime AS right_iEarliestObsTime, + dp1.Source.iLatestObsTime AS right_iLatestObsTime, + dp1.Source.iSersicN_SG AS right_iSersicN_SG, + dp1.Source.iSersicN_SG_Sigma AS right_iSersicN_SG_Sigma, + dp1.Source.iE1_SG AS right_iE1_SG, + dp1.Source.iE1_SG_Sigma AS right_iE1_SG_Sigma, + dp1.Source.iE2_SG AS right_iE2_SG, + dp1.Source.iE2_SG_Sigma AS right_iE2_SG_Sigma, + dp1.Source.iRadius_SG AS right_iRadius_SG, + dp1.Source.iRadius_SG_Sigma AS right_iRadius_SG_Sigma, + dp1.Source.iFlags AS right_iFlags, + dp1.Source.zNumObs AS right_zNumObs, + dp1.Source.zExtendedness AS right_zExtendedness, + dp1.Source.zVarProb AS right_zVarProb, + dp1.Source.zRaOffset_PS AS right_zRaOffset_PS, + dp1.Source.zRaOffset_PS_Sigma AS right_zRaOffset_PS_Sigma, + dp1.Source.zDeclOffset_PS AS right_zDeclOffset_PS, + dp1.Source.zDeclOffset_PS_Sigma AS right_zDeclOffset_PS_Sigma, + dp1.Source.zRaDeclOffset_PS_Cov AS right_zRaDeclOffset_PS_Cov, + dp1.Source.zRaOffset_SG AS right_zRaOffset_SG, + dp1.Source.zRaOffset_SG_Sigma AS right_zRaOffset_SG_Sigma, + dp1.Source.zDeclOffset_SG AS right_zDeclOffset_SG, + dp1.Source.zDeclOffset_SG_Sigma AS right_zDeclOffset_SG_Sigma, + dp1.Source.zRaDeclOffset_SG_Cov AS right_zRaDeclOffset_SG_Cov, + dp1.Source.zLnL_PS AS right_zLnL_PS, + dp1.Source.zLnL_SG AS right_zLnL_SG, + dp1.Source.zFlux_PS AS right_zFlux_PS, + dp1.Source.zFlux_PS_Sigma AS right_zFlux_PS_Sigma, + dp1.Source.zFlux_ESG AS right_zFlux_ESG, + dp1.Source.zFlux_ESG_Sigma AS right_zFlux_ESG_Sigma, + dp1.Source.zFlux_Gaussian AS right_zFlux_Gaussian, + dp1.Source.zFlux_Gaussian_Sigma AS right_zFlux_Gaussian_Sigma, + dp1.Source.zTimescale AS right_zTimescale, + dp1.Source.zEarliestObsTime AS right_zEarliestObsTime, + dp1.Source.zLatestObsTime AS right_zLatestObsTime, + dp1.Source.zSersicN_SG AS right_zSersicN_SG, + dp1.Source.zSersicN_SG_Sigma AS right_zSersicN_SG_Sigma, + dp1.Source.zE1_SG AS right_zE1_SG, + dp1.Source.zE1_SG_Sigma AS right_zE1_SG_Sigma, + dp1.Source.zE2_SG AS right_zE2_SG, + dp1.Source.zE2_SG_Sigma AS right_zE2_SG_Sigma, + dp1.Source.zRadius_SG AS right_zRadius_SG, + dp1.Source.zRadius_SG_Sigma AS right_zRadius_SG_Sigma, + dp1.Source.zFlags AS right_zFlags, + dp1.Source.yNumObs AS right_yNumObs, + dp1.Source.yExtendedness AS right_yExtendedness, + dp1.Source.yVarProb AS right_yVarProb, + dp1.Source.yRaOffset_PS AS right_yRaOffset_PS, + dp1.Source.yRaOffset_PS_Sigma AS right_yRaOffset_PS_Sigma, + dp1.Source.yDeclOffset_PS AS right_yDeclOffset_PS, + dp1.Source.yDeclOffset_PS_Sigma AS right_yDeclOffset_PS_Sigma, + dp1.Source.yRaDeclOffset_PS_Cov AS right_yRaDeclOffset_PS_Cov, + dp1.Source.yRaOffset_SG AS right_yRaOffset_SG, + dp1.Source.yRaOffset_SG_Sigma AS right_yRaOffset_SG_Sigma, + dp1.Source.yDeclOffset_SG AS right_yDeclOffset_SG, + dp1.Source.yDeclOffset_SG_Sigma AS right_yDeclOffset_SG_Sigma, + dp1.Source.yRaDeclOffset_SG_Cov AS right_yRaDeclOffset_SG_Cov, + dp1.Source.yLnL_PS AS right_yLnL_PS, + dp1.Source.yLnL_SG AS right_yLnL_SG, + dp1.Source.yFlux_PS AS right_yFlux_PS, + dp1.Source.yFlux_PS_Sigma AS right_yFlux_PS_Sigma, + dp1.Source.yFlux_ESG AS right_yFlux_ESG, + dp1.Source.yFlux_ESG_Sigma AS right_yFlux_ESG_Sigma, + dp1.Source.yFlux_Gaussian AS right_yFlux_Gaussian, + dp1.Source.yFlux_Gaussian_Sigma AS right_yFlux_Gaussian_Sigma, + dp1.Source.yTimescale AS right_yTimescale, + dp1.Source.yEarliestObsTime AS right_yEarliestObsTime, + dp1.Source.yLatestObsTime AS right_yLatestObsTime, + dp1.Source.ySersicN_SG AS right_ySersicN_SG, + dp1.Source.ySersicN_SG_Sigma AS right_ySersicN_SG_Sigma, + dp1.Source.yE1_SG AS right_yE1_SG, + dp1.Source.yE1_SG_Sigma AS right_yE1_SG_Sigma, + dp1.Source.yE2_SG AS right_yE2_SG, + dp1.Source.yE2_SG_Sigma AS right_yE2_SG_Sigma, + dp1.Source.yRadius_SG AS right_yRadius_SG, + dp1.Source.yRadius_SG_Sigma AS right_yRadius_SG_Sigma, + dp1.Source.yFlags AS right_yFlags, + dp1.Source.varBinaryField AS right_varBinaryField, + dp1.Source.chunkId AS right_chunkId, + dp1.Source.subChunkId AS right_subChunkId, + (dp1.Object.qserv_trans_id - dp1.Source.qserv_trans_id) AS diff_0_qserv_trans_id, + (dp1.Object.objectId - dp1.Source.objectId) AS diff_1_objectId, + (dp1.Object.iauId - dp1.Source.iauId) AS diff_2_iauId, + (dp1.Object.ra_PS - dp1.Source.ra_PS) AS diff_3_ra_PS, + (dp1.Object.ra_PS_Sigma - dp1.Source.ra_PS_Sigma) AS diff_4_ra_PS_Sigma, + (dp1.Object.decl_PS - dp1.Source.decl_PS) AS diff_5_decl_PS, + (dp1.Object.decl_PS_Sigma - dp1.Source.decl_PS_Sigma) AS diff_6_decl_PS_Sigma, + (dp1.Object.radecl_PS_Cov - dp1.Source.radecl_PS_Cov) AS diff_7_radecl_PS_Cov, + (dp1.Object.htmId20 - dp1.Source.htmId20) AS diff_8_htmId20, + (dp1.Object.ra_SG - dp1.Source.ra_SG) AS diff_9_ra_SG, + (dp1.Object.ra_SG_Sigma - dp1.Source.ra_SG_Sigma) AS diff_10_ra_SG_Sigma, + (dp1.Object.decl_SG - dp1.Source.decl_SG) AS diff_11_decl_SG, + (dp1.Object.decl_SG_Sigma - dp1.Source.decl_SG_Sigma) AS diff_12_decl_SG_Sigma, + (dp1.Object.radecl_SG_Cov - dp1.Source.radecl_SG_Cov) AS diff_13_radecl_SG_Cov, + (dp1.Object.raRange - dp1.Source.raRange) AS diff_14_raRange, + (dp1.Object.declRange - dp1.Source.declRange) AS diff_15_declRange, + (dp1.Object.muRa_PS - dp1.Source.muRa_PS) AS diff_16_muRa_PS, + (dp1.Object.muRa_PS_Sigma - dp1.Source.muRa_PS_Sigma) AS diff_17_muRa_PS_Sigma, + (dp1.Object.muDecl_PS - dp1.Source.muDecl_PS) AS diff_18_muDecl_PS, + (dp1.Object.muDecl_PS_Sigma - dp1.Source.muDecl_PS_Sigma) AS diff_19_muDecl_PS_Sigma, + (dp1.Object.muRaDecl_PS_Cov - dp1.Source.muRaDecl_PS_Cov) AS diff_20_muRaDecl_PS_Cov, + (dp1.Object.parallax_PS - dp1.Source.parallax_PS) AS diff_21_parallax_PS, + (dp1.Object.parallax_PS_Sigma - dp1.Source.parallax_PS_Sigma) AS diff_22_parallax_PS_Sigma, + (dp1.Object.canonicalFilterId - dp1.Source.canonicalFilterId) AS diff_23_canonicalFilterId, + (dp1.Object.extendedness - dp1.Source.extendedness) AS diff_24_extendedness, + (dp1.Object.varProb - dp1.Source.varProb) AS diff_25_varProb, + (dp1.Object.earliestObsTime - dp1.Source.earliestObsTime) AS diff_26_earliestObsTime, + (dp1.Object.latestObsTime - dp1.Source.latestObsTime) AS diff_27_latestObsTime, + (dp1.Object.meanObsTime - dp1.Source.meanObsTime) AS diff_28_meanObsTime, + (dp1.Object.flags - dp1.Source.flags) AS diff_29_flags, + (dp1.Object.uNumObs - dp1.Source.uNumObs) AS diff_30_uNumObs, + (dp1.Object.uExtendedness - dp1.Source.uExtendedness) AS diff_31_uExtendedness, + (dp1.Object.uVarProb - dp1.Source.uVarProb) AS diff_32_uVarProb, + (dp1.Object.uRaOffset_PS - dp1.Source.uRaOffset_PS) AS diff_33_uRaOffset_PS, + (dp1.Object.uRaOffset_PS_Sigma - dp1.Source.uRaOffset_PS_Sigma) AS diff_34_uRaOffset_PS_Sigma, + (dp1.Object.uDeclOffset_PS - dp1.Source.uDeclOffset_PS) AS diff_35_uDeclOffset_PS, + (dp1.Object.uDeclOffset_PS_Sigma - dp1.Source.uDeclOffset_PS_Sigma) AS diff_36_uDeclOffset_PS_Sigma, + (dp1.Object.uRaDeclOffset_PS_Cov - dp1.Source.uRaDeclOffset_PS_Cov) AS diff_37_uRaDeclOffset_PS_Cov, + (dp1.Object.uRaOffset_SG - dp1.Source.uRaOffset_SG) AS diff_38_uRaOffset_SG, + (dp1.Object.uRaOffset_SG_Sigma - dp1.Source.uRaOffset_SG_Sigma) AS diff_39_uRaOffset_SG_Sigma, + (dp1.Object.uDeclOffset_SG - dp1.Source.uDeclOffset_SG) AS diff_40_uDeclOffset_SG, + (dp1.Object.uDeclOffset_SG_Sigma - dp1.Source.uDeclOffset_SG_Sigma) AS diff_41_uDeclOffset_SG_Sigma, + (dp1.Object.uRaDeclOffset_SG_Cov - dp1.Source.uRaDeclOffset_SG_Cov) AS diff_42_uRaDeclOffset_SG_Cov, + (dp1.Object.uLnL_PS - dp1.Source.uLnL_PS) AS diff_43_uLnL_PS, + (dp1.Object.uLnL_SG - dp1.Source.uLnL_SG) AS diff_44_uLnL_SG, + (dp1.Object.uFlux_PS - dp1.Source.uFlux_PS) AS diff_45_uFlux_PS, + (dp1.Object.uFlux_PS_Sigma - dp1.Source.uFlux_PS_Sigma) AS diff_46_uFlux_PS_Sigma, + (dp1.Object.uFlux_ESG - dp1.Source.uFlux_ESG) AS diff_47_uFlux_ESG, + (dp1.Object.uFlux_ESG_Sigma - dp1.Source.uFlux_ESG_Sigma) AS diff_48_uFlux_ESG_Sigma, + (dp1.Object.uFlux_Gaussian - dp1.Source.uFlux_Gaussian) AS diff_49_uFlux_Gaussian, + (dp1.Object.uFlux_Gaussian_Sigma - dp1.Source.uFlux_Gaussian_Sigma) AS diff_50_uFlux_Gaussian_Sigma, + (dp1.Object.uTimescale - dp1.Source.uTimescale) AS diff_51_uTimescale, + (dp1.Object.uEarliestObsTime - dp1.Source.uEarliestObsTime) AS diff_52_uEarliestObsTime, + (dp1.Object.uLatestObsTime - dp1.Source.uLatestObsTime) AS diff_53_uLatestObsTime, + (dp1.Object.uSersicN_SG - dp1.Source.uSersicN_SG) AS diff_54_uSersicN_SG, + (dp1.Object.uSersicN_SG_Sigma - dp1.Source.uSersicN_SG_Sigma) AS diff_55_uSersicN_SG_Sigma, + (dp1.Object.uE1_SG - dp1.Source.uE1_SG) AS diff_56_uE1_SG, + (dp1.Object.uE1_SG_Sigma - dp1.Source.uE1_SG_Sigma) AS diff_57_uE1_SG_Sigma, + (dp1.Object.uE2_SG - dp1.Source.uE2_SG) AS diff_58_uE2_SG, + (dp1.Object.uE2_SG_Sigma - dp1.Source.uE2_SG_Sigma) AS diff_59_uE2_SG_Sigma, + (dp1.Object.uRadius_SG - dp1.Source.uRadius_SG) AS diff_60_uRadius_SG, + (dp1.Object.uRadius_SG_Sigma - dp1.Source.uRadius_SG_Sigma) AS diff_61_uRadius_SG_Sigma, + (dp1.Object.uFlags - dp1.Source.uFlags) AS diff_62_uFlags, + (dp1.Object.gNumObs - dp1.Source.gNumObs) AS diff_63_gNumObs, + (dp1.Object.gExtendedness - dp1.Source.gExtendedness) AS diff_64_gExtendedness, + (dp1.Object.gVarProb - dp1.Source.gVarProb) AS diff_65_gVarProb, + (dp1.Object.gRaOffset_PS - dp1.Source.gRaOffset_PS) AS diff_66_gRaOffset_PS, + (dp1.Object.gRaOffset_PS_Sigma - dp1.Source.gRaOffset_PS_Sigma) AS diff_67_gRaOffset_PS_Sigma, + (dp1.Object.gDeclOffset_PS - dp1.Source.gDeclOffset_PS) AS diff_68_gDeclOffset_PS, + (dp1.Object.gDeclOffset_PS_Sigma - dp1.Source.gDeclOffset_PS_Sigma) AS diff_69_gDeclOffset_PS_Sigma, + (dp1.Object.gRaDeclOffset_PS_Cov - dp1.Source.gRaDeclOffset_PS_Cov) AS diff_70_gRaDeclOffset_PS_Cov, + (dp1.Object.gRaOffset_SG - dp1.Source.gRaOffset_SG) AS diff_71_gRaOffset_SG, + (dp1.Object.gRaOffset_SG_Sigma - dp1.Source.gRaOffset_SG_Sigma) AS diff_72_gRaOffset_SG_Sigma, + (dp1.Object.gDeclOffset_SG - dp1.Source.gDeclOffset_SG) AS diff_73_gDeclOffset_SG, + (dp1.Object.gDeclOffset_SG_Sigma - dp1.Source.gDeclOffset_SG_Sigma) AS diff_74_gDeclOffset_SG_Sigma, + (dp1.Object.gRaDeclOffset_SG_Cov - dp1.Source.gRaDeclOffset_SG_Cov) AS diff_75_gRaDeclOffset_SG_Cov, + (dp1.Object.gLnL_PS - dp1.Source.gLnL_PS) AS diff_76_gLnL_PS, + (dp1.Object.gLnL_SG - dp1.Source.gLnL_SG) AS diff_77_gLnL_SG, + (dp1.Object.gFlux_PS - dp1.Source.gFlux_PS) AS diff_78_gFlux_PS, + (dp1.Object.gFlux_PS_Sigma - dp1.Source.gFlux_PS_Sigma) AS diff_79_gFlux_PS_Sigma, + (dp1.Object.gFlux_ESG - dp1.Source.gFlux_ESG) AS diff_80_gFlux_ESG, + (dp1.Object.gFlux_ESG_Sigma - dp1.Source.gFlux_ESG_Sigma) AS diff_81_gFlux_ESG_Sigma, + (dp1.Object.gFlux_Gaussian - dp1.Source.gFlux_Gaussian) AS diff_82_gFlux_Gaussian, + (dp1.Object.gFlux_Gaussian_Sigma - dp1.Source.gFlux_Gaussian_Sigma) AS diff_83_gFlux_Gaussian_Sigma, + (dp1.Object.gTimescale - dp1.Source.gTimescale) AS diff_84_gTimescale, + (dp1.Object.gEarliestObsTime - dp1.Source.gEarliestObsTime) AS diff_85_gEarliestObsTime, + (dp1.Object.gLatestObsTime - dp1.Source.gLatestObsTime) AS diff_86_gLatestObsTime, + (dp1.Object.gSersicN_SG - dp1.Source.gSersicN_SG) AS diff_87_gSersicN_SG, + (dp1.Object.gSersicN_SG_Sigma - dp1.Source.gSersicN_SG_Sigma) AS diff_88_gSersicN_SG_Sigma, + (dp1.Object.gE1_SG - dp1.Source.gE1_SG) AS diff_89_gE1_SG, + (dp1.Object.gE1_SG_Sigma - dp1.Source.gE1_SG_Sigma) AS diff_90_gE1_SG_Sigma, + (dp1.Object.gE2_SG - dp1.Source.gE2_SG) AS diff_91_gE2_SG, + (dp1.Object.gE2_SG_Sigma - dp1.Source.gE2_SG_Sigma) AS diff_92_gE2_SG_Sigma, + (dp1.Object.gRadius_SG - dp1.Source.gRadius_SG) AS diff_93_gRadius_SG, + (dp1.Object.gRadius_SG_Sigma - dp1.Source.gRadius_SG_Sigma) AS diff_94_gRadius_SG_Sigma, + (dp1.Object.gFlags - dp1.Source.gFlags) AS diff_95_gFlags, + (dp1.Object.rNumObs - dp1.Source.rNumObs) AS diff_96_rNumObs, + (dp1.Object.rExtendedness - dp1.Source.rExtendedness) AS diff_97_rExtendedness, + (dp1.Object.rVarProb - dp1.Source.rVarProb) AS diff_98_rVarProb, + (dp1.Object.rRaOffset_PS - dp1.Source.rRaOffset_PS) AS diff_99_rRaOffset_PS, + (dp1.Object.rRaOffset_PS_Sigma - dp1.Source.rRaOffset_PS_Sigma) AS diff_100_rRaOffset_PS_Sigma, + (dp1.Object.rDeclOffset_PS - dp1.Source.rDeclOffset_PS) AS diff_101_rDeclOffset_PS, + (dp1.Object.rDeclOffset_PS_Sigma - dp1.Source.rDeclOffset_PS_Sigma) AS diff_102_rDeclOffset_PS_Sigma, + (dp1.Object.rRaDeclOffset_PS_Cov - dp1.Source.rRaDeclOffset_PS_Cov) AS diff_103_rRaDeclOffset_PS_Cov, + (dp1.Object.rRaOffset_SG - dp1.Source.rRaOffset_SG) AS diff_104_rRaOffset_SG, + (dp1.Object.rRaOffset_SG_Sigma - dp1.Source.rRaOffset_SG_Sigma) AS diff_105_rRaOffset_SG_Sigma, + (dp1.Object.rDeclOffset_SG - dp1.Source.rDeclOffset_SG) AS diff_106_rDeclOffset_SG, + (dp1.Object.rDeclOffset_SG_Sigma - dp1.Source.rDeclOffset_SG_Sigma) AS diff_107_rDeclOffset_SG_Sigma, + (dp1.Object.rRaDeclOffset_SG_Cov - dp1.Source.rRaDeclOffset_SG_Cov) AS diff_108_rRaDeclOffset_SG_Cov, + (dp1.Object.rLnL_PS - dp1.Source.rLnL_PS) AS diff_109_rLnL_PS, + (dp1.Object.rLnL_SG - dp1.Source.rLnL_SG) AS diff_110_rLnL_SG, + (dp1.Object.rFlux_PS - dp1.Source.rFlux_PS) AS diff_111_rFlux_PS, + (dp1.Object.rFlux_PS_Sigma - dp1.Source.rFlux_PS_Sigma) AS diff_112_rFlux_PS_Sigma, + (dp1.Object.rFlux_ESG - dp1.Source.rFlux_ESG) AS diff_113_rFlux_ESG, + (dp1.Object.rFlux_ESG_Sigma - dp1.Source.rFlux_ESG_Sigma) AS diff_114_rFlux_ESG_Sigma, + (dp1.Object.rFlux_Gaussian - dp1.Source.rFlux_Gaussian) AS diff_115_rFlux_Gaussian, + (dp1.Object.rFlux_Gaussian_Sigma - dp1.Source.rFlux_Gaussian_Sigma) AS diff_116_rFlux_Gaussian_Sigma, + (dp1.Object.rTimescale - dp1.Source.rTimescale) AS diff_117_rTimescale, + (dp1.Object.rEarliestObsTime - dp1.Source.rEarliestObsTime) AS diff_118_rEarliestObsTime, + (dp1.Object.rLatestObsTime - dp1.Source.rLatestObsTime) AS diff_119_rLatestObsTime, + (dp1.Object.rSersicN_SG - dp1.Source.rSersicN_SG) AS diff_120_rSersicN_SG, + (dp1.Object.rSersicN_SG_Sigma - dp1.Source.rSersicN_SG_Sigma) AS diff_121_rSersicN_SG_Sigma, + (dp1.Object.rE1_SG - dp1.Source.rE1_SG) AS diff_122_rE1_SG, + (dp1.Object.rE1_SG_Sigma - dp1.Source.rE1_SG_Sigma) AS diff_123_rE1_SG_Sigma, + (dp1.Object.rE2_SG - dp1.Source.rE2_SG) AS diff_124_rE2_SG, + (dp1.Object.rE2_SG_Sigma - dp1.Source.rE2_SG_Sigma) AS diff_125_rE2_SG_Sigma, + (dp1.Object.rRadius_SG - dp1.Source.rRadius_SG) AS diff_126_rRadius_SG, + (dp1.Object.rRadius_SG_Sigma - dp1.Source.rRadius_SG_Sigma) AS diff_127_rRadius_SG_Sigma, + (dp1.Object.rFlags - dp1.Source.rFlags) AS diff_128_rFlags, + (dp1.Object.iNumObs - dp1.Source.iNumObs) AS diff_129_iNumObs, + (dp1.Object.iExtendedness - dp1.Source.iExtendedness) AS diff_130_iExtendedness, + (dp1.Object.iVarProb - dp1.Source.iVarProb) AS diff_131_iVarProb, + (dp1.Object.iRaOffset_PS - dp1.Source.iRaOffset_PS) AS diff_132_iRaOffset_PS, + (dp1.Object.iRaOffset_PS_Sigma - dp1.Source.iRaOffset_PS_Sigma) AS diff_133_iRaOffset_PS_Sigma, + (dp1.Object.iDeclOffset_PS - dp1.Source.iDeclOffset_PS) AS diff_134_iDeclOffset_PS, + (dp1.Object.iDeclOffset_PS_Sigma - dp1.Source.iDeclOffset_PS_Sigma) AS diff_135_iDeclOffset_PS_Sigma, + (dp1.Object.iRaDeclOffset_PS_Cov - dp1.Source.iRaDeclOffset_PS_Cov) AS diff_136_iRaDeclOffset_PS_Cov, + (dp1.Object.iRaOffset_SG - dp1.Source.iRaOffset_SG) AS diff_137_iRaOffset_SG, + (dp1.Object.iRaOffset_SG_Sigma - dp1.Source.iRaOffset_SG_Sigma) AS diff_138_iRaOffset_SG_Sigma, + (dp1.Object.iDeclOffset_SG - dp1.Source.iDeclOffset_SG) AS diff_139_iDeclOffset_SG +FROM dp1.Object +JOIN dp1.Source ON dp1.Object.objectId = dp1.Source.objectId +WHERE dp1.Object.objectId BETWEEN 10 AND 200000 + AND dp1.Source.flags >= 0 + AND dp1.Object.ra_PS BETWEEN 0 AND 360 + AND dp1.Source.ra_PS BETWEEN 0 AND 360 +ORDER BY dp1.Object.objectId diff --git a/src/ccontrol/testdata/parser-corpus/q09_q3_expression_dense.sql b/src/ccontrol/testdata/parser-corpus/q09_q3_expression_dense.sql new file mode 100644 index 0000000000..25df28246f --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q09_q3_expression_dense.sql @@ -0,0 +1,265 @@ +SELECT + ((dp1.Object.coord_dec - dp1.Object.deblend_isolatedParent) * 1) AS delta_0_coord_dec, + ((dp1.Object.coord_decErr - dp1.Object.deblend_iterations) * 2) AS delta_1_coord_decErr, + ((dp1.Object.coord_ra - dp1.Object.deblend_logL) * 3) AS delta_2_coord_ra, + ((dp1.Object.coord_ra_dec_Cov - dp1.Object.deblend_masked) * 4) AS delta_3_coord_ra_dec_Cov, + ((dp1.Object.coord_raErr - dp1.Object.deblend_nChild) * 5) AS delta_4_coord_raErr, + ((dp1.Object.deblend_failed - dp1.Object.deblend_nPeaks) * 6) AS delta_5_deblend_failed, + ((dp1.Object.deblend_incompleteData - dp1.Object.deblend_parentTooBig) * 7) AS delta_6_deblend_incompleteData, + ((dp1.Object.deblend_isolatedParent - dp1.Object.deblend_peak_center_x) * 8) AS delta_7_deblend_isolatedParent, + ((dp1.Object.deblend_iterations - dp1.Object.deblend_peak_center_y) * 9) AS delta_8_deblend_iterations, + ((dp1.Object.deblend_logL - dp1.Object.deblend_skipped) * 1) AS delta_9_deblend_logL, + ((dp1.Object.deblend_masked - dp1.Object.deblend_tooManyPeaks) * 2) AS delta_10_deblend_masked, + ((dp1.Object.deblend_nChild - dp1.Object.detect_fromBlend) * 3) AS delta_11_deblend_nChild, + ((dp1.Object.deblend_nPeaks - dp1.Object.detect_isDeblendedModelSource) * 4) AS delta_12_deblend_nPeaks, + ((dp1.Object.deblend_parentTooBig - dp1.Object.detect_isIsolated) * 5) AS delta_13_deblend_parentTooBig, + ((dp1.Object.deblend_peak_center_x - dp1.Object.ebv) * 6) AS delta_14_deblend_peak_center_x, + ((dp1.Object.deblend_peak_center_y - dp1.Object.footprintArea) * 7) AS delta_15_deblend_peak_center_y, + ((dp1.Object.deblend_skipped - dp1.Object.g_ap03Flux) * 8) AS delta_16_deblend_skipped, + ((dp1.Object.deblend_tooManyPeaks - dp1.Object.g_ap03Flux_flag) * 9) AS delta_17_deblend_tooManyPeaks, + ((dp1.Object.detect_fromBlend - dp1.Object.g_ap03FluxErr) * 1) AS delta_18_detect_fromBlend, + ((dp1.Object.detect_isDeblendedModelSource - dp1.Object.g_ap06Flux) * 2) AS delta_19_detect_isDeblendedModelSource, + ((dp1.Object.detect_isIsolated - dp1.Object.g_ap06Flux_flag) * 3) AS delta_20_detect_isIsolated, + ((dp1.Object.ebv - dp1.Object.g_ap06FluxErr) * 4) AS delta_21_ebv, + ((dp1.Object.footprintArea - dp1.Object.g_ap09Flux) * 5) AS delta_22_footprintArea, + ((dp1.Object.g_ap03Flux - dp1.Object.g_ap09Flux_flag) * 6) AS delta_23_g_ap03Flux, + ((dp1.Object.g_ap03Flux_flag - dp1.Object.g_ap09FluxErr) * 7) AS delta_24_g_ap03Flux_flag, + ((dp1.Object.g_ap03FluxErr - dp1.Object.g_ap12Flux) * 8) AS delta_25_g_ap03FluxErr, + ((dp1.Object.g_ap06Flux - dp1.Object.g_ap12Flux_flag) * 9) AS delta_26_g_ap06Flux, + ((dp1.Object.g_ap06Flux_flag - dp1.Object.g_ap12FluxErr) * 1) AS delta_27_g_ap06Flux_flag, + ((dp1.Object.g_ap06FluxErr - dp1.Object.g_ap17Flux) * 2) AS delta_28_g_ap06FluxErr, + ((dp1.Object.g_ap09Flux - dp1.Object.g_ap17Flux_flag) * 3) AS delta_29_g_ap09Flux, + ((dp1.Object.g_ap09Flux_flag - dp1.Object.g_ap17FluxErr) * 4) AS delta_30_g_ap09Flux_flag, + ((dp1.Object.g_ap09FluxErr - dp1.Object.g_ap25Flux) * 5) AS delta_31_g_ap09FluxErr, + ((dp1.Object.g_ap12Flux - dp1.Object.g_ap25Flux_flag) * 6) AS delta_32_g_ap12Flux, + ((dp1.Object.g_ap12Flux_flag - dp1.Object.g_ap25FluxErr) * 7) AS delta_33_g_ap12Flux_flag, + ((dp1.Object.g_ap12FluxErr - dp1.Object.g_ap35Flux) * 8) AS delta_34_g_ap12FluxErr, + ((dp1.Object.g_ap17Flux - dp1.Object.g_ap35Flux_flag) * 9) AS delta_35_g_ap17Flux, + ((dp1.Object.g_ap17Flux_flag - dp1.Object.g_ap35FluxErr) * 1) AS delta_36_g_ap17Flux_flag, + ((dp1.Object.g_ap17FluxErr - dp1.Object.g_ap50Flux) * 2) AS delta_37_g_ap17FluxErr, + ((dp1.Object.g_ap25Flux - dp1.Object.g_ap50Flux_flag) * 3) AS delta_38_g_ap25Flux, + ((dp1.Object.g_ap25Flux_flag - dp1.Object.g_ap50FluxErr) * 4) AS delta_39_g_ap25Flux_flag, + ((dp1.Object.g_ap25FluxErr - dp1.Object.g_ap70Flux) * 5) AS delta_40_g_ap25FluxErr, + ((dp1.Object.g_ap35Flux - dp1.Object.g_ap70Flux_flag) * 6) AS delta_41_g_ap35Flux, + ((dp1.Object.g_ap35Flux_flag - dp1.Object.g_ap70FluxErr) * 7) AS delta_42_g_ap35Flux_flag, + ((dp1.Object.g_ap35FluxErr - dp1.Object.g_apFlux_flag) * 8) AS delta_43_g_ap35FluxErr, + ((dp1.Object.g_ap50Flux - dp1.Object.g_apFlux_flag_apertureTruncated) * 9) AS delta_44_g_ap50Flux, + ((dp1.Object.g_ap50Flux_flag - dp1.Object.g_apFlux_flag_sincCoeffsTruncated) * 1) AS delta_45_g_ap50Flux_flag, + ((dp1.Object.g_ap50FluxErr - dp1.Object.g_bdChi2) * 2) AS delta_46_g_ap50FluxErr, + ((dp1.Object.g_ap70Flux - dp1.Object.g_bdE1) * 3) AS delta_47_g_ap70Flux, + ((dp1.Object.g_ap70Flux_flag - dp1.Object.g_bdE2) * 4) AS delta_48_g_ap70Flux_flag, + ((dp1.Object.g_ap70FluxErr - dp1.Object.g_bdFluxB) * 5) AS delta_49_g_ap70FluxErr, + ((dp1.Object.g_apFlux_flag - dp1.Object.g_bdFluxBErr) * 6) AS delta_50_g_apFlux_flag, + ((dp1.Object.g_apFlux_flag_apertureTruncated - dp1.Object.g_bdFluxD) * 7) AS delta_51_g_apFlux_flag_apertureTruncated, + ((dp1.Object.g_apFlux_flag_sincCoeffsTruncated - dp1.Object.g_bdFluxDErr) * 8) AS delta_52_g_apFlux_flag_sincCoeffsTruncated, + ((dp1.Object.g_bdChi2 - dp1.Object.g_bdReB) * 9) AS delta_53_g_bdChi2, + ((dp1.Object.g_bdE1 - dp1.Object.g_bdReD) * 1) AS delta_54_g_bdE1, + ((dp1.Object.g_bdE2 - dp1.Object.g_blendedness) * 2) AS delta_55_g_bdE2, + ((dp1.Object.g_bdFluxB - dp1.Object.g_blendedness_flag) * 3) AS delta_56_g_bdFluxB, + ((dp1.Object.g_bdFluxBErr - dp1.Object.g_calib_astrometry_used) * 4) AS delta_57_g_bdFluxBErr, + ((dp1.Object.g_bdFluxD - dp1.Object.g_calib_photometry_reserved) * 5) AS delta_58_g_bdFluxD, + ((dp1.Object.g_bdFluxDErr - dp1.Object.g_calib_photometry_used) * 6) AS delta_59_g_bdFluxDErr, + ((dp1.Object.g_bdReB - dp1.Object.g_calib_psf_candidate) * 7) AS delta_60_g_bdReB, + ((dp1.Object.g_bdReD - dp1.Object.g_calib_psf_reserved) * 8) AS delta_61_g_bdReD, + ((dp1.Object.g_blendedness - dp1.Object.g_calib_psf_used) * 9) AS delta_62_g_blendedness, + ((dp1.Object.g_blendedness_flag - dp1.Object.g_calibFlux) * 1) AS delta_63_g_blendedness_flag, + ((dp1.Object.g_calib_astrometry_used - dp1.Object.g_calibFlux_flag) * 2) AS delta_64_g_calib_astrometry_used, + ((dp1.Object.g_calib_photometry_reserved - dp1.Object.g_calibFlux_flag_apertureTruncated) * 3) AS delta_65_g_calib_photometry_reserved, + ((dp1.Object.g_calib_photometry_used - dp1.Object.g_calibFlux_flag_sincCoeffsTruncated) * 4) AS delta_66_g_calib_photometry_used, + ((dp1.Object.g_calib_psf_candidate - dp1.Object.g_calibFluxErr) * 5) AS delta_67_g_calib_psf_candidate, + ((dp1.Object.g_calib_psf_reserved - dp1.Object.g_centroid_flag) * 6) AS delta_68_g_calib_psf_reserved, + ((dp1.Object.g_calib_psf_used - dp1.Object.g_centroid_x) * 7) AS delta_69_g_calib_psf_used, + ((dp1.Object.g_calibFlux - dp1.Object.g_centroid_xErr) * 8) AS delta_70_g_calibFlux, + ((dp1.Object.g_calibFlux_flag - dp1.Object.g_centroid_y) * 9) AS delta_71_g_calibFlux_flag, + ((dp1.Object.g_calibFlux_flag_apertureTruncated - dp1.Object.g_centroid_yErr) * 1) AS delta_72_g_calibFlux_flag_apertureTruncated, + ((dp1.Object.g_calibFlux_flag_sincCoeffsTruncated - dp1.Object.g_cModel_flag) * 2) AS delta_73_g_calibFlux_flag_sincCoeffsTruncated, + ((dp1.Object.g_calibFluxErr - dp1.Object.g_cModel_flag_apCorr) * 3) AS delta_74_g_calibFluxErr, + ((dp1.Object.g_centroid_flag - dp1.Object.g_cModelFlux) * 4) AS delta_75_g_centroid_flag, + ((dp1.Object.g_centroid_x - dp1.Object.g_cModelFlux_inner) * 5) AS delta_76_g_centroid_x, + ((dp1.Object.g_centroid_xErr - dp1.Object.g_cModelFluxErr) * 6) AS delta_77_g_centroid_xErr, + ((dp1.Object.g_centroid_y - dp1.Object.g_cModelMag) * 7) AS delta_78_g_centroid_y, + ((dp1.Object.g_centroid_yErr - dp1.Object.g_cModelMagErr) * 8) AS delta_79_g_centroid_yErr, + ((dp1.Object.g_cModel_flag - dp1.Object.g_deblend_blendedness) * 9) AS delta_80_g_cModel_flag, + ((dp1.Object.g_cModel_flag_apCorr - dp1.Object.g_deblend_dataCoverage) * 1) AS delta_81_g_cModel_flag_apCorr, + ((dp1.Object.g_cModelFlux - dp1.Object.g_deblend_fluxOverlap) * 2) AS delta_82_g_cModelFlux, + ((dp1.Object.g_cModelFlux_inner - dp1.Object.g_deblend_fluxOverlapFraction) * 3) AS delta_83_g_cModelFlux_inner, + ((dp1.Object.g_cModelFluxErr - dp1.Object.g_deblend_zeroFlux) * 4) AS delta_84_g_cModelFluxErr, + ((dp1.Object.g_cModelMag - dp1.Object.g_dec) * 5) AS delta_85_g_cModelMag, + ((dp1.Object.g_cModelMagErr - dp1.Object.g_decErr) * 6) AS delta_86_g_cModelMagErr, + ((dp1.Object.g_deblend_blendedness - dp1.Object.g_epoch) * 7) AS delta_87_g_deblend_blendedness, + ((dp1.Object.g_deblend_dataCoverage - dp1.Object.g_extendedness) * 8) AS delta_88_g_deblend_dataCoverage, + ((dp1.Object.g_deblend_fluxOverlap - dp1.Object.g_extendedness_flag) * 9) AS delta_89_g_deblend_fluxOverlap, + ((dp1.Object.g_deblend_fluxOverlapFraction - dp1.Object.g_free_cModelFlux) * 1) AS delta_90_g_deblend_fluxOverlapFraction, + ((dp1.Object.g_deblend_zeroFlux - dp1.Object.g_free_cModelFlux_flag) * 2) AS delta_91_g_deblend_zeroFlux, + ((dp1.Object.g_dec - dp1.Object.g_free_cModelFlux_inner) * 3) AS delta_92_g_dec, + ((dp1.Object.g_decErr - dp1.Object.g_free_cModelFluxErr) * 4) AS delta_93_g_decErr, + ((dp1.Object.g_epoch - dp1.Object.g_free_psfFlux) * 5) AS delta_94_g_epoch, + ((dp1.Object.g_extendedness - dp1.Object.g_free_psfFlux_flag) * 6) AS delta_95_g_extendedness, + ((dp1.Object.g_extendedness_flag - dp1.Object.g_free_psfFluxErr) * 7) AS delta_96_g_extendedness_flag, + ((dp1.Object.g_free_cModelFlux - dp1.Object.g_gaap0p7Flux) * 8) AS delta_97_g_free_cModelFlux, + ((dp1.Object.g_free_cModelFlux_flag - dp1.Object.g_gaap0p7Flux_flag_bigPsf) * 9) AS delta_98_g_free_cModelFlux_flag, + ((dp1.Object.g_free_cModelFlux_inner - dp1.Object.g_gaap0p7FluxErr) * 1) AS delta_99_g_free_cModelFlux_inner, + ((dp1.Object.g_free_cModelFluxErr - dp1.Object.g_gaap1p0Flux) * 2) AS delta_100_g_free_cModelFluxErr, + ((dp1.Object.g_free_psfFlux - dp1.Object.g_gaap1p0Flux_flag_bigPsf) * 3) AS delta_101_g_free_psfFlux, + ((dp1.Object.g_free_psfFlux_flag - dp1.Object.g_gaap1p0FluxErr) * 4) AS delta_102_g_free_psfFlux_flag, + ((dp1.Object.g_free_psfFluxErr - dp1.Object.g_gaap1p5Flux) * 5) AS delta_103_g_free_psfFluxErr, + ((dp1.Object.g_gaap0p7Flux - dp1.Object.g_gaap1p5Flux_flag_bigPsf) * 6) AS delta_104_g_gaap0p7Flux, + ((dp1.Object.g_gaap0p7Flux_flag_bigPsf - dp1.Object.g_gaap1p5FluxErr) * 7) AS delta_105_g_gaap0p7Flux_flag_bigPsf, + ((dp1.Object.g_gaap0p7FluxErr - dp1.Object.g_gaap2p5Flux) * 8) AS delta_106_g_gaap0p7FluxErr, + ((dp1.Object.g_gaap1p0Flux - dp1.Object.g_gaap2p5Flux_flag_bigPsf) * 9) AS delta_107_g_gaap1p0Flux, + ((dp1.Object.g_gaap1p0Flux_flag_bigPsf - dp1.Object.g_gaap2p5FluxErr) * 1) AS delta_108_g_gaap1p0Flux_flag_bigPsf, + ((dp1.Object.g_gaap1p0FluxErr - dp1.Object.g_gaap3p0Flux) * 2) AS delta_109_g_gaap1p0FluxErr, + ((dp1.Object.g_gaap1p5Flux - dp1.Object.g_gaap3p0Flux_flag_bigPsf) * 3) AS delta_110_g_gaap1p5Flux, + ((dp1.Object.g_gaap1p5Flux_flag_bigPsf - dp1.Object.g_gaap3p0FluxErr) * 4) AS delta_111_g_gaap1p5Flux_flag_bigPsf, + ((dp1.Object.g_gaap1p5FluxErr - dp1.Object.g_gaapFlux_flag) * 5) AS delta_112_g_gaap1p5FluxErr, + ((dp1.Object.g_gaap2p5Flux - dp1.Object.g_gaapFlux_flag_edge) * 6) AS delta_113_g_gaap2p5Flux, + ((dp1.Object.g_gaap2p5Flux_flag_bigPsf - dp1.Object.g_gaapFlux_flag_gaussianization) * 7) AS delta_114_g_gaap2p5Flux_flag_bigPsf, + ((dp1.Object.g_gaap2p5FluxErr - dp1.Object.g_gaapOptimalFlux) * 8) AS delta_115_g_gaap2p5FluxErr, + ((dp1.Object.g_gaap3p0Flux - dp1.Object.g_gaapOptimalFlux_flag_bigPsf) * 9) AS delta_116_g_gaap3p0Flux, + ((dp1.Object.g_gaap3p0Flux_flag_bigPsf - dp1.Object.g_gaapOptimalFluxErr) * 1) AS delta_117_g_gaap3p0Flux_flag_bigPsf, + ((dp1.Object.g_gaap3p0FluxErr - dp1.Object.g_gaapPsfFlux) * 2) AS delta_118_g_gaap3p0FluxErr, + ((dp1.Object.g_gaapFlux_flag - dp1.Object.g_gaapPsfFluxErr) * 3) AS delta_119_g_gaapFlux_flag, + ((dp1.Object.g_gaapFlux_flag_edge - dp1.Object.g_hsm_moments_03) * 4) AS delta_120_g_gaapFlux_flag_edge, + ((dp1.Object.g_gaapFlux_flag_gaussianization - dp1.Object.g_hsm_moments_04) * 5) AS delta_121_g_gaapFlux_flag_gaussianization, + ((dp1.Object.g_gaapOptimalFlux - dp1.Object.g_hsm_moments_12) * 6) AS delta_122_g_gaapOptimalFlux, + ((dp1.Object.g_gaapOptimalFlux_flag_bigPsf - dp1.Object.g_hsm_moments_13) * 7) AS delta_123_g_gaapOptimalFlux_flag_bigPsf, + ((dp1.Object.g_gaapOptimalFluxErr - dp1.Object.g_hsm_moments_21) * 8) AS delta_124_g_gaapOptimalFluxErr, + ((dp1.Object.g_gaapPsfFlux - dp1.Object.g_hsm_moments_22) * 9) AS delta_125_g_gaapPsfFlux, + ((dp1.Object.g_gaapPsfFluxErr - dp1.Object.g_hsm_moments_30) * 1) AS delta_126_g_gaapPsfFluxErr, + ((dp1.Object.g_hsm_moments_03 - dp1.Object.g_hsm_moments_31) * 2) AS delta_127_g_hsm_moments_03, + ((dp1.Object.g_hsm_moments_04 - dp1.Object.g_hsm_moments_40) * 3) AS delta_128_g_hsm_moments_04, + ((dp1.Object.g_hsm_moments_12 - dp1.Object.g_hsm_moments_flag) * 4) AS delta_129_g_hsm_moments_12, + ((dp1.Object.g_hsm_moments_13 - dp1.Object.g_hsm_momentsPsf_03) * 5) AS delta_130_g_hsm_moments_13, + ((dp1.Object.g_hsm_moments_21 - dp1.Object.g_hsm_momentsPsf_04) * 6) AS delta_131_g_hsm_moments_21, + ((dp1.Object.g_hsm_moments_22 - dp1.Object.g_hsm_momentsPsf_12) * 7) AS delta_132_g_hsm_moments_22, + ((dp1.Object.g_hsm_moments_30 - dp1.Object.g_hsm_momentsPsf_13) * 8) AS delta_133_g_hsm_moments_30, + ((dp1.Object.g_hsm_moments_31 - dp1.Object.g_hsm_momentsPsf_21) * 9) AS delta_134_g_hsm_moments_31, + ((dp1.Object.g_hsm_moments_40 - dp1.Object.g_hsm_momentsPsf_22) * 1) AS delta_135_g_hsm_moments_40, + ((dp1.Object.g_hsm_moments_flag - dp1.Object.g_hsm_momentsPsf_30) * 2) AS delta_136_g_hsm_moments_flag, + ((dp1.Object.g_hsm_momentsPsf_03 - dp1.Object.g_hsm_momentsPsf_31) * 3) AS delta_137_g_hsm_momentsPsf_03, + ((dp1.Object.g_hsm_momentsPsf_04 - dp1.Object.g_hsm_momentsPsf_40) * 4) AS delta_138_g_hsm_momentsPsf_04, + ((dp1.Object.g_hsm_momentsPsf_12 - dp1.Object.g_hsm_momentsPsf_flag) * 5) AS delta_139_g_hsm_momentsPsf_12, + ((dp1.Object.g_hsm_momentsPsf_13 - dp1.Object.g_hsmShapeRegauss_e1) * 6) AS delta_140_g_hsm_momentsPsf_13, + ((dp1.Object.g_hsm_momentsPsf_21 - dp1.Object.g_hsmShapeRegauss_e2) * 7) AS delta_141_g_hsm_momentsPsf_21, + ((dp1.Object.g_hsm_momentsPsf_22 - dp1.Object.g_hsmShapeRegauss_flag) * 8) AS delta_142_g_hsm_momentsPsf_22, + ((dp1.Object.g_hsm_momentsPsf_30 - dp1.Object.g_hsmShapeRegauss_sigma) * 9) AS delta_143_g_hsm_momentsPsf_30, + ((dp1.Object.g_hsm_momentsPsf_31 - dp1.Object.g_i_flag) * 1) AS delta_144_g_hsm_momentsPsf_31, + ((dp1.Object.g_hsm_momentsPsf_40 - dp1.Object.g_iDebiasedPSF_flag) * 2) AS delta_145_g_hsm_momentsPsf_40, + ((dp1.Object.g_hsm_momentsPsf_flag - dp1.Object.g_inputCount) * 3) AS delta_146_g_hsm_momentsPsf_flag, + ((dp1.Object.g_hsmShapeRegauss_e1 - dp1.Object.g_inputCount_flag) * 4) AS delta_147_g_hsmShapeRegauss_e1, + ((dp1.Object.g_hsmShapeRegauss_e2 - dp1.Object.g_inputCount_flag_noInputs) * 5) AS delta_148_g_hsmShapeRegauss_e2, + ((dp1.Object.g_hsmShapeRegauss_flag - dp1.Object.g_invalidPsfFlag) * 6) AS delta_149_g_hsmShapeRegauss_flag, + ((dp1.Object.g_hsmShapeRegauss_sigma - dp1.Object.g_iPSF_flag) * 7) AS delta_150_g_hsmShapeRegauss_sigma, + ((dp1.Object.g_i_flag - dp1.Object.g_iRound_flag) * 8) AS delta_151_g_i_flag, + ((dp1.Object.g_iDebiasedPSF_flag - dp1.Object.g_ixx) * 9) AS delta_152_g_iDebiasedPSF_flag, + ((dp1.Object.g_inputCount - dp1.Object.g_ixxDebiasedPSF) * 1) AS delta_153_g_inputCount, + ((dp1.Object.g_inputCount_flag - dp1.Object.g_ixxPSF) * 2) AS delta_154_g_inputCount_flag, + ((dp1.Object.g_inputCount_flag_noInputs - dp1.Object.g_ixxRound) * 3) AS delta_155_g_inputCount_flag_noInputs, + ((dp1.Object.g_invalidPsfFlag - dp1.Object.g_ixy) * 4) AS delta_156_g_invalidPsfFlag, + ((dp1.Object.g_iPSF_flag - dp1.Object.g_ixyDebiasedPSF) * 5) AS delta_157_g_iPSF_flag, + ((dp1.Object.g_iRound_flag - dp1.Object.g_ixyPSF) * 6) AS delta_158_g_iRound_flag, + ((dp1.Object.g_ixx - dp1.Object.g_ixyRound) * 7) AS delta_159_g_ixx, + ((dp1.Object.g_ixxDebiasedPSF - dp1.Object.g_iyy) * 8) AS delta_160_g_ixxDebiasedPSF, + ((dp1.Object.g_ixxPSF - dp1.Object.g_iyyDebiasedPSF) * 9) AS delta_161_g_ixxPSF, + ((dp1.Object.g_ixxRound - dp1.Object.g_iyyPSF) * 1) AS delta_162_g_ixxRound, + ((dp1.Object.g_ixy - dp1.Object.g_iyyRound) * 2) AS delta_163_g_ixy, + ((dp1.Object.g_ixyDebiasedPSF - dp1.Object.g_kronFlux) * 3) AS delta_164_g_ixyDebiasedPSF, + ((dp1.Object.g_ixyPSF - dp1.Object.g_kronFlux_flag) * 4) AS delta_165_g_ixyPSF, + ((dp1.Object.g_ixyRound - dp1.Object.g_kronFlux_flag_bad_radius) * 5) AS delta_166_g_ixyRound, + ((dp1.Object.g_iyy - dp1.Object.g_kronFlux_flag_bad_shape) * 6) AS delta_167_g_iyy, + ((dp1.Object.g_iyyDebiasedPSF - dp1.Object.g_kronFlux_flag_bad_shape_no_psf) * 7) AS delta_168_g_iyyDebiasedPSF, + ((dp1.Object.g_iyyPSF - dp1.Object.g_kronFlux_flag_edge) * 8) AS delta_169_g_iyyPSF, + ((dp1.Object.g_iyyRound - dp1.Object.g_kronFlux_flag_no_fallback_radius) * 9) AS delta_170_g_iyyRound, + ((dp1.Object.g_kronFlux - dp1.Object.g_kronFlux_flag_no_minimum_radius) * 1) AS delta_171_g_kronFlux, + ((dp1.Object.g_kronFlux_flag - dp1.Object.g_kronFlux_flag_small_radius) * 2) AS delta_172_g_kronFlux_flag, + ((dp1.Object.g_kronFlux_flag_bad_radius - dp1.Object.g_kronFlux_flag_used_minimum_radius) * 3) AS delta_173_g_kronFlux_flag_bad_radius, + ((dp1.Object.g_kronFlux_flag_bad_shape - dp1.Object.g_kronFlux_flag_used_psf_radius) * 4) AS delta_174_g_kronFlux_flag_bad_shape, + ((dp1.Object.g_kronFlux_flag_bad_shape_no_psf - dp1.Object.g_kronFluxErr) * 5) AS delta_175_g_kronFlux_flag_bad_shape_no_psf, + ((dp1.Object.g_kronFlux_flag_edge - dp1.Object.g_kronRad) * 6) AS delta_176_g_kronFlux_flag_edge, + ((dp1.Object.g_kronFlux_flag_no_fallback_radius - dp1.Object.g_pixelFlags_bad) * 7) AS delta_177_g_kronFlux_flag_no_fallback_radius, + ((dp1.Object.g_kronFlux_flag_no_minimum_radius - dp1.Object.g_pixelFlags_clipped) * 8) AS delta_178_g_kronFlux_flag_no_minimum_radius, + ((dp1.Object.g_kronFlux_flag_small_radius - dp1.Object.g_pixelFlags_clippedCenter) * 9) AS delta_179_g_kronFlux_flag_small_radius, + ((dp1.Object.g_kronFlux_flag_used_minimum_radius - dp1.Object.g_pixelFlags_cr) * 1) AS delta_180_g_kronFlux_flag_used_minimum_radius, + ((dp1.Object.g_kronFlux_flag_used_psf_radius - dp1.Object.g_pixelFlags_crCenter) * 2) AS delta_181_g_kronFlux_flag_used_psf_radius, + ((dp1.Object.g_kronFluxErr - dp1.Object.g_pixelFlags_edge) * 3) AS delta_182_g_kronFluxErr, + ((dp1.Object.g_kronRad - dp1.Object.g_pixelFlags_inexact_psf) * 4) AS delta_183_g_kronRad, + ((dp1.Object.g_pixelFlags_bad - dp1.Object.g_pixelFlags_inexact_psfCenter) * 5) AS delta_184_g_pixelFlags_bad, + ((dp1.Object.g_pixelFlags_clipped - dp1.Object.g_pixelFlags_interpolated) * 6) AS delta_185_g_pixelFlags_clipped, + ((dp1.Object.g_pixelFlags_clippedCenter - dp1.Object.g_pixelFlags_interpolatedCenter) * 7) AS delta_186_g_pixelFlags_clippedCenter, + ((dp1.Object.g_pixelFlags_cr - dp1.Object.g_pixelFlags_nodata) * 8) AS delta_187_g_pixelFlags_cr, + ((dp1.Object.g_pixelFlags_crCenter - dp1.Object.g_pixelFlags_offimage) * 9) AS delta_188_g_pixelFlags_crCenter, + ((dp1.Object.g_pixelFlags_edge - dp1.Object.g_pixelFlags_saturated) * 1) AS delta_189_g_pixelFlags_edge, + ((dp1.Object.g_pixelFlags_inexact_psf - dp1.Object.g_pixelFlags_saturatedCenter) * 2) AS delta_190_g_pixelFlags_inexact_psf, + ((dp1.Object.g_pixelFlags_inexact_psfCenter - dp1.Object.g_pixelFlags_sensor_edge) * 3) AS delta_191_g_pixelFlags_inexact_psfCenter, + ((dp1.Object.g_pixelFlags_interpolated - dp1.Object.g_pixelFlags_sensor_edgeCenter) * 4) AS delta_192_g_pixelFlags_interpolated, + ((dp1.Object.g_pixelFlags_interpolatedCenter - dp1.Object.g_pixelFlags_suspect) * 5) AS delta_193_g_pixelFlags_interpolatedCenter, + ((dp1.Object.g_pixelFlags_nodata - dp1.Object.g_pixelFlags_suspectCenter) * 6) AS delta_194_g_pixelFlags_nodata, + ((dp1.Object.g_pixelFlags_offimage - dp1.Object.g_psfFlux) * 7) AS delta_195_g_pixelFlags_offimage, + ((dp1.Object.g_pixelFlags_saturated - dp1.Object.g_psfFlux_area) * 8) AS delta_196_g_pixelFlags_saturated, + ((dp1.Object.g_pixelFlags_saturatedCenter - dp1.Object.g_psfFlux_flag) * 9) AS delta_197_g_pixelFlags_saturatedCenter, + ((dp1.Object.g_pixelFlags_sensor_edge - dp1.Object.g_psfFlux_flag_apCorr) * 1) AS delta_198_g_pixelFlags_sensor_edge, + ((dp1.Object.g_pixelFlags_sensor_edgeCenter - dp1.Object.g_psfFlux_flag_edge) * 2) AS delta_199_g_pixelFlags_sensor_edgeCenter, + ((dp1.Object.g_pixelFlags_suspect - dp1.Object.g_psfFlux_flag_noGoodPixels) * 3) AS delta_200_g_pixelFlags_suspect, + ((dp1.Object.g_pixelFlags_suspectCenter - dp1.Object.g_psfFluxErr) * 4) AS delta_201_g_pixelFlags_suspectCenter, + ((dp1.Object.g_psfFlux - dp1.Object.g_psfMag) * 5) AS delta_202_g_psfFlux, + ((dp1.Object.g_psfFlux_area - dp1.Object.g_psfMagErr) * 6) AS delta_203_g_psfFlux_area, + ((dp1.Object.g_psfFlux_flag - dp1.Object.g_psfModel_TwoGaussian_chisq_reduced) * 7) AS delta_204_g_psfFlux_flag, + ((dp1.Object.g_psfFlux_flag_apCorr - dp1.Object.g_psfModel_TwoGaussian_gauss1_fluxfrac) * 8) AS delta_205_g_psfFlux_flag_apCorr, + ((dp1.Object.g_psfFlux_flag_edge - dp1.Object.g_psfModel_TwoGaussian_gauss1_rho) * 9) AS delta_206_g_psfFlux_flag_edge, + ((dp1.Object.g_psfFlux_flag_noGoodPixels - dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_x) * 1) AS delta_207_g_psfFlux_flag_noGoodPixels, + ((dp1.Object.g_psfFluxErr - dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_y) * 2) AS delta_208_g_psfFluxErr, + ((dp1.Object.g_psfMag - dp1.Object.g_psfModel_TwoGaussian_gauss2_rho) * 3) AS delta_209_g_psfMag, + ((dp1.Object.g_psfMagErr - dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_x) * 4) AS delta_210_g_psfMagErr, + ((dp1.Object.g_psfModel_TwoGaussian_chisq_reduced - dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_y) * 5) AS delta_211_g_psfModel_TwoGaussian_chisq_reduced, + ((dp1.Object.g_psfModel_TwoGaussian_gauss1_fluxfrac - dp1.Object.g_psfModel_TwoGaussian_n_iter) * 6) AS delta_212_g_psfModel_TwoGaussian_gauss1_fluxfrac, + ((dp1.Object.g_psfModel_TwoGaussian_gauss1_rho - dp1.Object.g_psfModel_TwoGaussian_no_inputs_flag) * 7) AS delta_213_g_psfModel_TwoGaussian_gauss1_rho, + ((dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_x - dp1.Object.g_psfModel_TwoGaussian_unknown_flag) * 8) AS delta_214_g_psfModel_TwoGaussian_gauss1_sigma_x, + ((dp1.Object.g_psfModel_TwoGaussian_gauss1_sigma_y - dp1.Object.g_ra) * 9) AS delta_215_g_psfModel_TwoGaussian_gauss1_sigma_y, + ((dp1.Object.g_psfModel_TwoGaussian_gauss2_rho - dp1.Object.g_ra_dec_Cov) * 1) AS delta_216_g_psfModel_TwoGaussian_gauss2_rho, + ((dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_x - dp1.Object.g_raErr) * 2) AS delta_217_g_psfModel_TwoGaussian_gauss2_sigma_x, + ((dp1.Object.g_psfModel_TwoGaussian_gauss2_sigma_y - dp1.Object.g_sersicFlux) * 3) AS delta_218_g_psfModel_TwoGaussian_gauss2_sigma_y, + ((dp1.Object.g_psfModel_TwoGaussian_n_iter - dp1.Object.g_sersicFluxErr) * 4) AS delta_219_g_psfModel_TwoGaussian_n_iter, + ((dp1.Object.g_psfModel_TwoGaussian_no_inputs_flag - dp1.Object.g_sizeExtendedness) * 5) AS delta_220_g_psfModel_TwoGaussian_no_inputs_flag, + ((dp1.Object.g_psfModel_TwoGaussian_unknown_flag - dp1.Object.g_sizeExtendedness_flag) * 6) AS delta_221_g_psfModel_TwoGaussian_unknown_flag, + ((dp1.Object.g_ra - dp1.Object.i_ap03Flux) * 7) AS delta_222_g_ra, + ((dp1.Object.g_ra_dec_Cov - dp1.Object.i_ap03Flux_flag) * 8) AS delta_223_g_ra_dec_Cov, + ((dp1.Object.g_raErr - dp1.Object.i_ap03FluxErr) * 9) AS delta_224_g_raErr, + ((dp1.Object.g_sersicFlux - dp1.Object.i_ap06Flux) * 1) AS delta_225_g_sersicFlux, + ((dp1.Object.g_sersicFluxErr - dp1.Object.i_ap06Flux_flag) * 2) AS delta_226_g_sersicFluxErr, + ((dp1.Object.g_sizeExtendedness - dp1.Object.i_ap06FluxErr) * 3) AS delta_227_g_sizeExtendedness, + ((dp1.Object.g_sizeExtendedness_flag - dp1.Object.i_ap09Flux) * 4) AS delta_228_g_sizeExtendedness_flag, + ((dp1.Object.i_ap03Flux - dp1.Object.i_ap09Flux_flag) * 5) AS delta_229_i_ap03Flux, + ((dp1.Object.i_ap03Flux_flag - dp1.Object.i_ap09FluxErr) * 6) AS delta_230_i_ap03Flux_flag, + ((dp1.Object.i_ap03FluxErr - dp1.Object.i_ap12Flux) * 7) AS delta_231_i_ap03FluxErr, + ((dp1.Object.i_ap06Flux - dp1.Object.i_ap12Flux_flag) * 8) AS delta_232_i_ap06Flux, + ((dp1.Object.i_ap06Flux_flag - dp1.Object.i_ap12FluxErr) * 9) AS delta_233_i_ap06Flux_flag, + ((dp1.Object.i_ap06FluxErr - dp1.Object.i_ap17Flux) * 1) AS delta_234_i_ap06FluxErr, + ((dp1.Object.i_ap09Flux - dp1.Object.i_ap17Flux_flag) * 2) AS delta_235_i_ap09Flux, + ((dp1.Object.i_ap09Flux_flag - dp1.Object.i_ap17FluxErr) * 3) AS delta_236_i_ap09Flux_flag, + ((dp1.Object.i_ap09FluxErr - dp1.Object.i_ap25Flux) * 4) AS delta_237_i_ap09FluxErr, + ((dp1.Object.i_ap12Flux - dp1.Object.i_ap25Flux_flag) * 5) AS delta_238_i_ap12Flux, + ((dp1.Object.i_ap12Flux_flag - dp1.Object.i_ap25FluxErr) * 6) AS delta_239_i_ap12Flux_flag, + ((dp1.Object.i_ap12FluxErr - dp1.Object.i_ap35Flux) * 7) AS delta_240_i_ap12FluxErr, + ((dp1.Object.i_ap17Flux - dp1.Object.i_ap35Flux_flag) * 8) AS delta_241_i_ap17Flux, + ((dp1.Object.i_ap17Flux_flag - dp1.Object.i_ap35FluxErr) * 9) AS delta_242_i_ap17Flux_flag, + ((dp1.Object.i_ap17FluxErr - dp1.Object.i_ap50Flux) * 1) AS delta_243_i_ap17FluxErr, + ((dp1.Object.i_ap25Flux - dp1.Object.i_ap50Flux_flag) * 2) AS delta_244_i_ap25Flux, + ((dp1.Object.i_ap25Flux_flag - dp1.Object.i_ap50FluxErr) * 3) AS delta_245_i_ap25Flux_flag, + ((dp1.Object.i_ap25FluxErr - dp1.Object.i_ap70Flux) * 4) AS delta_246_i_ap25FluxErr, + ((dp1.Object.i_ap35Flux - dp1.Object.i_ap70Flux_flag) * 5) AS delta_247_i_ap35Flux, + ((dp1.Object.i_ap35Flux_flag - dp1.Object.i_ap70FluxErr) * 6) AS delta_248_i_ap35Flux_flag, + ((dp1.Object.i_ap35FluxErr - dp1.Object.i_apFlux_flag) * 7) AS delta_249_i_ap35FluxErr, + ((dp1.Object.i_ap50Flux - dp1.Object.i_apFlux_flag_apertureTruncated) * 8) AS delta_250_i_ap50Flux, + ((dp1.Object.i_ap50Flux_flag - dp1.Object.i_apFlux_flag_sincCoeffsTruncated) * 9) AS delta_251_i_ap50Flux_flag, + ((dp1.Object.i_ap50FluxErr - dp1.Object.i_bdChi2) * 1) AS delta_252_i_ap50FluxErr, + ((dp1.Object.i_ap70Flux - dp1.Object.i_bdE1) * 2) AS delta_253_i_ap70Flux, + ((dp1.Object.i_ap70Flux_flag - dp1.Object.i_bdE2) * 3) AS delta_254_i_ap70Flux_flag, + ((dp1.Object.i_ap70FluxErr - dp1.Object.i_bdFluxB) * 4) AS delta_255_i_ap70FluxErr, + ((dp1.Object.i_apFlux_flag - dp1.Object.i_bdFluxBErr) * 5) AS delta_256_i_apFlux_flag, + ((dp1.Object.i_apFlux_flag_apertureTruncated - dp1.Object.i_bdFluxD) * 6) AS delta_257_i_apFlux_flag_apertureTruncated, + ((dp1.Object.i_apFlux_flag_sincCoeffsTruncated - dp1.Object.i_bdFluxDErr) * 7) AS delta_258_i_apFlux_flag_sincCoeffsTruncated, + ((dp1.Object.i_bdChi2 - dp1.Object.i_bdReB) * 8) AS delta_259_i_bdChi2 +FROM dp1.Object +WHERE objectId IN (0, 1, 2, 3, 5, 8, 13, 21) + AND coord_ra_dec_Cov >= 0 + AND g_raErr <= 1000 diff --git a/src/ccontrol/testdata/parser-corpus/q10_having_limit.sql b/src/ccontrol/testdata/parser-corpus/q10_having_limit.sql new file mode 100644 index 0000000000..98f067bee2 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q10_having_limit.sql @@ -0,0 +1,17 @@ +SELECT + Source.objectId, + COUNT(*) AS n_sources, + MAX(Source.raFlux) - MIN(Source.raFlux) AS ra_flux_span, + MAX(Source.declFlux) - MIN(Source.declFlux) AS decl_flux_span, + MAX(Source.taiMidPoint) - MIN(Source.taiMidPoint) AS time_span, + MIN(Source.ra) AS min_ra, + MAX(Source.ra) AS max_ra, + MIN(Source.decl) AS min_decl, + MAX(Source.decl) AS max_decl +FROM Source +WHERE Source.objectId BETWEEN 100000 AND 999999 + AND Source.raFlux > 0 + AND Source.declFlux > 0 +GROUP BY Source.objectId +ORDER BY Source.objectId +LIMIT 100 diff --git a/src/ccontrol/testdata/parser-corpus/q11_join_using_time_window.sql b/src/ccontrol/testdata/parser-corpus/q11_join_using_time_window.sql new file mode 100644 index 0000000000..9f04d5f2b7 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q11_join_using_time_window.sql @@ -0,0 +1,22 @@ +SELECT + s.objectId, + s.ra, + s.decl, + s.taiMidPoint, + s.raFlux, + s.declFlux, + o.ra_PS, + o.decl_PS, + o.latestObsTime, + o.earliestObsTime, + o.latestObsTime - o.earliestObsTime AS object_time_span, + s.taiMidPoint - o.earliestObsTime AS source_offset_start, + o.latestObsTime - s.taiMidPoint AS source_offset_end +FROM Object o +JOIN Source s USING (objectId) +WHERE o.objectId BETWEEN 100000 AND 999999 + AND o.latestObsTime BETWEEN s.taiMidPoint - 300 AND s.taiMidPoint + 300 + AND s.ra BETWEEN o.ra_PS - 0.01 AND o.ra_PS + 0.01 + AND s.decl BETWEEN o.decl_PS - 0.01 AND o.decl_PS + 0.01 +ORDER BY s.objectId, s.taiMidPoint +LIMIT 250 diff --git a/src/ccontrol/testdata/parser-corpus/q12_spatial_operator_mix.sql b/src/ccontrol/testdata/parser-corpus/q12_spatial_operator_mix.sql new file mode 100644 index 0000000000..d6f203cf31 --- /dev/null +++ b/src/ccontrol/testdata/parser-corpus/q12_spatial_operator_mix.sql @@ -0,0 +1,19 @@ +SELECT + Object.objectId, + Object.ra_PS, + Object.decl_PS, + Object.ra_PS % 3 AS ra_bucket, + Object.decl_PS % 5 AS decl_bucket, + Object.ra_PS + Object.decl_PS AS coord_sum, + Object.ra_PS - Object.decl_PS AS coord_delta, + Object.ra_PS * Object.decl_PS AS coord_product +FROM Object +WHERE scisql_s2PtInBox(Object.ra_PS, Object.decl_PS, 1, 3, 2, 4) + AND Object.ra_PS % 3 > 1.5 + AND Object.decl_PS % 5 < 4.5 + AND Object.objectId IN (1, 3, 5, 7, 9, 11, 13) + AND (Object.ra_PS < 120 OR Object.ra_PS > 140) + AND Object.decl_PS >= 0 + AND Object.decl_PS <= 30 +ORDER BY Object.ra_PS, Object.decl_PS +LIMIT 500 From b313f68a5c0941e664d1d777cea23b9595cc4a82 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Wed, 17 Jun 2026 13:32:44 -0700 Subject: [PATCH 05/19] Expand test coverage This commit covers three main changes: * Additional query test coverage. It was possible to pass some of the test cases with simple string checks. * Update test cases with Hyrise-specific strings. Rather than forcing Hyrise adapter messages to match legacy ANTLR messages exactly, this allows us to retain both parser backends and test them individually. * Simplify QuerySession::parseQuery call to parser. Previously this instantiated a ParseRunner, which avoided the makeSelectStmt() path and did not execute via Hyrise (if configured to do so). --- src/ccontrol/ParseRunner.cc | 4 ++ src/ccontrol/testCControl.cc | 72 +++++++++++++++++++++++++++++--- src/qproc/QuerySession.cc | 4 +- src/qproc/testQueryAnaGeneral.cc | 35 +++++++++++----- 4 files changed, 96 insertions(+), 19 deletions(-) diff --git a/src/ccontrol/ParseRunner.cc b/src/ccontrol/ParseRunner.cc index d8fe6445ee..d6410251fd 100644 --- a/src/ccontrol/ParseRunner.cc +++ b/src/ccontrol/ParseRunner.cc @@ -98,8 +98,12 @@ class NonRecoveringQSMySqlLexer : public QSMySqlLexer { namespace lsst::qserv::ccontrol { std::shared_ptr ParseRunner::makeSelectStmt(std::string const& statement) { +#ifdef QSERV_USE_HYRISE_SQL_PARSER + return HyriseAdapter::makeSelectStmt(statement); +#else auto parser = std::make_shared(statement); return parser->getSelectStmt(); +#endif } ParseRunner::ParseRunner(std::string const& statement) : _statement(statement) { run(); } diff --git a/src/ccontrol/testCControl.cc b/src/ccontrol/testCControl.cc index 8d46b69ffc..894257c22b 100644 --- a/src/ccontrol/testCControl.cc +++ b/src/ccontrol/testCControl.cc @@ -80,8 +80,12 @@ static const std::vector PARSE_ERROR_QUERIES = { // rejected. This is true for Qserv too. ParseErrorQueryInfo("SELECT objectId, iE1_SG, ABS(iE1_SG) FROM Object WHERE iE1_SG between -0.1 and " "0.1 ORDER BY ABS(iE1_SG)", +#ifdef QSERV_USE_HYRISE_SQL_PARSER + "ParseException:qserv does not support functions in ORDER BY."), +#else "ParseException:Error parsing query, near \"ABS(iE1_SG)\", qserv does not " "support functions in ORDER BY."), +#endif ParseErrorQueryInfo("SELECT foo from Filter f limit 5 garbage query !#$%!#$", "ParseException:Failed to instantiate query: \"SELECT foo from Filter f limit 5 " @@ -100,6 +104,35 @@ static const std::vector PARSE_ERROR_QUERIES = { "ParseException:Error parsing query, near \"_chunkId\", Identifiers in Qserv may not start " "with an underscore."), + ParseErrorQueryInfo( + "SELECT objectId AS _objectId FROM Object;", + "ParseException:Error parsing query, near \"_objectId\", Identifiers in Qserv may not " + "start with an underscore."), + + ParseErrorQueryInfo("SELECT _ra FROM Object;", + "ParseException:Error parsing query, near \"_ra\", Identifiers in Qserv may not " + "start with an underscore."), + + ParseErrorQueryInfo("SELECT `_ra` FROM Object;", +#ifdef QSERV_USE_HYRISE_SQL_PARSER + "ParseException:Error parsing query, near \"_ra\", Identifiers in Qserv may not " + "start with an underscore."), +#else + "ParseException:Error parsing query, near \"`_ra`\", Identifiers in Qserv may " + "not " + "start with an underscore."), +#endif + + ParseErrorQueryInfo( + "SELECT objectId AS `_objectId` FROM Object;", +#ifdef QSERV_USE_HYRISE_SQL_PARSER + "ParseException:Error parsing query, near \"_objectId\", Identifiers in Qserv may not " + "start with an underscore."), +#else + "ParseException:Error parsing query, near \"`_objectId`\", Identifiers in Qserv may not " + "start with an underscore."), +#endif + ParseErrorQueryInfo( "LECT sce.filterName,sce.field " "FROM LSST.Science_Ccd_Exposure AS sce " @@ -108,11 +141,15 @@ static const std::vector PARSE_ERROR_QUERIES = { "FROM LSST.Science_Ccd_Exposure AS sce WHERE sce.field=535 AND sce.camcol LIKE '%' \""), // per testQueryAnaGeneral: CASE in column spec is illegal. - ParseErrorQueryInfo( - "SELECT COUNT(*) AS totalCount, " - "SUM(CASE WHEN (typeId=3) THEN 1 ELSE 0 END) AS galaxyCount " - "FROM Object WHERE rFlux_PS > 10;", - "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) THEN 1 ELSE 0 END\""), + ParseErrorQueryInfo("SELECT COUNT(*) AS totalCount, " + "SUM(CASE WHEN (typeId=3) THEN 1 ELSE 0 END) AS galaxyCount " + "FROM Object WHERE rFlux_PS > 10;", +#ifdef QSERV_USE_HYRISE_SQL_PARSER + "ParseException:qserv can not parse query: CASE expressions are not supported."), +#else + "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) THEN 1 " + "ELSE 0 END\""), +#endif }; BOOST_DATA_TEST_CASE(expected_parse_error, PARSE_ERROR_QUERIES, queryInfo) { @@ -122,6 +159,31 @@ BOOST_DATA_TEST_CASE(expected_parse_error, PARSE_ERROR_QUERIES, queryInfo) { BOOST_REQUIRE_EQUAL(querySession.getError(), queryInfo.errorMessage); } +// While underscores are not allowed in identifiers, we need to ensure the parser/adapter layers +// do not simply reject the presence of an underscore in the SQL string. +BOOST_AUTO_TEST_CASE(underscoreInStringLiteralIsAllowed) { + auto querySession = qproc::QuerySession(); + auto selectStmt = querySession.parseQuery("SELECT objectId FROM Object WHERE description = '_chunkId'"); + BOOST_REQUIRE(selectStmt != nullptr); + BOOST_REQUIRE(querySession.getError().empty()); +} + +// The parser/adapter should reject CASE WHEN, but this test ensures that it can still appear in a string. +BOOST_AUTO_TEST_CASE(caseWhenInStringLiteralIsAllowed) { + auto querySession = qproc::QuerySession(); + auto selectStmt = querySession.parseQuery( + "SELECT objectId FROM Object WHERE description = 'CASE WHEN this is text'"); + BOOST_REQUIRE(selectStmt != nullptr); + BOOST_REQUIRE(querySession.getError().empty()); +} + +BOOST_AUTO_TEST_CASE(repeatedTrailingSemicolonsAreAllowed) { + auto querySession = qproc::QuerySession(); + auto selectStmt = querySession.parseQuery("SELECT objectId FROM Object;;; "); + BOOST_REQUIRE(selectStmt != nullptr); + BOOST_REQUIRE(querySession.getError().empty()); +} + BOOST_AUTO_TEST_CASE(testSimpleCountStar) { using lsst::qserv::ccontrol::UserQueryType; auto querySession = qproc::QuerySession(); diff --git a/src/qproc/QuerySession.cc b/src/qproc/QuerySession.cc index da02e650c9..84f9580fb6 100644 --- a/src/qproc/QuerySession.cc +++ b/src/qproc/QuerySession.cc @@ -112,16 +112,14 @@ namespace lsst::qserv::qproc { //////////////////////////////////////////////////////////////////////// std::shared_ptr QuerySession::parseQuery(std::string const& statement) { - ccontrol::ParseRunner::Ptr parser; try { - parser = std::make_shared(statement); + return ccontrol::ParseRunner::makeSelectStmt(statement); } catch (parser::ParseException const& e) { LOGS(_log, LOG_LVL_DEBUG, "parse exception: " << e.what()); _original = statement; _error = std::string("ParseException:") + e.what(); return nullptr; } - return parser->getSelectStmt(); } // Analyze SQL query issued by user diff --git a/src/qproc/testQueryAnaGeneral.cc b/src/qproc/testQueryAnaGeneral.cc index 828eb07b61..383f24d17c 100644 --- a/src/qproc/testQueryAnaGeneral.cc +++ b/src/qproc/testQueryAnaGeneral.cc @@ -832,15 +832,13 @@ BOOST_AUTO_TEST_CASE(UnpartLimit) { BOOST_AUTO_TEST_CASE(Subquery) { // ticket #2053 std::string stmt = "SELECT subQueryColumn FROM (SELECT * FROM Object WHERE filterId=4) WHERE rFlux_PS > 0.3;"; - ParseRunner::Ptr p; - BOOST_CHECK_THROW(p = queryAnaHelper.getParser(stmt), lsst::qserv::parser::ParseException); + BOOST_CHECK_THROW(ParseRunner::makeSelectStmt(stmt), lsst::qserv::parser::ParseException); // Expected failure: Subqueries are unsupported. } BOOST_AUTO_TEST_CASE(FromParen) { // Extra paren. Not supported by our grammar. std::string stmt = "SELECT * FROM (Object) WHERE rFlux_PS > 0.3;"; - ParseRunner::Ptr p; - BOOST_CHECK_THROW(p = queryAnaHelper.getParser(stmt), lsst::qserv::parser::ParseException); + BOOST_CHECK_THROW(ParseRunner::makeSelectStmt(stmt), lsst::qserv::parser::ParseException); } BOOST_AUTO_TEST_CASE(NewParser) { @@ -861,7 +859,7 @@ BOOST_AUTO_TEST_CASE(NewParser) { for (int i = 0; i < 8; ++i) { std::string stmt = stmts[i]; BOOST_TEST_MESSAGE("----" << stmt << "----"); - ParseRunner::Ptr p = queryAnaHelper.getParser(stmt); + BOOST_REQUIRE_NO_THROW(ParseRunner::makeSelectStmt(stmt)); } } @@ -1277,9 +1275,14 @@ BOOST_AUTO_TEST_CASE(Case01_1012) { qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns({{"LSST", {{"Object", {"objectId", "iE1_SG"}}}}})); auto qs = queryAnaHelper.buildQuerySession(qsTest, stmt); - BOOST_CHECK_EQUAL(qs->getError(), - "ParseException:Error parsing query, near \"ABS(iE1_SG)\", qserv does not support " - "functions in ORDER BY."); +#ifdef QSERV_USE_HYRISE_SQL_PARSER + char const expectedErr[] = "ParseException:qserv does not support functions in ORDER BY."; +#else + char const expectedErr[] = + "ParseException:Error parsing query, near \"ABS(iE1_SG)\", qserv does not support " + "functions in ORDER BY."; +#endif + BOOST_CHECK_EQUAL(qs->getError(), expectedErr); } BOOST_AUTO_TEST_CASE(Case01_1013) { @@ -1292,9 +1295,14 @@ BOOST_AUTO_TEST_CASE(Case01_1013) { qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns({{"LSST", {{"Object", {"objectId", "iE1_SG"}}}}})); auto qs = queryAnaHelper.buildQuerySession(qsTest, stmt); - BOOST_CHECK_EQUAL(qs->getError(), - "ParseException:Error parsing query, near \"ROUND(ABS(iE1_SG), 3)\", qserv does not " - "support functions in ORDER BY."); +#ifdef QSERV_USE_HYRISE_SQL_PARSER + char const expectedErr[] = "ParseException:qserv does not support functions in ORDER BY."; +#else + char const expectedErr[] = + "ParseException:Error parsing query, near \"ROUND(ABS(iE1_SG), 3)\", qserv does not " + "support functions in ORDER BY."; +#endif + BOOST_CHECK_EQUAL(qs->getError(), expectedErr); } // ASC and maybe USING(...) syntax not supported currently. @@ -1473,8 +1481,13 @@ BOOST_AUTO_TEST_CASE(Case01_2004) { "FROM Object WHERE rFlux_PS > 10;"; // CASE in column spec is illegal. +#ifdef QSERV_USE_HYRISE_SQL_PARSER + char const expectedErr[] = + "ParseException:qserv can not parse query: CASE expressions are not supported."; +#else char const expectedErr[] = "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) THEN 1 ELSE 0 END\""; +#endif auto qs = queryAnaHelper.buildQuerySession(qsTest, stmt); BOOST_CHECK_EQUAL(qs->getError(), expectedErr); } From 650343543db8668792192f8578fc0fb8f40fafbe Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Wed, 17 Jun 2026 13:48:34 -0700 Subject: [PATCH 06/19] Update parser to handle excess empty statements --- .../src/parser/bison_parser.cpp | 3481 ++++---- .../src/parser/bison_parser.y | 17 +- .../src/parser/flex_lexer.cpp | 7786 +++++++---------- .../hyrise_sql_parser/src/parser/flex_lexer.h | 168 +- .../hyrise_sql_parser/src/parser/flex_lexer.l | 2 +- 5 files changed, 5186 insertions(+), 6268 deletions(-) diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.cpp b/extern/hyrise_sql_parser/src/parser/bison_parser.cpp index dce3aa8d08..264894883c 100644 --- a/extern/hyrise_sql_parser/src/parser/bison_parser.cpp +++ b/extern/hyrise_sql_parser/src/parser/bison_parser.cpp @@ -64,19 +64,18 @@ #define YYPULL 1 /* Substitute the type names. */ -#define YYSTYPE HSQL_STYPE -#define YYLTYPE HSQL_LTYPE +#define YYSTYPE HSQL_STYPE +#define YYLTYPE HSQL_LTYPE /* Substitute the variable and function names. */ -#define yyparse hsql_parse -#define yylex hsql_lex -#define yyerror hsql_error -#define yydebug hsql_debug -#define yynerrs hsql_nerrs +#define yyparse hsql_parse +#define yylex hsql_lex +#define yyerror hsql_error +#define yydebug hsql_debug +#define yynerrs hsql_nerrs /* First part of user prologue. */ #line 2 "bison_parser.y" - /** * bison_parser.y * defines bison_parser.h @@ -96,14 +95,14 @@ #include #include - using namespace hsql; +using namespace hsql; - int yyerror(YYLTYPE * llocp, SQLParserResult * result, yyscan_t scanner, const char* msg) { - result->setIsValid(false); - result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); - return 0; - } - // clang-format off +int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const char* msg) { + result->setIsValid(false); + result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); + return 0; +} +// clang-format off #line 109 "bison_parser.cpp" @@ -477,8 +476,7 @@ enum yysymbol_kind_t YYSYMBOL_opt_join_type = 341, /* opt_join_type */ YYSYMBOL_natural_join_type = 342, /* natural_join_type */ YYSYMBOL_join_condition = 343, /* join_condition */ - YYSYMBOL_opt_semicolon = 344, /* opt_semicolon */ - YYSYMBOL_ident_commalist = 345 /* ident_commalist */ + YYSYMBOL_ident_commalist = 344 /* ident_commalist */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -791,16 +789,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 69 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1188 +#define YYLAST 1248 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 209 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 137 +#define YYNNTS 136 /* YYNRULES -- Number of rules. */ -#define YYNRULES 378 +#define YYNRULES 377 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 694 +#define YYNSTATES 693 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 444 @@ -868,44 +866,44 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 349, 349, 368, 374, 381, 385, 389, 390, 391, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 408, 409, 411, 415, 420, 424, 434, 435, 436, 438, - 438, 444, 450, 452, 456, 468, 474, 491, 506, 508, - 509, 510, 512, 526, 530, 540, 544, 568, 576, 589, - 596, 611, 631, 632, 637, 648, 661, 673, 680, 687, - 696, 697, 699, 703, 708, 709, 711, 719, 720, 721, - 722, 723, 724, 725, 729, 730, 731, 732, 733, 734, - 735, 736, 737, 738, 739, 741, 742, 744, 745, 746, - 748, 749, 751, 755, 759, 764, 772, 773, 774, 775, - 777, 778, 779, 781, 789, 795, 801, 807, 813, 814, - 821, 827, 829, 839, 846, 857, 864, 872, 873, 880, - 887, 891, 896, 906, 910, 914, 926, 926, 928, 929, - 938, 939, 941, 955, 967, 972, 976, 980, 985, 986, - 988, 1003, 1004, 1006, 1008, 1009, 1011, 1013, 1014, 1016, - 1020, 1022, 1023, 1025, 1026, 1028, 1032, 1037, 1039, 1040, - 1041, 1043, 1044, 1066, 1067, 1069, 1070, 1071, 1072, 1073, - 1074, 1079, 1083, 1089, 1090, 1092, 1096, 1101, 1101, 1105, - 1113, 1114, 1116, 1125, 1125, 1125, 1125, 1125, 1127, 1128, - 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1129, 1129, 1133, - 1133, 1135, 1136, 1137, 1138, 1139, 1141, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1155, 1156, 1158, 1159, 1160, 1161, 1163, 1164, 1165, - 1166, 1170, 1171, 1172, 1173, 1175, 1176, 1178, 1179, 1181, - 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1192, 1193, 1194, - 1195, 1199, 1200, 1202, 1203, 1208, 1209, 1210, 1214, 1215, - 1216, 1218, 1219, 1220, 1221, 1222, 1224, 1226, 1228, 1229, - 1230, 1231, 1232, 1233, 1235, 1236, 1237, 1238, 1239, 1240, - 1242, 1242, 1244, 1246, 1248, 1249, 1251, 1252, 1253, 1254, - 1255, 1256, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1260, - 1262, 1263, 1265, 1266, 1268, 1269, 1271, 1273, 1284, 1285, - 1296, 1328, 1337, 1337, 1344, 1344, 1346, 1346, 1353, 1357, - 1362, 1370, 1376, 1380, 1385, 1386, 1388, 1388, 1390, 1390, - 1392, 1393, 1395, 1395, 1401, 1402, 1404, 1408, 1413, 1419, - 1426, 1427, 1428, 1429, 1431, 1432, 1433, 1439, 1439, 1441, - 1443, 1447, 1452, 1462, 1470, 1478, 1485, 1493, 1502, 1503, - 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1512, 1513, 1514, - 1515, 1516, 1517, 1518, 1520, 1526, 1526, 1529, 1533 + 0, 349, 349, 368, 374, 378, 385, 389, 393, 394, + 395, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 412, 413, 415, 419, 424, 428, 438, 439, 440, + 442, 442, 448, 454, 456, 460, 472, 478, 495, 510, + 512, 513, 514, 516, 530, 534, 544, 548, 572, 580, + 593, 600, 615, 635, 636, 641, 652, 665, 677, 684, + 691, 700, 701, 703, 707, 712, 713, 715, 723, 724, + 725, 726, 727, 728, 729, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 745, 746, 748, 749, + 750, 752, 753, 755, 759, 763, 768, 776, 777, 778, + 779, 781, 782, 783, 785, 793, 799, 805, 811, 817, + 818, 825, 831, 833, 843, 850, 861, 868, 876, 877, + 884, 891, 895, 900, 910, 914, 918, 930, 930, 932, + 933, 942, 943, 945, 959, 971, 976, 980, 984, 989, + 990, 992, 1007, 1008, 1010, 1012, 1013, 1015, 1017, 1018, + 1020, 1024, 1026, 1027, 1029, 1030, 1032, 1036, 1041, 1043, + 1044, 1045, 1047, 1048, 1070, 1071, 1073, 1074, 1075, 1076, + 1077, 1078, 1083, 1087, 1093, 1094, 1096, 1100, 1105, 1105, + 1109, 1117, 1118, 1120, 1129, 1129, 1129, 1129, 1129, 1131, + 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1133, + 1137, 1137, 1139, 1140, 1141, 1142, 1143, 1145, 1145, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1157, 1158, 1159, 1160, 1162, 1163, 1164, 1165, 1167, 1168, + 1169, 1170, 1174, 1175, 1176, 1177, 1179, 1180, 1182, 1183, + 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1196, 1197, + 1198, 1199, 1203, 1204, 1206, 1207, 1212, 1213, 1214, 1218, + 1219, 1220, 1222, 1223, 1224, 1225, 1226, 1228, 1230, 1232, + 1233, 1234, 1235, 1236, 1237, 1239, 1240, 1241, 1242, 1243, + 1244, 1246, 1246, 1248, 1250, 1252, 1253, 1255, 1256, 1257, + 1258, 1259, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, + 1264, 1266, 1267, 1269, 1270, 1272, 1273, 1275, 1277, 1288, + 1289, 1300, 1332, 1341, 1341, 1348, 1348, 1350, 1350, 1357, + 1361, 1366, 1374, 1380, 1384, 1389, 1390, 1392, 1392, 1394, + 1394, 1396, 1397, 1399, 1399, 1405, 1406, 1408, 1412, 1417, + 1423, 1430, 1431, 1432, 1433, 1435, 1436, 1437, 1443, 1443, + 1445, 1447, 1451, 1456, 1466, 1474, 1482, 1489, 1497, 1506, + 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1516, 1517, + 1518, 1519, 1520, 1521, 1522, 1524, 1530, 1534 }; #endif @@ -986,7 +984,7 @@ static const char *const yytname[] = "opt_locking_clause_list", "locking_clause", "row_lock_mode", "opt_row_lock_policy", "opt_with_clause", "with_clause", "with_description_list", "with_description", "join_clause", - "opt_join_type", "natural_join_type", "join_condition", "opt_semicolon", + "opt_join_type", "natural_join_type", "join_condition", "ident_commalist", YY_NULLPTR }; @@ -1026,12 +1024,12 @@ static const yytype_int16 yytoknum[] = }; #endif -#define YYPACT_NINF (-525) +#define YYPACT_NINF (-614) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-376) +#define YYTABLE_NINF (-368) #define yytable_value_is_error(Yyn) \ ((Yyn) == YYTABLE_NINF) @@ -1040,76 +1038,76 @@ static const yytype_int16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 1027, 30, 59, 74, 80, 59, -9, 73, 100, 81, - 59, -13, 8, 181, 32, 266, 92, 92, 92, 283, - 103, -525, 226, -525, 226, -525, -525, -525, -525, -525, - -525, -525, -525, -525, -525, -525, -525, -32, -525, 335, - 141, -525, 155, 265, -525, 262, 262, 262, 59, 401, - 59, 308, -525, 279, -32, 311, 1, 279, 279, 279, - 59, -525, 317, 232, -525, -525, -525, -525, -525, -525, - 1010, -525, 349, -525, -525, 340, 25, -525, 229, -525, - 455, 148, 458, 339, 465, 59, 59, 389, -525, 383, - 277, 484, 440, 59, 293, 294, 495, 495, 495, 503, - 59, 59, -525, 314, 266, -525, 319, 97, 521, -525, - -525, -525, -32, 421, 418, -32, 4, -525, -525, -525, - -525, 820, 348, 554, -525, 556, -525, -525, 40, -525, - 361, 360, -525, -525, -525, -525, -525, -525, -525, -525, - -525, -525, -525, -525, -525, 522, -525, 438, -46, 277, - 394, -525, 495, 568, 118, 392, -42, -525, -525, 482, - -525, -525, -525, -59, -59, -59, -525, -525, -525, -525, - -525, 574, -525, -525, -525, 394, 508, -525, -525, 25, - -525, -525, 394, 508, 394, 199, 466, -525, -525, -525, - -525, -525, -525, -525, -525, -525, -525, -525, -525, -525, - -525, -525, 180, -525, 437, -525, -525, -525, 148, -525, - 59, 584, 473, 26, 476, 85, 390, 398, 404, -525, - 209, 488, 407, 549, -525, 365, 284, 577, -525, -525, - -525, -525, -525, -525, -525, -525, -525, -525, -525, -525, - -525, -525, -525, -525, 510, -525, -120, 410, -525, 394, - 484, -525, 575, -525, -525, 412, 38, -525, 389, -525, - 414, 47, -525, 526, 422, -525, 53, 4, -32, 423, - -525, 56, 4, 284, 571, 186, 31, -525, 466, -525, - 497, -525, -525, 428, 538, -525, 587, 432, 462, 469, - 58, -525, -525, -525, 473, 13, 21, 580, 437, 394, - 394, 331, 236, 434, 549, 746, 394, 464, 442, 206, - 394, 394, 394, 394, 549, 549, -525, 549, 549, 35, - 444, -36, 549, 549, 549, 549, 549, 549, 549, 549, - 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, - 549, 549, 97, 59, -525, 638, 148, 284, -525, 279, - 38, 649, 651, 401, 655, 107, -525, -525, 148, -525, - 574, 16, 389, -525, 394, -525, 657, -525, -525, -525, - -525, 394, -525, -525, 661, 466, 394, 394, -525, 490, - -525, 504, 119, -525, 587, 568, 495, -525, -525, 468, - -525, 471, -525, -525, 479, -525, -525, 483, -525, -525, - -525, -525, 485, -525, -525, 254, 568, 486, 487, -525, - 26, -525, 589, 394, 95, -525, 472, 595, 305, -38, - 381, 394, 394, -525, 580, 590, 66, -525, -525, -525, - -29, -525, -29, 819, 602, -28, 819, 549, 549, 496, - 365, -525, 600, 511, 819, -28, 453, 453, 819, 819, - 819, 966, 966, 966, 966, 330, 721, 889, 464, 464, - -28, -28, -28, 509, -525, -525, 125, 710, 173, -525, - -525, -525, -525, -525, 241, 187, -525, 473, -525, 247, - -525, 507, -525, 36, -525, 644, -525, -525, -525, 716, - -525, -525, 284, 284, 658, -525, 568, -525, 559, -525, - 520, 204, -525, 718, 720, -525, 722, 723, 724, -525, - -525, 621, -525, 560, 59, -525, 254, -525, -525, 222, - 568, 568, -525, 529, -525, 234, 24, 732, -525, 394, - 587, 394, 394, -525, 159, 240, 533, -525, 549, 712, - 819, 365, 534, 249, -525, -525, -525, -525, -525, 735, - 401, -525, -525, 536, 461, 645, -525, -525, 668, 669, - 670, 656, 16, 748, -525, -525, -525, 624, 711, -525, - -525, -95, -525, -525, -525, 561, 253, 573, 578, 579, - -525, -525, 277, -525, -525, -525, 303, 309, 671, 589, - 589, 394, -525, 255, 585, 284, 297, -525, 394, -525, - 746, 549, 586, 326, -525, -525, -525, -525, 36, -525, - 713, 726, 16, 727, 702, 16, -525, -525, -525, 16, - 402, 605, 394, 394, -525, -525, -525, -525, 802, -525, - -525, -525, -525, -525, 633, 682, 508, -525, -525, 336, - -525, -525, -525, 284, 746, -525, -525, -525, -525, -525, - -525, -525, 16, -525, 599, 568, 422, 284, 608, -525, - 394, 217, 589, -525, 610, 394, 337, -525, 422, -525, - -525, -525, 611, 23, -525, 568, 284, -525, -525, -525, - 19, 51, 54, -525, -525, 362, -525, -525, 698, -525, - -525, -525, 51, -525 + 1017, 68, 66, 77, 142, 66, 140, 81, 96, 104, + 66, 173, 20, 159, 42, 266, 129, 129, 129, 289, + 88, -614, 195, -614, 195, -614, -614, -614, -614, -614, + -614, -614, -614, -614, -614, -614, -614, -24, -614, 315, + 115, -614, 127, 235, -614, 207, 207, 207, 66, 336, + 66, 220, -614, 250, -24, 255, 51, 250, 250, 250, + 66, -614, 222, 179, -614, -614, -614, -614, -614, -614, + 552, 293, -614, -614, 294, 60, -614, 341, -614, 409, + 48, 412, 305, 433, 66, 66, 369, -614, 388, 244, + 483, 440, 66, 300, 304, 489, 489, 489, 495, 66, + 66, -614, 310, 266, -614, 316, 83, 521, -614, -614, + -614, -24, 402, 411, -24, 0, -614, -614, -614, -614, + 765, 343, 540, -614, 541, -614, -614, 32, -614, 346, + 344, -614, -614, -614, -614, -614, -614, -614, -614, -614, + -614, -614, -614, -614, 508, -614, 423, -52, 244, 446, + -614, 489, 555, 24, 380, -43, -614, -614, 471, -614, + -614, -614, -66, -66, -66, -614, -614, -614, -614, -614, + 564, -614, -614, -614, 446, 490, -614, -614, 60, -614, + -614, 446, 490, 446, 210, 457, -614, -614, -614, -614, + -614, -614, -614, -614, -614, -614, -614, -614, -614, -614, + -614, 356, -614, 488, -614, -614, -614, 48, -614, 66, + 579, 467, 23, 460, -14, 386, 387, 395, -614, 229, + 473, 391, 568, -614, 351, 337, 547, -614, -614, -614, + -614, -614, -614, -614, -614, -614, -614, -614, -614, -614, + -614, -614, -614, 503, -614, -32, 405, -614, 446, 483, + -614, 572, -614, -614, 417, 144, -614, 369, -614, 419, + 46, -614, 527, 398, -614, 57, 0, -24, 429, -614, + 285, 0, 337, 569, 133, 4, -614, 457, -614, 481, + -614, -614, 435, 543, -614, 1091, 441, 472, 474, 59, + -614, -614, -614, 467, 16, 22, 592, 488, 446, 446, + 216, 73, 450, 568, 802, 446, -45, 452, 279, 446, + 446, 446, 446, 568, 568, -614, 568, 568, 40, 454, + -41, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 83, 66, -614, 656, 48, 337, -614, 250, 144, + 657, 659, 336, 660, 76, -614, -614, 48, -614, 564, + 21, 369, -614, 446, -614, 662, -614, -614, -614, -614, + 446, -614, -614, 664, 457, 446, 446, -614, 484, -614, + 507, -71, -614, 1091, 555, 489, -614, -614, 470, -614, + 477, -614, -614, 486, -614, -614, 491, -614, -614, -614, + -614, 492, -614, -614, 201, 555, 493, 494, -614, 23, + -614, 595, 446, 90, -614, 487, 580, 214, 362, 86, + 446, 446, -614, 592, 589, -120, -614, -614, -614, -38, + -614, -38, 826, 658, -67, 826, 568, 568, 505, 351, + -614, 591, 509, 826, -67, 106, 106, 826, 826, 826, + 897, 897, 897, 897, 506, 691, 961, -45, -45, -67, + -67, -67, 513, -614, -614, 84, 706, 120, -614, -614, + -614, -614, -614, 174, 134, -614, 467, -614, 342, -614, + 510, -614, 38, -614, 645, -614, -614, -614, 715, -614, + -614, 337, 337, 655, -614, 555, -614, 556, -614, 517, + 164, -614, 720, 721, -614, 727, 728, 740, -614, -614, + 642, -614, 574, 66, -614, 201, -614, -614, 183, 555, + 555, -614, 549, -614, 223, 26, 750, -614, 446, 1091, + 446, 446, -614, 406, 397, 550, -614, 568, 682, 826, + 351, 553, 224, -614, -614, -614, -614, -614, 752, 336, + -614, -614, 554, 512, 661, -614, -614, 679, 680, 681, + 665, 21, 763, -614, -614, -614, 639, 716, -614, -614, + 102, -614, -614, -614, 566, 260, 570, 575, 576, -614, + -614, 244, -614, -614, -614, 264, 278, 670, 595, 595, + 446, -614, 320, 577, 337, 502, -614, 446, -614, 802, + 568, 581, 295, -614, -614, -614, -614, 38, -614, 692, + 693, 21, 703, 685, 21, -614, -614, -614, 21, 389, + 585, 446, 446, -614, -614, -614, -614, 782, -614, -614, + -614, -614, -614, 614, 663, 490, -614, -614, 322, -614, + -614, -614, 337, 802, -614, -614, -614, -614, -614, -614, + -614, 21, -614, 242, 555, 398, 337, 590, -614, 446, + 108, 595, -614, 593, 446, 324, -614, 398, -614, -614, + -614, 596, 37, -614, 555, 337, -614, -614, -614, 91, + 39, 232, -614, -614, 330, -614, -614, 674, -614, -614, + -614, 39, -614 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1117,114 +1115,114 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_int16 yydefact[] = { - 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 30, 30, 30, 0, - 376, 3, 21, 19, 21, 18, 8, 9, 7, 11, - 16, 17, 13, 14, 12, 15, 10, 0, 347, 0, - 322, 114, 33, 0, 54, 61, 61, 61, 0, 0, - 0, 0, 321, 109, 0, 0, 0, 109, 109, 109, - 0, 52, 0, 349, 350, 29, 26, 28, 27, 1, - 348, 2, 0, 6, 5, 164, 123, 124, 154, 106, - 0, 174, 0, 0, 325, 0, 0, 148, 37, 0, - 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 53, 0, 0, 4, 0, 0, 142, 136, - 137, 135, 0, 139, 0, 0, 170, 323, 299, 305, - 302, 304, 0, 0, 306, 0, 300, 301, 0, 311, - 0, 173, 175, 177, 179, 292, 293, 294, 303, 295, - 296, 297, 298, 32, 31, 0, 324, 0, 0, 118, - 0, 113, 0, 0, 0, 0, 148, 120, 108, 0, - 131, 130, 38, 41, 41, 41, 107, 104, 105, 352, - 351, 0, 304, 163, 141, 0, 154, 127, 126, 128, - 138, 134, 0, 154, 0, 0, 335, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 308, 0, 307, 310, 180, 181, 34, 0, 60, - 0, 0, 348, 0, 0, 286, 0, 0, 0, 287, - 0, 0, 0, 0, 290, 0, 147, 183, 190, 191, - 192, 185, 187, 193, 186, 206, 194, 195, 196, 197, - 189, 184, 199, 200, 0, 377, 0, 0, 116, 0, - 0, 119, 0, 110, 111, 0, 0, 51, 148, 50, - 24, 0, 22, 145, 143, 171, 333, 170, 0, 153, - 155, 160, 170, 166, 168, 165, 0, 132, 334, 336, - 0, 309, 176, 0, 0, 57, 0, 0, 0, 0, - 0, 62, 64, 65, 348, 142, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 202, 0, 201, 0, 0, - 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, + 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 31, 31, 0, + 2, 3, 22, 20, 22, 19, 9, 10, 8, 12, + 17, 18, 14, 15, 13, 16, 11, 0, 348, 0, + 323, 115, 34, 0, 55, 62, 62, 62, 0, 0, + 0, 0, 322, 110, 0, 0, 0, 110, 110, 110, + 0, 53, 0, 350, 351, 30, 27, 29, 28, 1, + 4, 0, 7, 6, 165, 124, 125, 155, 107, 0, + 175, 0, 0, 326, 0, 0, 149, 38, 0, 119, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 0, 0, 5, 0, 0, 143, 137, 138, + 136, 0, 140, 0, 0, 171, 324, 300, 306, 303, + 305, 0, 0, 307, 0, 301, 302, 0, 312, 0, + 174, 176, 178, 180, 293, 294, 295, 304, 296, 297, + 298, 299, 33, 32, 0, 325, 0, 0, 119, 0, + 114, 0, 0, 0, 0, 149, 121, 109, 0, 132, + 131, 39, 42, 42, 42, 108, 105, 106, 353, 352, + 0, 305, 164, 142, 0, 155, 128, 127, 129, 139, + 135, 0, 155, 0, 0, 336, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 309, 0, 308, 311, 181, 182, 35, 0, 61, 0, + 0, 349, 0, 0, 287, 0, 0, 0, 288, 0, + 0, 0, 0, 291, 0, 148, 184, 191, 192, 193, + 186, 188, 194, 187, 207, 195, 196, 197, 198, 190, + 185, 200, 201, 0, 376, 0, 0, 117, 0, 0, + 120, 0, 111, 112, 0, 0, 52, 149, 51, 25, + 0, 23, 146, 144, 172, 334, 171, 0, 154, 156, + 161, 171, 167, 169, 166, 0, 133, 335, 337, 0, + 310, 177, 0, 0, 58, 0, 0, 0, 0, 0, + 63, 65, 66, 349, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 203, 0, 202, 0, 0, 0, + 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 117, 0, 0, 122, 121, 109, - 0, 0, 0, 0, 0, 0, 47, 36, 0, 20, - 0, 0, 148, 144, 0, 331, 0, 332, 182, 125, - 129, 0, 159, 158, 161, 335, 0, 0, 340, 0, - 342, 0, 346, 337, 0, 0, 0, 83, 77, 0, - 79, 89, 80, 67, 0, 74, 75, 0, 71, 72, - 78, 81, 86, 76, 68, 91, 0, 0, 0, 56, - 0, 59, 252, 0, 288, 291, 0, 0, 0, 0, - 0, 0, 0, 233, 0, 0, 0, 198, 188, 223, - 225, 224, 226, 241, 0, 213, 219, 0, 0, 0, - 0, 204, 0, 222, 221, 212, 217, 218, 239, 240, - 242, 243, 244, 245, 246, 216, 214, 215, 208, 207, - 210, 209, 211, 0, 35, 378, 0, 0, 0, 48, - 45, 43, 49, 40, 0, 0, 23, 348, 146, 312, - 314, 0, 316, 329, 315, 150, 172, 330, 156, 0, - 157, 133, 169, 167, 0, 343, 0, 345, 0, 338, - 0, 0, 55, 0, 0, 73, 0, 0, 0, 82, - 98, 0, 97, 0, 0, 66, 90, 92, 94, 0, - 0, 0, 63, 0, 247, 0, 142, 0, 237, 0, - 0, 0, 0, 231, 0, 0, 0, 282, 0, 0, - 220, 0, 0, 0, 205, 283, 115, 112, 39, 0, - 0, 46, 25, 0, 0, 0, 358, 364, 362, 365, - 360, 0, 0, 0, 328, 320, 326, 0, 152, 162, - 341, 346, 344, 178, 58, 0, 0, 0, 0, 0, - 99, 96, 118, 93, 95, 101, 0, 0, 254, 252, - 252, 0, 289, 0, 0, 235, 0, 234, 0, 238, - 284, 0, 0, 0, 229, 227, 44, 42, 329, 367, - 371, 373, 0, 369, 0, 0, 361, 363, 359, 0, - 313, 330, 0, 0, 140, 339, 70, 88, 0, 84, - 69, 85, 103, 100, 0, 0, 154, 248, 249, 0, - 266, 267, 232, 236, 285, 230, 228, 317, 370, 372, - 353, 368, 0, 355, 366, 0, 149, 151, 0, 102, - 0, 257, 252, 354, 0, 0, 0, 87, 253, 258, - 259, 260, 0, 0, 250, 0, 374, 356, 327, 251, - 0, 0, 0, 265, 255, 0, 264, 262, 0, 263, - 261, 357, 0, 256 + 0, 0, 0, 118, 0, 0, 123, 122, 110, 0, + 0, 0, 0, 0, 0, 48, 37, 0, 21, 0, + 0, 149, 145, 0, 332, 0, 333, 183, 126, 130, + 0, 160, 159, 162, 336, 0, 0, 341, 0, 343, + 0, 347, 338, 0, 0, 0, 84, 78, 0, 80, + 90, 81, 68, 0, 75, 76, 0, 72, 73, 79, + 82, 87, 77, 69, 92, 0, 0, 0, 57, 0, + 60, 253, 0, 289, 292, 0, 0, 0, 0, 0, + 0, 0, 234, 0, 0, 0, 199, 189, 224, 226, + 225, 227, 242, 0, 214, 220, 0, 0, 0, 0, + 205, 0, 223, 222, 213, 218, 219, 240, 241, 243, + 244, 245, 246, 247, 217, 215, 216, 209, 208, 211, + 210, 212, 0, 36, 377, 0, 0, 0, 49, 46, + 44, 50, 41, 0, 0, 24, 349, 147, 313, 315, + 0, 317, 330, 316, 151, 173, 331, 157, 0, 158, + 134, 170, 168, 0, 344, 0, 346, 0, 339, 0, + 0, 56, 0, 0, 74, 0, 0, 0, 83, 99, + 0, 98, 0, 0, 67, 91, 93, 95, 0, 0, + 0, 64, 0, 248, 0, 143, 0, 238, 0, 0, + 0, 0, 232, 0, 0, 0, 283, 0, 0, 221, + 0, 0, 0, 206, 284, 116, 113, 40, 0, 0, + 47, 26, 0, 0, 0, 359, 365, 363, 366, 361, + 0, 0, 0, 329, 321, 327, 0, 153, 163, 342, + 347, 345, 179, 59, 0, 0, 0, 0, 0, 100, + 97, 119, 94, 96, 102, 0, 0, 255, 253, 253, + 0, 290, 0, 0, 236, 0, 235, 0, 239, 285, + 0, 0, 0, 230, 228, 45, 43, 330, 368, 372, + 374, 0, 370, 0, 0, 362, 364, 360, 0, 314, + 331, 0, 0, 141, 340, 71, 89, 0, 85, 70, + 86, 104, 101, 0, 0, 155, 249, 250, 0, 267, + 268, 233, 237, 286, 231, 229, 318, 371, 373, 354, + 369, 0, 356, 367, 0, 150, 152, 0, 103, 0, + 258, 253, 355, 0, 0, 0, 88, 254, 259, 260, + 261, 0, 0, 251, 0, 375, 357, 328, 252, 0, + 0, 0, 266, 256, 0, 265, 263, 0, 264, 262, + 358, 0, 257 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -525, -525, -525, 749, -525, 794, -525, 460, -525, 191, - -525, -525, -525, -525, -328, -76, 67, 474, 347, -525, - -525, -525, 272, -525, 413, -525, -353, -525, -525, -525, - -525, 306, -525, -467, -525, -41, -525, -525, -525, -525, - -525, -525, -145, -525, -525, 576, -203, -89, -525, 223, - -51, -23, -525, -525, -75, -281, -525, -525, -525, -123, - -525, -525, -175, -525, 454, -525, -525, -525, 12, -300, - -525, -266, 620, 627, 470, -150, -208, -525, -525, -525, - -525, -525, -525, 531, -525, -525, -525, -524, -525, -525, - -525, -512, -525, -525, -152, -525, -525, -525, -525, -525, - -525, -61, -525, -525, 705, -100, -525, -525, 707, -525, - -525, -483, -351, -525, -525, -525, 0, -525, -525, 230, - 564, -525, 467, -525, 562, -525, 270, -525, -525, -525, - 733, -525, -525, -525, -525, -525, -362 + -614, -614, -614, 725, -614, 778, -614, 444, -614, 416, + -614, -614, -614, -614, -331, -87, 375, 455, 332, -614, + -614, -614, 396, -614, 399, -614, -356, -614, -614, -614, + -614, 292, -614, -468, -614, -42, -614, -614, -614, -614, + -614, -614, -146, -614, -614, 560, -191, -85, -614, 245, + -50, -19, -614, -614, -83, -276, -614, -614, -614, -122, + -614, -614, -174, -614, 442, -614, -614, -614, -23, -300, + -614, -280, 604, 612, 453, -149, -208, -614, -614, -614, + -614, -614, -614, 515, -614, -614, -614, -478, -614, -614, + -614, -613, -614, -614, -130, -614, -614, -614, -614, -614, + -614, -61, -614, -614, 690, -99, -614, -614, 697, -614, + -614, -482, -242, -614, -614, -614, 1, -614, -614, 211, + 561, -614, 445, -614, 548, -614, 257, -614, -614, -614, + 717, -614, -614, -614, -614, -362 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 19, 20, 21, 22, 73, 261, 262, 23, 66, - 24, 144, 25, 26, 89, 163, 257, 355, 356, 27, - 28, 29, 84, 290, 291, 292, 405, 509, 505, 515, - 516, 517, 293, 518, 30, 93, 31, 253, 254, 32, - 33, 34, 154, 35, 156, 157, 36, 176, 177, 178, - 77, 112, 113, 181, 78, 175, 263, 362, 363, 151, - 568, 624, 116, 269, 270, 374, 490, 108, 186, 264, - 130, 131, 132, 133, 265, 266, 227, 228, 229, 230, - 231, 232, 233, 302, 234, 235, 236, 524, 636, 672, - 673, 684, 237, 238, 199, 200, 201, 239, 240, 241, - 242, 243, 135, 136, 137, 138, 139, 140, 141, 142, - 478, 479, 480, 481, 482, 51, 483, 147, 564, 565, - 566, 368, 277, 278, 279, 382, 499, 37, 38, 63, - 64, 484, 561, 614, 677, 71, 246 + -1, 19, 20, 21, 22, 72, 260, 261, 23, 66, + 24, 143, 25, 26, 88, 162, 256, 354, 355, 27, + 28, 29, 83, 289, 290, 291, 404, 508, 504, 514, + 515, 516, 292, 517, 30, 92, 31, 252, 253, 32, + 33, 34, 153, 35, 155, 156, 36, 175, 176, 177, + 76, 111, 112, 180, 77, 174, 262, 361, 362, 150, + 567, 623, 115, 268, 269, 373, 489, 107, 185, 263, + 129, 130, 131, 132, 264, 265, 226, 227, 228, 229, + 230, 231, 232, 301, 233, 234, 235, 523, 635, 671, + 672, 683, 236, 237, 198, 199, 200, 238, 239, 240, + 241, 242, 134, 135, 136, 137, 138, 139, 140, 141, + 477, 478, 479, 480, 481, 51, 482, 146, 563, 564, + 565, 367, 276, 277, 278, 381, 498, 37, 38, 63, + 64, 483, 560, 613, 676, 245 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1232,248 +1230,260 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 226, 267, 41, 95, 214, 44, 426, 173, 272, 285, - 52, 40, 56, 305, 413, 307, 99, 100, 101, 40, - 134, 164, 165, 501, 414, 471, 183, 174, 75, 286, - 680, 500, 271, 251, 273, 275, 109, 179, 174, 365, - 179, 351, 681, 150, 519, 119, 120, 121, 87, 584, - 90, 211, 281, 60, 437, 115, 365, 255, 680, 39, - 102, 184, 40, 45, 352, 637, 638, 497, 498, 53, - 301, 441, 110, 46, 531, 309, 244, 42, 185, 620, - 466, 310, 212, 43, 344, 148, 149, 345, 442, 353, - 310, 411, 475, 159, 61, 378, 305, 311, 97, 347, - 167, 168, 119, 248, 172, 47, 433, 434, 111, 435, - 436, 322, 345, 525, 443, 444, 445, 446, 447, 448, + 225, 266, 213, 41, 94, 425, 44, 172, 271, 163, + 164, 52, 304, 56, 306, 98, 99, 100, 412, 133, + 284, 470, 500, 40, 40, 413, 285, 499, 178, 182, + 173, 178, 270, 250, 272, 274, 74, 118, 119, 120, + 173, 364, 149, 518, 679, 210, 679, 583, 316, 86, + 254, 89, 117, 118, 119, 120, 680, 183, 114, 436, + 364, 101, 495, 60, 243, 465, 440, 687, 377, 40, + 300, 108, 321, 280, 184, 308, 211, 474, 692, 619, + 42, 309, 536, 441, 74, 147, 148, 363, 118, 246, + 171, 496, 497, 158, 321, 304, 323, 39, 121, 346, + 166, 167, 410, 247, 61, 432, 433, 109, 434, 435, + 636, 637, 524, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 571, 357, 654, 98, 674, 438, - 543, 134, 312, 313, 256, 354, 417, 134, 372, 418, - 419, 312, 118, 119, 120, 121, 268, 213, 586, 587, - 429, 430, 431, 432, 563, 250, 439, 659, 379, 688, - 48, 54, 310, 342, 308, 310, 373, 594, 75, 370, - 693, 366, 50, 247, 118, 119, 120, 121, 311, 686, - 687, 311, 682, 179, 125, 683, 380, 49, 122, 287, - 288, 289, 215, 118, 119, 120, 121, 381, 67, 68, - 283, 54, 215, 118, 119, 120, 121, 412, 415, 477, - 682, 271, 607, 683, 689, 690, 492, 493, 590, 539, - 540, 258, 259, 312, 313, 55, 312, 313, 123, 485, - 109, 603, 463, 377, 351, 591, 416, 216, 217, 218, - 65, 359, 496, 57, 360, 124, 219, 216, 217, 218, - 76, 650, 409, 58, 653, 410, 219, 549, 537, 62, - 123, 534, 535, 364, 553, 554, 110, 94, 310, 369, - 597, 497, 498, 69, 375, 134, 220, 124, 295, 123, - 296, 639, 550, 666, 311, 59, 220, 134, 526, 123, - 527, 663, 125, 126, 127, 310, 124, 114, 467, 70, - 502, 473, 111, 685, 474, 555, 124, 274, 85, 86, - 556, 311, 656, 221, 300, 310, 169, 557, 558, 546, - 600, 421, 208, 221, 125, 126, 127, 222, 79, 312, - 313, 311, 72, 464, 128, 559, 80, 222, 354, -366, - 560, 422, 598, 125, 126, 127, 129, 423, 81, 310, - 668, 510, 82, 125, 126, 127, 312, 313, 215, 118, - 119, 120, 121, 536, 310, 311, 128, 548, 511, 593, - 474, 595, 596, 669, 670, 671, 312, 313, 129, 542, - 311, 552, 83, 644, 208, 223, 224, 215, 118, 119, - 120, 121, 225, 310, 88, 223, 224, 129, 574, 92, - 428, 345, 225, 216, 217, 218, 310, 129, 642, 311, - 312, 313, 219, 317, 310, 75, 585, 512, 513, 345, - 554, 514, 311, 530, 91, 312, 313, 632, 589, 104, - 311, 364, 216, 217, 218, 103, 300, 96, 643, 106, - 310, 219, 220, 605, -318, 123, 364, 627, 117, 640, - 628, 661, 143, 145, 312, 313, 311, 107, 146, 322, - 555, 324, 124, 657, 150, 556, 532, 312, 313, 152, - 153, 220, 557, 558, 123, 312, 313, 155, 158, 221, - 602, 215, 118, 119, 120, 121, 422, 160, 161, 162, - 559, 124, 533, 222, -366, 560, 166, 633, 325, 326, - 345, 312, 313, 634, 582, 676, 345, 54, 221, 125, - 126, 127, 171, 335, 336, 337, 338, 339, 340, 341, - 646, 342, 222, 364, 609, 174, 303, 217, 218, 180, - 662, 678, 610, 364, 345, 219, 317, 182, 125, 126, - 127, 202, 215, 118, 119, 120, 121, 317, 203, 611, - 204, 223, 224, 612, 613, 207, 691, 208, 225, 345, - 209, 245, 210, 129, 249, 220, 252, 260, 123, 187, - 188, 189, 190, 191, 192, 314, 114, 284, 276, 15, - 223, 224, 322, 297, 324, 124, 315, 225, 217, 218, - 387, 298, 129, 322, 294, 324, 219, 299, 306, -319, - 314, 343, 304, 346, 388, 350, 349, 358, 389, 390, - 391, 392, 393, 361, 394, 384, 222, 554, 376, 364, - 371, 385, 395, 316, 386, 406, 220, 424, 407, 123, - 75, 465, 125, 126, 127, 408, 427, 440, 337, 338, - 339, 340, 341, 469, 342, 470, 124, 396, 316, 472, - 487, 339, 340, 341, 489, 342, 494, 555, 523, 495, - 317, 503, 556, 304, 504, 397, 528, 398, 399, 557, - 558, 318, 506, 664, 223, 224, 507, 222, 508, 520, - 521, 225, 529, 400, 438, 317, 129, 559, 401, 541, - 402, 319, 560, 125, 126, 127, 318, 544, 320, 321, - 403, 545, 342, 547, 562, 567, 322, 323, 324, 569, - 314, 538, 570, 572, 573, 575, 425, 576, 580, 577, - 578, 579, 588, 665, 321, 592, 581, 599, 604, 606, - 608, 322, 323, 324, 404, 223, 224, 615, 616, 617, - 618, 621, 225, 622, 314, 325, 326, 129, 619, 327, - 328, 329, 330, 331, 623, 626, 332, 333, 316, 334, - 335, 336, 337, 338, 339, 340, 341, 629, 342, 635, - 325, 326, 630, 631, 327, 328, 329, 330, 331, 641, - 645, 332, 333, 648, 334, 335, 336, 337, 338, 339, - 340, 341, 316, 342, 652, 317, 649, 651, 655, 658, - 514, 660, 667, 675, 317, 679, 318, 692, 74, 105, - 476, 551, 583, 522, 468, 488, 348, -376, 282, 280, - 367, 601, 420, 205, 486, 206, 425, 170, 647, 317, - 383, 625, 491, 0, 321, 0, 0, 0, 0, 0, - 318, 322, 323, 324, 0, 0, 0, 0, 0, 0, - 322, 0, 324, 0, 0, 0, 0, 0, 0, 0, - 425, 0, 0, 0, 0, 316, 0, 0, 321, 0, - 0, 0, 0, 0, 0, 322, 323, 324, 0, 0, - 325, 326, 0, 0, 327, 328, 329, 330, 331, 325, - 326, 332, 333, 0, 334, 335, 336, 337, 338, 339, - 340, 341, 317, 342, 0, 336, 337, 338, 339, 340, - 341, 0, 342, -376, 325, 326, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 332, 333, 0, 334, 335, - 336, 337, 338, 339, 340, 341, 0, 342, 0, 0, - 0, 321, 0, 0, 0, 0, 0, 0, 322, -376, - 324, 0, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 0, 0, 0, 0, 0, 0, - 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 325, 326, 0, - 0, -376, -376, -376, 330, 331, 0, 0, 332, 333, - -375, 334, 335, 336, 337, 338, 339, 340, 341, 1, - 342, 0, 316, 0, 0, 0, 0, 2, 322, 0, - 324, 0, 0, 0, 3, 0, 1, 0, 0, 4, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, - 0, 3, 6, 7, 0, 0, 4, 0, 0, 317, - 0, 0, 0, 0, 8, 9, 5, 325, 326, 6, - 7, 0, 0, 0, 10, 0, 0, 11, 0, 0, - 0, 8, 9, 0, 337, 338, 339, 340, 341, 0, - 342, 10, 0, 0, 11, 0, 0, 0, 321, 12, - 0, 0, 0, 0, 13, 322, 0, 324, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, - 14, 13, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, - 0, 0, 0, 15, 325, 326, 0, 0, 0, 0, - 0, -376, -376, 0, 0, -376, -376, 0, 334, 335, - 336, 337, 338, 339, 340, 341, 0, 342, 0, 16, - 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 17, 18 + 459, 460, 461, 570, 341, 356, 653, 255, 122, 542, + 133, 378, 311, 110, 437, 43, 133, 350, 96, 417, + 418, 212, 338, 339, 340, 123, 341, 585, 586, 267, + 428, 429, 430, 431, 249, 658, 562, 416, 420, 379, + 351, 438, 343, 593, 307, 344, 309, 350, 48, 54, + 380, 531, 369, 673, 178, 365, 124, 97, 421, 294, + 376, 295, 310, 49, 422, 352, 286, 287, 288, 316, + 548, 421, 124, 125, 126, 50, 681, 532, 681, 682, + 282, 682, 45, 214, 117, 118, 119, 120, 606, 414, + 411, 270, 46, 54, 476, 549, 491, 492, 538, 539, + 589, 57, 214, 117, 118, 119, 120, 311, 312, 484, + 602, 58, 462, 368, 127, 321, 415, 323, 374, 590, + 358, 353, 309, 359, 47, 53, 128, 55, 215, 216, + 217, 685, 686, 408, 496, 497, 409, 218, 310, 62, + 553, 533, 534, 59, 668, 669, 670, 215, 216, 217, + 472, 353, 75, 473, 133, 552, 218, 65, 545, 69, + 638, 207, 665, 525, 70, 526, 133, 219, 501, 93, + 122, 336, 337, 338, 339, 340, 466, 341, 509, 344, + 554, 71, 684, 311, 312, 555, 219, 123, 78, 122, + 79, 655, 556, 557, 547, 510, 663, 473, 273, 599, + 80, 299, 81, 309, 220, 309, 123, 82, 551, 87, + 558, 207, 529, 463, 299, 559, 90, 168, 221, 310, + 102, 310, 108, 220, 214, 117, 118, 119, 120, 667, + 117, 118, 119, 120, 124, 125, 126, 221, 573, 649, + 553, 344, 652, 535, 511, 512, 664, 371, 513, 592, + 91, 594, 595, 124, 125, 126, 103, 584, 109, 541, + 344, 95, 643, 105, 311, 312, 311, 312, 309, 215, + 216, 217, 688, 689, 309, 372, 222, 223, 218, 662, + 554, 74, 116, 224, 310, 555, 142, 553, 128, 113, + 310, 106, 556, 557, 110, 222, 223, 588, 604, 144, + 363, 363, 224, 67, 68, 631, 145, 128, 219, 309, + 558, 122, 84, 85, -367, 559, 122, 152, 642, 214, + 117, 118, 119, 120, 149, 310, 309, 554, 123, 311, + 312, 660, 555, 123, 626, 311, 312, 627, 632, 556, + 557, 344, 310, 656, 530, 220, 214, 117, 118, 119, + 120, 309, 633, 427, 151, 344, 154, 558, 157, 221, + 601, -367, 559, 161, 215, 216, 217, 310, 165, 645, + 311, 312, 363, 218, 159, 124, 125, 126, 160, 597, + 124, 125, 126, 54, 581, 675, 309, 311, 312, 170, + 179, 302, 216, 217, 639, 309, 661, 596, 677, 363, + 218, 344, 310, 219, 690, 173, 122, 344, 257, 258, + 181, 310, 311, 312, 202, 203, 201, 222, 223, -319, + 206, 207, 127, 123, 224, 313, 208, 209, 244, 128, + 219, 1, 248, 122, 128, 251, 314, 259, 113, 2, + 220, 214, 117, 118, 119, 120, 3, 311, 312, 275, + 123, 4, 283, 15, 221, 608, 311, 312, 293, 296, + 297, 5, 305, 609, 6, 7, -320, 303, 298, 316, + 124, 125, 126, 315, 342, 363, 8, 9, 345, 383, + 610, 221, -349, 348, 611, 612, 10, 216, 217, 11, + 349, 309, 357, 641, 360, 218, 375, 124, 125, 126, + 186, 187, 188, 189, 190, 191, 370, 310, 384, 385, + 316, 12, 222, 223, 405, 321, 13, 323, 406, 224, + 407, 317, 74, 423, 128, 219, 426, 439, 122, 464, + 493, 468, 14, 469, 471, 486, 313, 488, 15, 222, + 223, 318, 494, 502, 522, 123, 224, 528, 319, 320, + 503, 128, 311, 312, 324, 325, 321, 322, 323, 505, + 313, 527, 303, 437, 506, 507, 519, 520, 543, 334, + 335, 336, 337, 338, 339, 340, 221, 341, 540, 546, + 341, 16, 17, 18, 315, 544, 566, 561, 568, 569, + 571, 572, 124, 125, 126, 324, 325, 574, 575, 326, + 327, 328, 329, 330, 576, 577, 331, 332, 315, 333, + 334, 335, 336, 337, 338, 339, 340, 578, 341, 579, + 580, 316, 587, 591, 598, -349, 605, 603, 607, 615, + 616, 617, 317, 614, 222, 223, 620, 618, 621, 622, + 625, 224, 647, 648, 628, 316, 128, 537, 634, 629, + 630, 640, 424, 650, 316, 644, 317, 651, 654, 657, + 320, 513, 659, 691, 666, 104, 674, 321, 322, 323, + 678, 600, 73, 475, 467, 550, 424, 582, 521, 347, + 313, 281, 487, 279, 320, 419, 485, 204, 646, 490, + 169, 321, 322, 323, 205, 382, 366, 624, 0, 0, + 321, 0, 323, 0, -368, 0, 324, 325, 0, 0, + 326, 327, 328, 329, 330, 0, 0, 331, 332, 0, + 333, 334, 335, 336, 337, 338, 339, 340, 315, 341, + 324, 325, 0, 0, 326, 327, 328, 329, 330, 324, + 325, 331, 332, 0, 333, 334, 335, 336, 337, 338, + 339, 340, 315, 341, 0, 335, 336, 337, 338, 339, + 340, 0, 341, 0, 0, 316, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 317, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 316, + 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, + -368, 0, 0, 0, 320, 0, 0, 0, 0, 0, + 0, 321, 322, 323, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 315, 0, 0, 0, 0, 320, 0, + 0, 0, 0, 0, 0, 321, -368, 323, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 324, 325, 0, 0, 326, 327, 328, 329, 330, 0, + 316, 331, 332, 0, 333, 334, 335, 336, 337, 338, + 339, 340, 0, 341, 324, 325, 0, 0, -368, -368, + -368, 329, 330, 0, 0, 331, 332, 0, 333, 334, + 335, 336, 337, 338, 339, 340, 1, 341, 0, 320, + 0, 0, 0, 0, 2, 0, 321, 0, 323, 0, + 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 316, 0, 5, 0, 0, 6, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 9, 0, 0, 324, 325, 0, 0, 0, + 0, 10, -368, -368, 11, 0, -368, -368, 0, 333, + 334, 335, 336, 337, 338, 339, 340, 0, 341, 0, + 321, 0, 323, 0, 386, 0, 12, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 387, 0, + 0, 0, 388, 389, 390, 391, 392, 14, 393, 0, + 0, 0, 0, 15, 0, 0, 394, 0, 0, 324, + 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 336, 337, 338, 339, + 340, 395, 341, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 17, 18, 396, + 0, 397, 398, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, + 0, 0, 400, 0, 401, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 403 }; static const yytype_int16 yycheck[] = { - 150, 176, 2, 54, 149, 5, 306, 107, 183, 212, - 10, 3, 12, 221, 295, 223, 57, 58, 59, 3, - 81, 97, 98, 385, 3, 353, 115, 14, 60, 3, - 7, 384, 182, 156, 184, 185, 11, 112, 14, 3, - 115, 3, 19, 85, 406, 5, 6, 7, 48, 516, - 50, 97, 204, 21, 19, 78, 3, 116, 7, 29, - 60, 57, 3, 72, 26, 589, 590, 162, 163, 82, - 220, 107, 47, 82, 112, 225, 152, 3, 74, 562, - 346, 119, 128, 3, 204, 85, 86, 207, 124, 51, - 119, 294, 358, 93, 62, 64, 304, 135, 97, 249, - 100, 101, 5, 154, 7, 114, 314, 315, 83, 317, - 318, 139, 207, 413, 322, 323, 324, 325, 326, 327, + 149, 175, 148, 2, 54, 305, 5, 106, 182, 96, + 97, 10, 220, 12, 222, 57, 58, 59, 294, 80, + 211, 352, 384, 3, 3, 3, 3, 383, 111, 114, + 14, 114, 181, 155, 183, 184, 60, 5, 6, 7, + 14, 3, 85, 405, 7, 97, 7, 515, 93, 48, + 116, 50, 4, 5, 6, 7, 19, 57, 77, 19, + 3, 60, 133, 21, 151, 345, 107, 680, 64, 3, + 219, 11, 139, 203, 74, 224, 128, 357, 691, 561, + 3, 119, 202, 124, 60, 84, 85, 207, 5, 65, + 7, 162, 163, 92, 139, 303, 141, 29, 50, 248, + 99, 100, 293, 153, 62, 313, 314, 47, 316, 317, + 588, 589, 412, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 496, 258, 619, 136, 662, 104, - 440, 202, 180, 181, 203, 107, 298, 208, 92, 299, - 300, 180, 4, 5, 6, 7, 179, 203, 520, 521, - 310, 311, 312, 313, 128, 207, 131, 634, 137, 681, - 97, 203, 119, 201, 225, 119, 120, 530, 60, 268, - 692, 128, 101, 65, 4, 5, 6, 7, 135, 170, - 171, 135, 169, 268, 154, 172, 165, 97, 50, 173, - 174, 175, 3, 4, 5, 6, 7, 176, 17, 18, - 210, 203, 3, 4, 5, 6, 7, 204, 197, 203, - 169, 371, 550, 172, 170, 171, 376, 377, 204, 437, - 438, 164, 165, 180, 181, 12, 180, 181, 90, 362, - 11, 541, 342, 57, 3, 526, 297, 48, 49, 50, - 158, 204, 133, 72, 207, 107, 57, 48, 49, 50, - 37, 612, 204, 82, 615, 207, 57, 26, 202, 3, - 90, 421, 422, 207, 477, 28, 47, 54, 119, 267, - 121, 162, 163, 0, 272, 346, 87, 107, 203, 90, - 205, 591, 51, 655, 135, 114, 87, 358, 203, 90, - 205, 652, 154, 155, 156, 119, 107, 78, 349, 206, - 386, 204, 83, 675, 207, 68, 107, 118, 46, 47, - 73, 135, 622, 124, 115, 119, 103, 80, 81, 204, - 538, 95, 207, 124, 154, 155, 156, 138, 3, 180, - 181, 135, 116, 343, 196, 98, 205, 138, 107, 102, - 103, 115, 112, 154, 155, 156, 208, 121, 203, 119, - 660, 107, 97, 154, 155, 156, 180, 181, 3, 4, - 5, 6, 7, 424, 119, 135, 196, 204, 124, 529, - 207, 531, 532, 166, 167, 168, 180, 181, 208, 440, - 135, 204, 130, 601, 207, 196, 197, 3, 4, 5, - 6, 7, 203, 119, 3, 196, 197, 208, 204, 130, - 204, 207, 203, 48, 49, 50, 119, 208, 121, 135, - 180, 181, 57, 93, 119, 60, 204, 173, 174, 207, - 28, 177, 135, 128, 126, 180, 181, 582, 204, 207, - 135, 207, 48, 49, 50, 128, 115, 136, 598, 100, - 119, 57, 87, 204, 207, 90, 207, 204, 3, 204, - 207, 636, 4, 124, 180, 181, 135, 127, 3, 139, - 68, 141, 107, 623, 85, 73, 95, 180, 181, 96, - 203, 87, 80, 81, 90, 180, 181, 3, 48, 124, - 541, 3, 4, 5, 6, 7, 115, 204, 204, 4, - 98, 107, 121, 138, 102, 103, 3, 204, 178, 179, - 207, 180, 181, 204, 514, 665, 207, 203, 124, 154, - 155, 156, 203, 193, 194, 195, 196, 197, 198, 199, - 204, 201, 138, 207, 73, 14, 48, 49, 50, 118, - 204, 204, 81, 207, 207, 57, 93, 129, 154, 155, - 156, 203, 3, 4, 5, 6, 7, 93, 4, 98, - 4, 196, 197, 102, 103, 204, 204, 207, 203, 207, - 48, 3, 134, 208, 182, 87, 94, 3, 90, 142, - 143, 144, 145, 146, 147, 8, 78, 3, 122, 116, - 196, 197, 139, 203, 141, 107, 19, 203, 49, 50, - 13, 203, 208, 139, 128, 141, 57, 203, 201, 207, - 8, 101, 124, 203, 27, 203, 41, 203, 31, 32, - 33, 34, 35, 97, 37, 128, 138, 28, 57, 207, - 207, 203, 45, 56, 96, 203, 87, 203, 176, 90, - 60, 3, 154, 155, 156, 176, 204, 203, 195, 196, - 197, 198, 199, 4, 201, 4, 107, 70, 56, 4, - 3, 197, 198, 199, 3, 201, 176, 68, 79, 165, - 93, 203, 73, 124, 203, 88, 204, 90, 91, 80, - 81, 104, 203, 84, 196, 197, 203, 138, 203, 203, - 203, 203, 97, 106, 104, 93, 208, 98, 111, 203, - 113, 124, 103, 154, 155, 156, 104, 107, 131, 132, - 123, 202, 201, 3, 207, 71, 139, 140, 141, 3, - 8, 119, 64, 164, 204, 7, 124, 7, 107, 7, - 7, 7, 203, 134, 132, 3, 176, 204, 204, 4, - 204, 139, 140, 141, 157, 196, 197, 102, 80, 80, - 80, 3, 203, 129, 8, 178, 179, 208, 102, 182, - 183, 184, 185, 186, 53, 204, 189, 190, 56, 192, - 193, 194, 195, 196, 197, 198, 199, 204, 201, 108, - 178, 179, 204, 204, 182, 183, 184, 185, 186, 204, - 204, 189, 190, 80, 192, 193, 194, 195, 196, 197, - 198, 199, 56, 201, 102, 93, 80, 80, 203, 7, - 177, 129, 204, 203, 93, 204, 104, 119, 24, 70, - 360, 474, 516, 410, 350, 371, 250, 8, 208, 202, - 266, 119, 301, 128, 364, 128, 124, 104, 608, 93, - 278, 571, 375, -1, 132, -1, -1, -1, -1, -1, - 104, 139, 140, 141, -1, -1, -1, -1, -1, -1, - 139, -1, 141, -1, -1, -1, -1, -1, -1, -1, - 124, -1, -1, -1, -1, 56, -1, -1, 132, -1, - -1, -1, -1, -1, -1, 139, 140, 141, -1, -1, + 338, 339, 340, 495, 201, 257, 618, 203, 90, 439, + 201, 137, 180, 83, 104, 3, 207, 3, 97, 298, + 299, 203, 197, 198, 199, 107, 201, 519, 520, 178, + 309, 310, 311, 312, 207, 633, 128, 297, 95, 165, + 26, 131, 204, 529, 224, 207, 119, 3, 97, 203, + 176, 95, 267, 661, 267, 128, 154, 136, 115, 203, + 57, 205, 135, 97, 121, 51, 173, 174, 175, 93, + 26, 115, 154, 155, 156, 101, 169, 121, 169, 172, + 209, 172, 72, 3, 4, 5, 6, 7, 549, 197, + 204, 370, 82, 203, 203, 51, 375, 376, 436, 437, + 204, 72, 3, 4, 5, 6, 7, 180, 181, 361, + 540, 82, 341, 266, 196, 139, 296, 141, 271, 525, + 204, 107, 119, 207, 114, 82, 208, 12, 48, 49, + 50, 170, 171, 204, 162, 163, 207, 57, 135, 3, + 28, 420, 421, 114, 166, 167, 168, 48, 49, 50, + 204, 107, 37, 207, 345, 476, 57, 158, 204, 0, + 590, 207, 654, 203, 206, 205, 357, 87, 385, 54, + 90, 195, 196, 197, 198, 199, 348, 201, 107, 207, + 68, 116, 674, 180, 181, 73, 87, 107, 3, 90, + 205, 621, 80, 81, 204, 124, 84, 207, 118, 537, + 203, 115, 97, 119, 124, 119, 107, 130, 204, 3, + 98, 207, 128, 342, 115, 103, 126, 102, 138, 135, + 128, 135, 11, 124, 3, 4, 5, 6, 7, 659, + 4, 5, 6, 7, 154, 155, 156, 138, 204, 611, + 28, 207, 614, 423, 173, 174, 134, 92, 177, 528, + 130, 530, 531, 154, 155, 156, 207, 204, 47, 439, + 207, 136, 600, 100, 180, 181, 180, 181, 119, 48, + 49, 50, 170, 171, 119, 120, 196, 197, 57, 651, + 68, 60, 3, 203, 135, 73, 4, 28, 208, 78, + 135, 127, 80, 81, 83, 196, 197, 204, 204, 124, + 207, 207, 203, 17, 18, 581, 3, 208, 87, 119, + 98, 90, 46, 47, 102, 103, 90, 203, 597, 3, + 4, 5, 6, 7, 85, 135, 119, 68, 107, 180, + 181, 635, 73, 107, 204, 180, 181, 207, 204, 80, + 81, 207, 135, 622, 112, 124, 3, 4, 5, 6, + 7, 119, 204, 204, 96, 207, 3, 98, 48, 138, + 540, 102, 103, 4, 48, 49, 50, 135, 3, 204, + 180, 181, 207, 57, 204, 154, 155, 156, 204, 112, + 154, 155, 156, 203, 513, 664, 119, 180, 181, 203, + 118, 48, 49, 50, 204, 119, 204, 121, 204, 207, + 57, 207, 135, 87, 204, 14, 90, 207, 163, 164, + 129, 135, 180, 181, 4, 4, 203, 196, 197, 207, + 204, 207, 196, 107, 203, 8, 48, 134, 3, 208, + 87, 9, 182, 90, 208, 94, 19, 3, 78, 17, + 124, 3, 4, 5, 6, 7, 24, 180, 181, 122, + 107, 29, 3, 116, 138, 73, 180, 181, 128, 203, + 203, 39, 201, 81, 42, 43, 207, 124, 203, 93, + 154, 155, 156, 56, 101, 207, 54, 55, 203, 128, + 98, 138, 60, 41, 102, 103, 64, 49, 50, 67, + 203, 119, 203, 121, 97, 57, 57, 154, 155, 156, + 142, 143, 144, 145, 146, 147, 207, 135, 203, 96, + 93, 89, 196, 197, 203, 139, 94, 141, 176, 203, + 176, 104, 60, 203, 208, 87, 204, 203, 90, 3, + 176, 4, 110, 4, 4, 3, 8, 3, 116, 196, + 197, 124, 165, 203, 79, 107, 203, 97, 131, 132, + 203, 208, 180, 181, 178, 179, 139, 140, 141, 203, + 8, 204, 124, 104, 203, 203, 203, 203, 107, 193, + 194, 195, 196, 197, 198, 199, 138, 201, 203, 3, + 201, 159, 160, 161, 56, 202, 71, 207, 3, 64, + 164, 204, 154, 155, 156, 178, 179, 7, 7, 182, + 183, 184, 185, 186, 7, 7, 189, 190, 56, 192, + 193, 194, 195, 196, 197, 198, 199, 7, 201, 107, + 176, 93, 203, 3, 204, 203, 4, 204, 204, 80, + 80, 80, 104, 102, 196, 197, 3, 102, 129, 53, + 204, 203, 80, 80, 204, 93, 208, 119, 108, 204, + 204, 204, 124, 80, 93, 204, 104, 102, 203, 7, + 132, 177, 129, 119, 204, 70, 203, 139, 140, 141, + 204, 119, 24, 359, 349, 473, 124, 515, 409, 249, + 8, 207, 370, 201, 132, 300, 363, 127, 607, 374, + 103, 139, 140, 141, 127, 277, 265, 570, -1, -1, + 139, -1, 141, -1, 8, -1, 178, 179, -1, -1, + 182, 183, 184, 185, 186, -1, -1, 189, 190, -1, + 192, 193, 194, 195, 196, 197, 198, 199, 56, 201, 178, 179, -1, -1, 182, 183, 184, 185, 186, 178, 179, 189, 190, -1, 192, 193, 194, 195, 196, 197, - 198, 199, 93, 201, -1, 194, 195, 196, 197, 198, - 199, -1, 201, 104, 178, 179, -1, -1, 182, 183, + 198, 199, 56, 201, -1, 194, 195, 196, 197, 198, + 199, -1, 201, -1, -1, 93, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 104, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 93, + -1, -1, -1, -1, -1, -1, 124, -1, -1, -1, + 104, -1, -1, -1, 132, -1, -1, -1, -1, -1, + -1, 139, 140, 141, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 56, -1, -1, -1, -1, 132, -1, + -1, -1, -1, -1, -1, 139, 140, 141, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 178, 179, -1, -1, 182, 183, 184, 185, 186, -1, + 93, 189, 190, -1, 192, 193, 194, 195, 196, 197, + 198, 199, -1, 201, 178, 179, -1, -1, 182, 183, 184, 185, 186, -1, -1, 189, 190, -1, 192, 193, - 194, 195, 196, 197, 198, 199, -1, 201, -1, -1, - -1, 132, -1, -1, -1, -1, -1, -1, 139, 140, - 141, -1, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 178, 179, -1, - -1, 182, 183, 184, 185, 186, -1, -1, 189, 190, - 0, 192, 193, 194, 195, 196, 197, 198, 199, 9, - 201, -1, 56, -1, -1, -1, -1, 17, 139, -1, - 141, -1, -1, -1, 24, -1, 9, -1, -1, 29, - -1, -1, -1, -1, 17, -1, -1, -1, -1, 39, - -1, 24, 42, 43, -1, -1, 29, -1, -1, 93, - -1, -1, -1, -1, 54, 55, 39, 178, 179, 42, - 43, -1, -1, -1, 64, -1, -1, 67, -1, -1, - -1, 54, 55, -1, 195, 196, 197, 198, 199, -1, - 201, 64, -1, -1, 67, -1, -1, -1, 132, 89, - -1, -1, -1, -1, 94, 139, -1, 141, -1, -1, - -1, -1, -1, -1, -1, -1, 89, -1, -1, -1, - 110, 94, -1, -1, -1, -1, 116, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 110, -1, -1, - -1, -1, -1, 116, 178, 179, -1, -1, -1, -1, - -1, 185, 186, -1, -1, 189, 190, -1, 192, 193, - 194, 195, 196, 197, 198, 199, -1, 201, -1, 159, - 160, 161, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 159, 160, 161 + 194, 195, 196, 197, 198, 199, 9, 201, -1, 132, + -1, -1, -1, -1, 17, -1, 139, -1, 141, -1, + -1, 24, -1, -1, -1, -1, 29, -1, -1, -1, + -1, -1, -1, -1, 93, -1, 39, -1, -1, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 54, 55, -1, -1, 178, 179, -1, -1, -1, + -1, 64, 185, 186, 67, -1, 189, 190, -1, 192, + 193, 194, 195, 196, 197, 198, 199, -1, 201, -1, + 139, -1, 141, -1, 13, -1, 89, -1, -1, -1, + -1, 94, -1, -1, -1, -1, -1, -1, 27, -1, + -1, -1, 31, 32, 33, 34, 35, 110, 37, -1, + -1, -1, -1, 116, -1, -1, 45, -1, -1, 178, + 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, 196, 197, 198, + 199, 70, 201, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 159, 160, 161, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, + -1, -1, 111, -1, 113, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 123, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 157 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1487,155 +1497,155 @@ static const yytype_int16 yystos[] = 3, 325, 3, 3, 325, 72, 82, 114, 97, 97, 101, 324, 325, 82, 203, 258, 325, 72, 82, 114, 21, 62, 3, 338, 339, 158, 218, 218, 218, 0, - 206, 344, 116, 214, 214, 60, 258, 259, 263, 3, - 205, 203, 97, 130, 231, 231, 231, 325, 3, 223, - 325, 126, 130, 244, 258, 259, 136, 97, 136, 244, - 244, 244, 325, 128, 207, 212, 100, 127, 276, 11, - 47, 83, 260, 261, 78, 260, 271, 3, 4, 5, - 6, 7, 50, 90, 107, 154, 155, 156, 196, 208, - 279, 280, 281, 282, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 4, 220, 124, 3, 326, 325, 325, - 85, 268, 96, 203, 251, 3, 253, 254, 48, 325, - 204, 204, 4, 224, 224, 224, 3, 325, 325, 258, - 339, 203, 7, 314, 14, 264, 256, 257, 258, 263, - 118, 262, 129, 256, 57, 74, 277, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 303, - 304, 305, 203, 4, 4, 313, 317, 204, 207, 48, - 134, 97, 128, 203, 251, 3, 48, 49, 50, 57, - 87, 124, 138, 196, 197, 203, 284, 285, 286, 287, - 288, 289, 290, 291, 293, 294, 295, 301, 302, 306, - 307, 308, 309, 310, 224, 3, 345, 65, 259, 182, - 207, 268, 94, 246, 247, 116, 203, 225, 225, 225, - 3, 215, 216, 265, 278, 283, 284, 271, 260, 272, - 273, 284, 271, 284, 118, 284, 122, 331, 332, 333, - 282, 303, 281, 325, 3, 255, 3, 173, 174, 175, - 232, 233, 234, 241, 128, 203, 205, 203, 203, 203, - 115, 284, 292, 48, 124, 285, 201, 285, 259, 284, - 119, 135, 180, 181, 8, 19, 56, 93, 104, 124, - 131, 132, 139, 140, 141, 178, 179, 182, 183, 184, - 185, 186, 189, 190, 192, 193, 194, 195, 196, 197, - 198, 199, 201, 101, 204, 207, 203, 284, 254, 41, - 203, 3, 26, 51, 107, 226, 227, 268, 203, 204, - 207, 97, 266, 267, 207, 3, 128, 329, 330, 277, - 256, 207, 92, 120, 274, 277, 57, 57, 64, 137, - 165, 176, 334, 333, 128, 203, 96, 13, 27, 31, - 32, 33, 34, 35, 37, 45, 70, 88, 90, 91, - 106, 111, 113, 123, 157, 235, 203, 176, 176, 204, - 207, 255, 204, 264, 3, 197, 259, 303, 284, 284, - 292, 95, 115, 121, 203, 124, 278, 204, 204, 284, - 284, 284, 284, 285, 285, 285, 285, 19, 104, 131, - 203, 107, 124, 285, 285, 285, 285, 285, 285, 285, + 206, 116, 214, 214, 60, 258, 259, 263, 3, 205, + 203, 97, 130, 231, 231, 231, 325, 3, 223, 325, + 126, 130, 244, 258, 259, 136, 97, 136, 244, 244, + 244, 325, 128, 207, 212, 100, 127, 276, 11, 47, + 83, 260, 261, 78, 260, 271, 3, 4, 5, 6, + 7, 50, 90, 107, 154, 155, 156, 196, 208, 279, + 280, 281, 282, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 4, 220, 124, 3, 326, 325, 325, 85, + 268, 96, 203, 251, 3, 253, 254, 48, 325, 204, + 204, 4, 224, 224, 224, 3, 325, 325, 258, 339, + 203, 7, 314, 14, 264, 256, 257, 258, 263, 118, + 262, 129, 256, 57, 74, 277, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 303, 304, + 305, 203, 4, 4, 313, 317, 204, 207, 48, 134, + 97, 128, 203, 251, 3, 48, 49, 50, 57, 87, + 124, 138, 196, 197, 203, 284, 285, 286, 287, 288, + 289, 290, 291, 293, 294, 295, 301, 302, 306, 307, + 308, 309, 310, 224, 3, 344, 65, 259, 182, 207, + 268, 94, 246, 247, 116, 203, 225, 225, 225, 3, + 215, 216, 265, 278, 283, 284, 271, 260, 272, 273, + 284, 271, 284, 118, 284, 122, 331, 332, 333, 282, + 303, 281, 325, 3, 255, 3, 173, 174, 175, 232, + 233, 234, 241, 128, 203, 205, 203, 203, 203, 115, + 284, 292, 48, 124, 285, 201, 285, 259, 284, 119, + 135, 180, 181, 8, 19, 56, 93, 104, 124, 131, + 132, 139, 140, 141, 178, 179, 182, 183, 184, 185, + 186, 189, 190, 192, 193, 194, 195, 196, 197, 198, + 199, 201, 101, 204, 207, 203, 284, 254, 41, 203, + 3, 26, 51, 107, 226, 227, 268, 203, 204, 207, + 97, 266, 267, 207, 3, 128, 329, 330, 277, 256, + 207, 92, 120, 274, 277, 57, 57, 64, 137, 165, + 176, 334, 333, 128, 203, 96, 13, 27, 31, 32, + 33, 34, 35, 37, 45, 70, 88, 90, 91, 106, + 111, 113, 123, 157, 235, 203, 176, 176, 204, 207, + 255, 204, 264, 3, 197, 259, 303, 284, 284, 292, + 95, 115, 121, 203, 124, 278, 204, 204, 284, 284, + 284, 284, 285, 285, 285, 285, 19, 104, 131, 203, + 107, 124, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 314, 325, 3, 280, 244, 226, 4, - 4, 223, 4, 204, 207, 280, 216, 203, 319, 320, - 321, 322, 323, 325, 340, 268, 283, 3, 273, 3, - 275, 331, 284, 284, 176, 165, 133, 162, 163, 335, - 235, 345, 224, 203, 203, 237, 203, 203, 203, 236, - 107, 124, 173, 174, 177, 238, 239, 240, 242, 345, - 203, 203, 233, 79, 296, 278, 203, 205, 204, 97, - 128, 112, 95, 121, 284, 284, 259, 202, 119, 285, - 285, 203, 259, 278, 107, 202, 204, 3, 204, 26, - 51, 227, 204, 255, 28, 68, 73, 80, 81, 98, - 103, 341, 207, 128, 327, 328, 329, 71, 269, 3, - 64, 345, 164, 204, 204, 7, 7, 7, 7, 7, - 107, 176, 325, 240, 242, 204, 345, 345, 203, 204, - 204, 264, 3, 284, 235, 284, 284, 121, 112, 204, - 285, 119, 259, 278, 204, 204, 4, 223, 204, 73, - 81, 98, 102, 103, 342, 102, 80, 80, 80, 102, - 320, 3, 129, 53, 270, 335, 204, 204, 207, 204, - 204, 204, 251, 204, 204, 108, 297, 296, 296, 278, - 204, 204, 121, 284, 285, 204, 204, 328, 80, 80, - 321, 80, 102, 321, 320, 203, 278, 284, 7, 242, - 129, 271, 204, 321, 84, 134, 345, 204, 278, 166, - 167, 168, 298, 299, 296, 203, 284, 343, 204, 204, - 7, 19, 169, 172, 300, 345, 170, 171, 300, 170, - 171, 204, 119, 300 + 285, 285, 314, 325, 3, 280, 244, 226, 4, 4, + 223, 4, 204, 207, 280, 216, 203, 319, 320, 321, + 322, 323, 325, 340, 268, 283, 3, 273, 3, 275, + 331, 284, 284, 176, 165, 133, 162, 163, 335, 235, + 344, 224, 203, 203, 237, 203, 203, 203, 236, 107, + 124, 173, 174, 177, 238, 239, 240, 242, 344, 203, + 203, 233, 79, 296, 278, 203, 205, 204, 97, 128, + 112, 95, 121, 284, 284, 259, 202, 119, 285, 285, + 203, 259, 278, 107, 202, 204, 3, 204, 26, 51, + 227, 204, 255, 28, 68, 73, 80, 81, 98, 103, + 341, 207, 128, 327, 328, 329, 71, 269, 3, 64, + 344, 164, 204, 204, 7, 7, 7, 7, 7, 107, + 176, 325, 240, 242, 204, 344, 344, 203, 204, 204, + 264, 3, 284, 235, 284, 284, 121, 112, 204, 285, + 119, 259, 278, 204, 204, 4, 223, 204, 73, 81, + 98, 102, 103, 342, 102, 80, 80, 80, 102, 320, + 3, 129, 53, 270, 335, 204, 204, 207, 204, 204, + 204, 251, 204, 204, 108, 297, 296, 296, 278, 204, + 204, 121, 284, 285, 204, 204, 328, 80, 80, 321, + 80, 102, 321, 320, 203, 278, 284, 7, 242, 129, + 271, 204, 321, 84, 134, 344, 204, 278, 166, 167, + 168, 298, 299, 296, 203, 284, 343, 204, 204, 7, + 19, 169, 172, 300, 344, 170, 171, 300, 170, 171, + 204, 119, 300 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_int16 yyr1[] = { - 0, 209, 210, 211, 211, 212, 212, 212, 212, 212, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, - 218, 219, 220, 221, 221, 222, 222, 223, 224, 225, - 225, 225, 226, 226, 226, 226, 226, 226, 227, 227, - 228, 228, 229, 229, 229, 230, 230, 230, 230, 230, - 231, 231, 232, 232, 233, 233, 234, 235, 235, 235, + 0, 209, 210, 211, 211, 211, 212, 212, 212, 212, + 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, + 218, 218, 219, 220, 221, 221, 222, 222, 223, 224, + 225, 225, 225, 226, 226, 226, 226, 226, 226, 227, + 227, 228, 228, 229, 229, 229, 230, 230, 230, 230, + 230, 231, 231, 232, 232, 233, 233, 234, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 235, 236, 236, 237, 237, 237, - 238, 238, 239, 239, 239, 239, 240, 240, 240, 240, - 241, 241, 241, 242, 243, 243, 243, 243, 244, 244, - 245, 246, 247, 248, 249, 250, 250, 251, 251, 252, - 253, 253, 254, 255, 255, 255, 256, 256, 257, 257, - 258, 258, 259, 259, 260, 261, 261, 261, 262, 262, - 263, 264, 264, 265, 266, 266, 267, 268, 268, 269, - 269, 270, 270, 271, 271, 272, 272, 273, 274, 274, - 274, 275, 275, 276, 276, 277, 277, 277, 277, 277, - 277, 278, 278, 279, 279, 280, 280, 281, 281, 282, - 282, 282, 283, 284, 284, 284, 284, 284, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, 285, 286, - 286, 287, 287, 287, 287, 287, 288, 288, 288, 288, + 235, 235, 235, 235, 235, 235, 236, 236, 237, 237, + 237, 238, 238, 239, 239, 239, 239, 240, 240, 240, + 240, 241, 241, 241, 242, 243, 243, 243, 243, 244, + 244, 245, 246, 247, 248, 249, 250, 250, 251, 251, + 252, 253, 253, 254, 255, 255, 255, 256, 256, 257, + 257, 258, 258, 259, 259, 260, 261, 261, 261, 262, + 262, 263, 264, 264, 265, 266, 266, 267, 268, 268, + 269, 269, 270, 270, 271, 271, 272, 272, 273, 274, + 274, 274, 275, 275, 276, 276, 277, 277, 277, 277, + 277, 277, 278, 278, 279, 279, 280, 280, 281, 281, + 282, 282, 282, 283, 284, 284, 284, 284, 284, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 286, 286, 287, 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 288, 288, 289, 289, 289, 289, 290, 290, 290, - 290, 291, 291, 291, 291, 292, 292, 293, 293, 294, - 294, 294, 294, 294, 294, 294, 294, 295, 295, 295, - 295, 296, 296, 297, 297, 298, 298, 298, 299, 299, - 299, 300, 300, 300, 300, 300, 301, 302, 303, 303, - 303, 303, 303, 303, 304, 304, 304, 304, 304, 304, - 305, 305, 306, 307, 308, 308, 309, 309, 309, 309, - 309, 309, 310, 310, 310, 310, 310, 310, 310, 311, - 312, 312, 313, 313, 314, 314, 315, 316, 317, 317, - 317, 318, 319, 319, 320, 320, 321, 321, 322, 322, - 323, 324, 325, 325, 326, 326, 327, 327, 328, 328, - 329, 329, 330, 330, 331, 331, 332, 332, 333, 333, - 334, 334, 334, 334, 335, 335, 335, 336, 336, 337, - 338, 338, 339, 340, 340, 340, 340, 340, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 342, 342, 342, - 342, 342, 342, 342, 343, 344, 344, 345, 345 + 288, 288, 288, 288, 289, 289, 289, 289, 290, 290, + 290, 290, 291, 291, 291, 291, 292, 292, 293, 293, + 294, 294, 294, 294, 294, 294, 294, 294, 295, 295, + 295, 295, 296, 296, 297, 297, 298, 298, 298, 299, + 299, 299, 300, 300, 300, 300, 300, 301, 302, 303, + 303, 303, 303, 303, 303, 304, 304, 304, 304, 304, + 304, 305, 305, 306, 307, 308, 308, 309, 309, 309, + 309, 309, 309, 310, 310, 310, 310, 310, 310, 310, + 311, 312, 312, 313, 313, 314, 314, 315, 316, 317, + 317, 317, 318, 319, 319, 320, 320, 321, 321, 322, + 322, 323, 324, 325, 325, 326, 326, 327, 327, 328, + 328, 329, 329, 330, 330, 331, 331, 332, 332, 333, + 333, 334, 334, 334, 334, 335, 335, 335, 336, 336, + 337, 338, 338, 339, 340, 340, 340, 340, 340, 341, + 341, 341, 341, 341, 341, 341, 341, 341, 342, 342, + 342, 342, 342, 342, 342, 343, 344, 344 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_int8 yyr2[] = { - 0, 2, 2, 1, 3, 2, 2, 1, 1, 1, + 0, 2, 1, 1, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 5, 0, 1, 3, 1, 4, 2, 2, 2, 1, - 0, 4, 1, 2, 5, 7, 6, 1, 1, 4, - 3, 0, 4, 2, 4, 2, 3, 1, 2, 2, - 5, 5, 2, 3, 2, 8, 7, 6, 9, 7, - 3, 0, 1, 3, 1, 1, 3, 1, 1, 4, - 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 4, 3, 0, 5, 3, 0, - 1, 0, 1, 2, 1, 2, 2, 1, 1, 2, - 5, 4, 6, 3, 4, 4, 3, 4, 2, 0, - 5, 1, 4, 4, 2, 8, 5, 3, 0, 5, - 1, 3, 3, 2, 2, 6, 1, 1, 1, 3, - 3, 3, 4, 6, 2, 1, 1, 1, 1, 0, - 8, 1, 0, 1, 1, 0, 2, 2, 0, 3, - 0, 2, 0, 3, 0, 1, 3, 3, 1, 1, - 0, 0, 2, 2, 0, 2, 2, 4, 2, 4, - 0, 1, 3, 1, 0, 1, 3, 1, 6, 1, - 2, 2, 2, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 2, 2, 2, 3, 4, 1, 3, 3, 3, + 1, 5, 0, 1, 3, 1, 4, 2, 2, 2, + 1, 0, 4, 1, 2, 5, 7, 6, 1, 1, + 4, 3, 0, 4, 2, 4, 2, 3, 1, 2, + 2, 5, 5, 2, 3, 2, 8, 7, 6, 9, + 7, 3, 0, 1, 3, 1, 1, 3, 1, 1, + 4, 4, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 4, 3, 0, 5, 3, + 0, 1, 0, 1, 2, 1, 2, 2, 1, 1, + 2, 5, 4, 6, 3, 4, 4, 3, 4, 2, + 0, 5, 1, 4, 4, 2, 8, 5, 3, 0, + 5, 1, 3, 3, 2, 2, 6, 1, 1, 1, + 3, 3, 3, 4, 6, 2, 1, 1, 1, 1, + 0, 8, 1, 0, 1, 1, 0, 2, 2, 0, + 3, 0, 2, 0, 3, 0, 1, 3, 3, 1, + 1, 0, 0, 2, 2, 0, 2, 2, 4, 2, + 4, 0, 1, 3, 1, 0, 1, 3, 1, 6, + 1, 2, 2, 2, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 1, 2, 2, 2, 3, 4, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 3, 3, 3, 3, 3, 3, 5, 6, 5, - 6, 4, 6, 3, 5, 4, 5, 4, 5, 3, - 3, 3, 3, 3, 3, 3, 3, 4, 6, 6, - 8, 6, 0, 3, 0, 2, 5, 0, 1, 1, - 1, 2, 2, 2, 2, 1, 6, 6, 1, 1, + 3, 4, 3, 3, 3, 3, 3, 3, 5, 6, + 5, 6, 4, 6, 3, 5, 4, 5, 4, 5, + 3, 3, 3, 3, 3, 3, 3, 3, 4, 6, + 6, 8, 6, 0, 3, 0, 2, 5, 0, 1, + 1, 1, 2, 2, 2, 2, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 4, 4, 5, 6, 1, 1, 3, 5, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, - 2, 1, 1, 3, 1, 1, 1, 4, 1, 3, - 2, 1, 1, 3, 1, 0, 1, 5, 1, 0, - 2, 1, 1, 0, 1, 0, 1, 2, 3, 5, - 1, 3, 1, 2, 2, 1, 0, 1, 0, 2, - 1, 3, 3, 4, 5, 4, 6, 8, 1, 2, - 1, 2, 1, 2, 1, 1, 0, 1, 2, 1, - 2, 1, 2, 1, 1, 1, 0, 1, 3 + 1, 1, 1, 4, 4, 5, 6, 1, 1, 3, + 5, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 3, 2, 1, 1, 3, 1, 1, 1, 4, 1, + 3, 2, 1, 1, 3, 1, 0, 1, 5, 1, + 0, 2, 1, 1, 0, 1, 0, 1, 2, 3, + 5, 1, 3, 1, 2, 2, 1, 0, 1, 0, + 2, 1, 3, 3, 4, 5, 4, 6, 8, 1, + 2, 1, 2, 1, 2, 1, 1, 0, 1, 2, + 1, 2, 1, 2, 1, 1, 1, 3 }; @@ -2189,31 +2199,31 @@ yydestruct (const char *yymsg, case YYSYMBOL_IDENTIFIER: /* IDENTIFIER */ #line 194 "bison_parser.y" { free(((*yyvaluep).sval)); } -#line 2193 "bison_parser.cpp" +#line 2204 "bison_parser.cpp" break; case YYSYMBOL_STRING: /* STRING */ #line 194 "bison_parser.y" { free(((*yyvaluep).sval)); } -#line 2199 "bison_parser.cpp" +#line 2210 "bison_parser.cpp" break; case YYSYMBOL_BIGINTVAL: /* BIGINTVAL */ #line 194 "bison_parser.y" { free(((*yyvaluep).sval)); } -#line 2205 "bison_parser.cpp" +#line 2216 "bison_parser.cpp" break; case YYSYMBOL_FLOATVAL: /* FLOATVAL */ #line 181 "bison_parser.y" { } -#line 2211 "bison_parser.cpp" +#line 2222 "bison_parser.cpp" break; case YYSYMBOL_INTVAL: /* INTVAL */ #line 181 "bison_parser.y" { } -#line 2217 "bison_parser.cpp" +#line 2228 "bison_parser.cpp" break; case YYSYMBOL_statement_list: /* statement_list */ @@ -2226,19 +2236,19 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).stmt_vec)); } -#line 2230 "bison_parser.cpp" +#line 2241 "bison_parser.cpp" break; case YYSYMBOL_statement: /* statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).statement)); } -#line 2236 "bison_parser.cpp" +#line 2247 "bison_parser.cpp" break; case YYSYMBOL_preparable_statement: /* preparable_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).statement)); } -#line 2242 "bison_parser.cpp" +#line 2253 "bison_parser.cpp" break; case YYSYMBOL_opt_hints: /* opt_hints */ @@ -2251,7 +2261,7 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2255 "bison_parser.cpp" +#line 2266 "bison_parser.cpp" break; case YYSYMBOL_hint_list: /* hint_list */ @@ -2264,67 +2274,67 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2268 "bison_parser.cpp" +#line 2279 "bison_parser.cpp" break; case YYSYMBOL_hint: /* hint */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2274 "bison_parser.cpp" +#line 2285 "bison_parser.cpp" break; case YYSYMBOL_transaction_statement: /* transaction_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).transaction_stmt)); } -#line 2280 "bison_parser.cpp" +#line 2291 "bison_parser.cpp" break; case YYSYMBOL_prepare_statement: /* prepare_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).prep_stmt)); } -#line 2286 "bison_parser.cpp" +#line 2297 "bison_parser.cpp" break; case YYSYMBOL_prepare_target_query: /* prepare_target_query */ #line 194 "bison_parser.y" { free(((*yyvaluep).sval)); } -#line 2292 "bison_parser.cpp" +#line 2303 "bison_parser.cpp" break; case YYSYMBOL_execute_statement: /* execute_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).exec_stmt)); } -#line 2298 "bison_parser.cpp" +#line 2309 "bison_parser.cpp" break; case YYSYMBOL_import_statement: /* import_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).import_stmt)); } -#line 2304 "bison_parser.cpp" +#line 2315 "bison_parser.cpp" break; case YYSYMBOL_file_type: /* file_type */ #line 181 "bison_parser.y" { } -#line 2310 "bison_parser.cpp" +#line 2321 "bison_parser.cpp" break; case YYSYMBOL_file_path: /* file_path */ #line 194 "bison_parser.y" { free(((*yyvaluep).sval)); } -#line 2316 "bison_parser.cpp" +#line 2327 "bison_parser.cpp" break; case YYSYMBOL_opt_import_export_options: /* opt_import_export_options */ #line 207 "bison_parser.y" { delete (((*yyvaluep).import_export_option_t)); } -#line 2322 "bison_parser.cpp" +#line 2333 "bison_parser.cpp" break; case YYSYMBOL_import_export_options: /* import_export_options */ #line 207 "bison_parser.y" { delete (((*yyvaluep).import_export_option_t)); } -#line 2328 "bison_parser.cpp" +#line 2339 "bison_parser.cpp" break; case YYSYMBOL_csv_option: /* csv_option */ @@ -2333,31 +2343,31 @@ yydestruct (const char *yymsg, free(((*yyvaluep).csv_option_t)->second); delete (((*yyvaluep).csv_option_t)); } -#line 2337 "bison_parser.cpp" +#line 2348 "bison_parser.cpp" break; case YYSYMBOL_export_statement: /* export_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).export_stmt)); } -#line 2343 "bison_parser.cpp" +#line 2354 "bison_parser.cpp" break; case YYSYMBOL_show_statement: /* show_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).show_stmt)); } -#line 2349 "bison_parser.cpp" +#line 2360 "bison_parser.cpp" break; case YYSYMBOL_create_statement: /* create_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).create_stmt)); } -#line 2355 "bison_parser.cpp" +#line 2366 "bison_parser.cpp" break; case YYSYMBOL_opt_not_exists: /* opt_not_exists */ #line 181 "bison_parser.y" { } -#line 2361 "bison_parser.cpp" +#line 2372 "bison_parser.cpp" break; case YYSYMBOL_table_elem_commalist: /* table_elem_commalist */ @@ -2370,115 +2380,115 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).table_element_vec)); } -#line 2374 "bison_parser.cpp" +#line 2385 "bison_parser.cpp" break; case YYSYMBOL_table_elem: /* table_elem */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table_element_t)); } -#line 2380 "bison_parser.cpp" +#line 2391 "bison_parser.cpp" break; case YYSYMBOL_column_def: /* column_def */ #line 207 "bison_parser.y" { delete (((*yyvaluep).column_t)); } -#line 2386 "bison_parser.cpp" +#line 2397 "bison_parser.cpp" break; case YYSYMBOL_column_type: /* column_type */ #line 181 "bison_parser.y" { } -#line 2392 "bison_parser.cpp" +#line 2403 "bison_parser.cpp" break; case YYSYMBOL_opt_time_precision: /* opt_time_precision */ #line 181 "bison_parser.y" { } -#line 2398 "bison_parser.cpp" +#line 2409 "bison_parser.cpp" break; case YYSYMBOL_opt_decimal_specification: /* opt_decimal_specification */ #line 207 "bison_parser.y" { delete (((*yyvaluep).ival_pair)); } -#line 2404 "bison_parser.cpp" +#line 2415 "bison_parser.cpp" break; case YYSYMBOL_opt_column_constraints: /* opt_column_constraints */ #line 207 "bison_parser.y" { delete (((*yyvaluep).column_constraints_t)); } -#line 2410 "bison_parser.cpp" +#line 2421 "bison_parser.cpp" break; case YYSYMBOL_column_constraints: /* column_constraints */ #line 207 "bison_parser.y" { delete (((*yyvaluep).column_constraints_t)); } -#line 2416 "bison_parser.cpp" +#line 2427 "bison_parser.cpp" break; case YYSYMBOL_column_constraint: /* column_constraint */ #line 181 "bison_parser.y" { } -#line 2422 "bison_parser.cpp" +#line 2433 "bison_parser.cpp" break; case YYSYMBOL_table_constraint: /* table_constraint */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table_constraint_t)); } -#line 2428 "bison_parser.cpp" +#line 2439 "bison_parser.cpp" break; case YYSYMBOL_references_spec: /* references_spec */ #line 207 "bison_parser.y" { delete (((*yyvaluep).references_spec_t)); } -#line 2434 "bison_parser.cpp" +#line 2445 "bison_parser.cpp" break; case YYSYMBOL_drop_statement: /* drop_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).drop_stmt)); } -#line 2440 "bison_parser.cpp" +#line 2451 "bison_parser.cpp" break; case YYSYMBOL_opt_exists: /* opt_exists */ #line 181 "bison_parser.y" { } -#line 2446 "bison_parser.cpp" +#line 2457 "bison_parser.cpp" break; case YYSYMBOL_alter_statement: /* alter_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).alter_stmt)); } -#line 2452 "bison_parser.cpp" +#line 2463 "bison_parser.cpp" break; case YYSYMBOL_alter_action: /* alter_action */ #line 207 "bison_parser.y" { delete (((*yyvaluep).alter_action_t)); } -#line 2458 "bison_parser.cpp" +#line 2469 "bison_parser.cpp" break; case YYSYMBOL_drop_action: /* drop_action */ #line 207 "bison_parser.y" { delete (((*yyvaluep).drop_action_t)); } -#line 2464 "bison_parser.cpp" +#line 2475 "bison_parser.cpp" break; case YYSYMBOL_delete_statement: /* delete_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).delete_stmt)); } -#line 2470 "bison_parser.cpp" +#line 2481 "bison_parser.cpp" break; case YYSYMBOL_truncate_statement: /* truncate_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).delete_stmt)); } -#line 2476 "bison_parser.cpp" +#line 2487 "bison_parser.cpp" break; case YYSYMBOL_insert_statement: /* insert_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).insert_stmt)); } -#line 2482 "bison_parser.cpp" +#line 2493 "bison_parser.cpp" break; case YYSYMBOL_opt_column_list: /* opt_column_list */ @@ -2491,13 +2501,13 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).str_vec)); } -#line 2495 "bison_parser.cpp" +#line 2506 "bison_parser.cpp" break; case YYSYMBOL_update_statement: /* update_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).update_stmt)); } -#line 2501 "bison_parser.cpp" +#line 2512 "bison_parser.cpp" break; case YYSYMBOL_update_clause_commalist: /* update_clause_commalist */ @@ -2510,73 +2520,73 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).update_vec)); } -#line 2514 "bison_parser.cpp" +#line 2525 "bison_parser.cpp" break; case YYSYMBOL_update_clause: /* update_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).update_t)); } -#line 2520 "bison_parser.cpp" +#line 2531 "bison_parser.cpp" break; case YYSYMBOL_select_statement: /* select_statement */ #line 207 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } -#line 2526 "bison_parser.cpp" +#line 2537 "bison_parser.cpp" break; case YYSYMBOL_select_within_set_operation: /* select_within_set_operation */ #line 207 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } -#line 2532 "bison_parser.cpp" +#line 2543 "bison_parser.cpp" break; case YYSYMBOL_select_within_set_operation_no_parentheses: /* select_within_set_operation_no_parentheses */ #line 207 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } -#line 2538 "bison_parser.cpp" +#line 2549 "bison_parser.cpp" break; case YYSYMBOL_select_with_paren: /* select_with_paren */ #line 207 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } -#line 2544 "bison_parser.cpp" +#line 2555 "bison_parser.cpp" break; case YYSYMBOL_select_no_paren: /* select_no_paren */ #line 207 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } -#line 2550 "bison_parser.cpp" +#line 2561 "bison_parser.cpp" break; case YYSYMBOL_set_operator: /* set_operator */ #line 207 "bison_parser.y" { delete (((*yyvaluep).set_operator_t)); } -#line 2556 "bison_parser.cpp" +#line 2567 "bison_parser.cpp" break; case YYSYMBOL_set_type: /* set_type */ #line 207 "bison_parser.y" { delete (((*yyvaluep).set_operator_t)); } -#line 2562 "bison_parser.cpp" +#line 2573 "bison_parser.cpp" break; case YYSYMBOL_opt_all: /* opt_all */ #line 181 "bison_parser.y" { } -#line 2568 "bison_parser.cpp" +#line 2579 "bison_parser.cpp" break; case YYSYMBOL_select_clause: /* select_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } -#line 2574 "bison_parser.cpp" +#line 2585 "bison_parser.cpp" break; case YYSYMBOL_opt_distinct: /* opt_distinct */ #line 181 "bison_parser.y" { } -#line 2580 "bison_parser.cpp" +#line 2591 "bison_parser.cpp" break; case YYSYMBOL_select_list: /* select_list */ @@ -2589,37 +2599,37 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2593 "bison_parser.cpp" +#line 2604 "bison_parser.cpp" break; case YYSYMBOL_opt_from_clause: /* opt_from_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2599 "bison_parser.cpp" +#line 2610 "bison_parser.cpp" break; case YYSYMBOL_from_clause: /* from_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2605 "bison_parser.cpp" +#line 2616 "bison_parser.cpp" break; case YYSYMBOL_opt_where: /* opt_where */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2611 "bison_parser.cpp" +#line 2622 "bison_parser.cpp" break; case YYSYMBOL_opt_group: /* opt_group */ #line 207 "bison_parser.y" { delete (((*yyvaluep).group_t)); } -#line 2617 "bison_parser.cpp" +#line 2628 "bison_parser.cpp" break; case YYSYMBOL_opt_having: /* opt_having */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2623 "bison_parser.cpp" +#line 2634 "bison_parser.cpp" break; case YYSYMBOL_opt_order: /* opt_order */ @@ -2632,7 +2642,7 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).order_vec)); } -#line 2636 "bison_parser.cpp" +#line 2647 "bison_parser.cpp" break; case YYSYMBOL_order_list: /* order_list */ @@ -2645,37 +2655,37 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).order_vec)); } -#line 2649 "bison_parser.cpp" +#line 2660 "bison_parser.cpp" break; case YYSYMBOL_order_desc: /* order_desc */ #line 207 "bison_parser.y" { delete (((*yyvaluep).order)); } -#line 2655 "bison_parser.cpp" +#line 2666 "bison_parser.cpp" break; case YYSYMBOL_opt_order_type: /* opt_order_type */ #line 181 "bison_parser.y" { } -#line 2661 "bison_parser.cpp" +#line 2672 "bison_parser.cpp" break; case YYSYMBOL_opt_null_ordering: /* opt_null_ordering */ #line 181 "bison_parser.y" { } -#line 2667 "bison_parser.cpp" +#line 2678 "bison_parser.cpp" break; case YYSYMBOL_opt_top: /* opt_top */ #line 207 "bison_parser.y" { delete (((*yyvaluep).limit)); } -#line 2673 "bison_parser.cpp" +#line 2684 "bison_parser.cpp" break; case YYSYMBOL_opt_limit: /* opt_limit */ #line 207 "bison_parser.y" { delete (((*yyvaluep).limit)); } -#line 2679 "bison_parser.cpp" +#line 2690 "bison_parser.cpp" break; case YYSYMBOL_expr_list: /* expr_list */ @@ -2688,7 +2698,7 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2692 "bison_parser.cpp" +#line 2703 "bison_parser.cpp" break; case YYSYMBOL_opt_extended_literal_list: /* opt_extended_literal_list */ @@ -2701,7 +2711,7 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2705 "bison_parser.cpp" +#line 2716 "bison_parser.cpp" break; case YYSYMBOL_extended_literal_list: /* extended_literal_list */ @@ -2714,103 +2724,103 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2718 "bison_parser.cpp" +#line 2729 "bison_parser.cpp" break; case YYSYMBOL_casted_extended_literal: /* casted_extended_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2724 "bison_parser.cpp" +#line 2735 "bison_parser.cpp" break; case YYSYMBOL_extended_literal: /* extended_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2730 "bison_parser.cpp" +#line 2741 "bison_parser.cpp" break; case YYSYMBOL_expr_alias: /* expr_alias */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2736 "bison_parser.cpp" +#line 2747 "bison_parser.cpp" break; case YYSYMBOL_expr: /* expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2742 "bison_parser.cpp" +#line 2753 "bison_parser.cpp" break; case YYSYMBOL_operand: /* operand */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2748 "bison_parser.cpp" +#line 2759 "bison_parser.cpp" break; case YYSYMBOL_scalar_expr: /* scalar_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2754 "bison_parser.cpp" +#line 2765 "bison_parser.cpp" break; case YYSYMBOL_unary_expr: /* unary_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2760 "bison_parser.cpp" +#line 2771 "bison_parser.cpp" break; case YYSYMBOL_binary_expr: /* binary_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2766 "bison_parser.cpp" +#line 2777 "bison_parser.cpp" break; case YYSYMBOL_logic_expr: /* logic_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2772 "bison_parser.cpp" +#line 2783 "bison_parser.cpp" break; case YYSYMBOL_in_expr: /* in_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2778 "bison_parser.cpp" +#line 2789 "bison_parser.cpp" break; case YYSYMBOL_case_expr: /* case_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2784 "bison_parser.cpp" +#line 2795 "bison_parser.cpp" break; case YYSYMBOL_case_list: /* case_list */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2790 "bison_parser.cpp" +#line 2801 "bison_parser.cpp" break; case YYSYMBOL_exists_expr: /* exists_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2796 "bison_parser.cpp" +#line 2807 "bison_parser.cpp" break; case YYSYMBOL_comp_expr: /* comp_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2802 "bison_parser.cpp" +#line 2813 "bison_parser.cpp" break; case YYSYMBOL_function_expr: /* function_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2808 "bison_parser.cpp" +#line 2819 "bison_parser.cpp" break; case YYSYMBOL_opt_window: /* opt_window */ #line 207 "bison_parser.y" { delete (((*yyvaluep).window_description)); } -#line 2814 "bison_parser.cpp" +#line 2825 "bison_parser.cpp" break; case YYSYMBOL_opt_partition: /* opt_partition */ @@ -2823,151 +2833,151 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).expr_vec)); } -#line 2827 "bison_parser.cpp" +#line 2838 "bison_parser.cpp" break; case YYSYMBOL_opt_frame_clause: /* opt_frame_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).frame_description)); } -#line 2833 "bison_parser.cpp" +#line 2844 "bison_parser.cpp" break; case YYSYMBOL_frame_type: /* frame_type */ #line 181 "bison_parser.y" { } -#line 2839 "bison_parser.cpp" +#line 2850 "bison_parser.cpp" break; case YYSYMBOL_frame_bound: /* frame_bound */ #line 207 "bison_parser.y" { delete (((*yyvaluep).frame_bound)); } -#line 2845 "bison_parser.cpp" +#line 2856 "bison_parser.cpp" break; case YYSYMBOL_extract_expr: /* extract_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2851 "bison_parser.cpp" +#line 2862 "bison_parser.cpp" break; case YYSYMBOL_cast_expr: /* cast_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2857 "bison_parser.cpp" +#line 2868 "bison_parser.cpp" break; case YYSYMBOL_datetime_field: /* datetime_field */ #line 181 "bison_parser.y" { } -#line 2863 "bison_parser.cpp" +#line 2874 "bison_parser.cpp" break; case YYSYMBOL_datetime_field_plural: /* datetime_field_plural */ #line 181 "bison_parser.y" { } -#line 2869 "bison_parser.cpp" +#line 2880 "bison_parser.cpp" break; case YYSYMBOL_duration_field: /* duration_field */ #line 181 "bison_parser.y" { } -#line 2875 "bison_parser.cpp" +#line 2886 "bison_parser.cpp" break; case YYSYMBOL_array_expr: /* array_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2881 "bison_parser.cpp" +#line 2892 "bison_parser.cpp" break; case YYSYMBOL_array_index: /* array_index */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2887 "bison_parser.cpp" +#line 2898 "bison_parser.cpp" break; case YYSYMBOL_between_expr: /* between_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2893 "bison_parser.cpp" +#line 2904 "bison_parser.cpp" break; case YYSYMBOL_column_name: /* column_name */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2899 "bison_parser.cpp" +#line 2910 "bison_parser.cpp" break; case YYSYMBOL_literal: /* literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2905 "bison_parser.cpp" +#line 2916 "bison_parser.cpp" break; case YYSYMBOL_string_literal: /* string_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2911 "bison_parser.cpp" +#line 2922 "bison_parser.cpp" break; case YYSYMBOL_bool_literal: /* bool_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2917 "bison_parser.cpp" +#line 2928 "bison_parser.cpp" break; case YYSYMBOL_num_literal: /* num_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2923 "bison_parser.cpp" +#line 2934 "bison_parser.cpp" break; case YYSYMBOL_int_literal: /* int_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2929 "bison_parser.cpp" +#line 2940 "bison_parser.cpp" break; case YYSYMBOL_null_literal: /* null_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2935 "bison_parser.cpp" +#line 2946 "bison_parser.cpp" break; case YYSYMBOL_date_literal: /* date_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2941 "bison_parser.cpp" +#line 2952 "bison_parser.cpp" break; case YYSYMBOL_interval_literal: /* interval_literal */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2947 "bison_parser.cpp" +#line 2958 "bison_parser.cpp" break; case YYSYMBOL_param_expr: /* param_expr */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 2953 "bison_parser.cpp" +#line 2964 "bison_parser.cpp" break; case YYSYMBOL_table_ref: /* table_ref */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2959 "bison_parser.cpp" +#line 2970 "bison_parser.cpp" break; case YYSYMBOL_table_ref_atomic: /* table_ref_atomic */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2965 "bison_parser.cpp" +#line 2976 "bison_parser.cpp" break; case YYSYMBOL_nonjoin_table_ref_atomic: /* nonjoin_table_ref_atomic */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2971 "bison_parser.cpp" +#line 2982 "bison_parser.cpp" break; case YYSYMBOL_table_ref_commalist: /* table_ref_commalist */ @@ -2980,19 +2990,19 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).table_vec)); } -#line 2984 "bison_parser.cpp" +#line 2995 "bison_parser.cpp" break; case YYSYMBOL_table_ref_name: /* table_ref_name */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2990 "bison_parser.cpp" +#line 3001 "bison_parser.cpp" break; case YYSYMBOL_table_ref_name_no_alias: /* table_ref_name_no_alias */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 2996 "bison_parser.cpp" +#line 3007 "bison_parser.cpp" break; case YYSYMBOL_table_name: /* table_name */ @@ -3001,115 +3011,115 @@ yydestruct (const char *yymsg, free(((*yyvaluep).table_name).name); free(((*yyvaluep).table_name).schema); } -#line 3005 "bison_parser.cpp" +#line 3016 "bison_parser.cpp" break; case YYSYMBOL_opt_index_name: /* opt_index_name */ #line 194 "bison_parser.y" { free(((*yyvaluep).sval)); } -#line 3011 "bison_parser.cpp" +#line 3022 "bison_parser.cpp" break; case YYSYMBOL_table_alias: /* table_alias */ #line 207 "bison_parser.y" { delete (((*yyvaluep).alias_t)); } -#line 3017 "bison_parser.cpp" +#line 3028 "bison_parser.cpp" break; case YYSYMBOL_opt_table_alias: /* opt_table_alias */ #line 207 "bison_parser.y" { delete (((*yyvaluep).alias_t)); } -#line 3023 "bison_parser.cpp" +#line 3034 "bison_parser.cpp" break; case YYSYMBOL_alias: /* alias */ #line 207 "bison_parser.y" { delete (((*yyvaluep).alias_t)); } -#line 3029 "bison_parser.cpp" +#line 3040 "bison_parser.cpp" break; case YYSYMBOL_opt_alias: /* opt_alias */ #line 207 "bison_parser.y" { delete (((*yyvaluep).alias_t)); } -#line 3035 "bison_parser.cpp" +#line 3046 "bison_parser.cpp" break; case YYSYMBOL_opt_locking_clause: /* opt_locking_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).locking_clause_vec)); } -#line 3041 "bison_parser.cpp" +#line 3052 "bison_parser.cpp" break; case YYSYMBOL_opt_locking_clause_list: /* opt_locking_clause_list */ #line 207 "bison_parser.y" { delete (((*yyvaluep).locking_clause_vec)); } -#line 3047 "bison_parser.cpp" +#line 3058 "bison_parser.cpp" break; case YYSYMBOL_locking_clause: /* locking_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).locking_t)); } -#line 3053 "bison_parser.cpp" +#line 3064 "bison_parser.cpp" break; case YYSYMBOL_row_lock_mode: /* row_lock_mode */ #line 181 "bison_parser.y" { } -#line 3059 "bison_parser.cpp" +#line 3070 "bison_parser.cpp" break; case YYSYMBOL_opt_row_lock_policy: /* opt_row_lock_policy */ #line 181 "bison_parser.y" { } -#line 3065 "bison_parser.cpp" +#line 3076 "bison_parser.cpp" break; case YYSYMBOL_opt_with_clause: /* opt_with_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).with_description_vec)); } -#line 3071 "bison_parser.cpp" +#line 3082 "bison_parser.cpp" break; case YYSYMBOL_with_clause: /* with_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).with_description_vec)); } -#line 3077 "bison_parser.cpp" +#line 3088 "bison_parser.cpp" break; case YYSYMBOL_with_description_list: /* with_description_list */ #line 207 "bison_parser.y" { delete (((*yyvaluep).with_description_vec)); } -#line 3083 "bison_parser.cpp" +#line 3094 "bison_parser.cpp" break; case YYSYMBOL_with_description: /* with_description */ #line 207 "bison_parser.y" { delete (((*yyvaluep).with_description_t)); } -#line 3089 "bison_parser.cpp" +#line 3100 "bison_parser.cpp" break; case YYSYMBOL_join_clause: /* join_clause */ #line 207 "bison_parser.y" { delete (((*yyvaluep).table)); } -#line 3095 "bison_parser.cpp" +#line 3106 "bison_parser.cpp" break; case YYSYMBOL_opt_join_type: /* opt_join_type */ #line 181 "bison_parser.y" { } -#line 3101 "bison_parser.cpp" +#line 3112 "bison_parser.cpp" break; case YYSYMBOL_natural_join_type: /* natural_join_type */ #line 181 "bison_parser.y" { } -#line 3107 "bison_parser.cpp" +#line 3118 "bison_parser.cpp" break; case YYSYMBOL_join_condition: /* join_condition */ #line 207 "bison_parser.y" { delete (((*yyvaluep).expr)); } -#line 3113 "bison_parser.cpp" +#line 3124 "bison_parser.cpp" break; case YYSYMBOL_ident_commalist: /* ident_commalist */ @@ -3122,7 +3132,7 @@ yydestruct (const char *yymsg, } delete (((*yyvaluep).str_vec)); } -#line 3126 "bison_parser.cpp" +#line 3137 "bison_parser.cpp" break; default: @@ -3229,7 +3239,7 @@ YYLTYPE yylloc = yyloc_default; yylloc.string_length = 0; } -#line 3233 "bison_parser.cpp" +#line 3244 "bison_parser.cpp" yylsp[0] = yylloc; goto yysetstate; @@ -3438,10 +3448,10 @@ YYLTYPE yylloc = yyloc_default; YY_REDUCE_PRINT (yyn); switch (yyn) { - case 2: /* input: statement_list opt_semicolon */ + case 2: /* input: statement_list */ #line 349 "bison_parser.y" - { - for (SQLStatement* stmt : *(yyvsp[-1].stmt_vec)) { + { + for (SQLStatement* stmt : *(yyvsp[0].stmt_vec)) { // Transfers ownership of the statement. result->addStatement(stmt); } @@ -3455,9 +3465,9 @@ YYLTYPE yylloc = yyloc_default; ++param_id; } } - delete (yyvsp[-1].stmt_vec); + delete (yyvsp[0].stmt_vec); } -#line 3461 "bison_parser.cpp" +#line 3472 "bison_parser.cpp" break; case 3: /* statement_list: statement */ @@ -3468,225 +3478,234 @@ YYLTYPE yylloc = yyloc_default; (yyval.stmt_vec) = new std::vector(); (yyval.stmt_vec)->push_back((yyvsp[0].statement)); } -#line 3472 "bison_parser.cpp" +#line 3483 "bison_parser.cpp" break; - case 4: /* statement_list: statement_list ';' statement */ + case 4: /* statement_list: statement_list ';' */ #line 374 "bison_parser.y" + { + yylloc.string_length = 0; + (yyval.stmt_vec) = (yyvsp[-1].stmt_vec); +} +#line 3492 "bison_parser.cpp" + break; + + case 5: /* statement_list: statement_list ';' statement */ +#line 378 "bison_parser.y" { (yyvsp[0].statement)->stringLength = yylloc.string_length; yylloc.string_length = 0; (yyvsp[-2].stmt_vec)->push_back((yyvsp[0].statement)); (yyval.stmt_vec) = (yyvsp[-2].stmt_vec); } -#line 3483 "bison_parser.cpp" +#line 3503 "bison_parser.cpp" break; - case 5: /* statement: prepare_statement opt_hints */ -#line 381 "bison_parser.y" + case 6: /* statement: prepare_statement opt_hints */ +#line 385 "bison_parser.y" { (yyval.statement) = (yyvsp[-1].prep_stmt); (yyval.statement)->hints = (yyvsp[0].expr_vec); } -#line 3492 "bison_parser.cpp" +#line 3512 "bison_parser.cpp" break; - case 6: /* statement: preparable_statement opt_hints */ -#line 385 "bison_parser.y" + case 7: /* statement: preparable_statement opt_hints */ +#line 389 "bison_parser.y" { (yyval.statement) = (yyvsp[-1].statement); (yyval.statement)->hints = (yyvsp[0].expr_vec); } -#line 3501 "bison_parser.cpp" +#line 3521 "bison_parser.cpp" break; - case 7: /* statement: show_statement */ -#line 389 "bison_parser.y" + case 8: /* statement: show_statement */ +#line 393 "bison_parser.y" { (yyval.statement) = (yyvsp[0].show_stmt); } -#line 3507 "bison_parser.cpp" +#line 3527 "bison_parser.cpp" break; - case 8: /* statement: import_statement */ -#line 390 "bison_parser.y" + case 9: /* statement: import_statement */ +#line 394 "bison_parser.y" { (yyval.statement) = (yyvsp[0].import_stmt); } -#line 3513 "bison_parser.cpp" +#line 3533 "bison_parser.cpp" break; - case 9: /* statement: export_statement */ -#line 391 "bison_parser.y" + case 10: /* statement: export_statement */ +#line 395 "bison_parser.y" { (yyval.statement) = (yyvsp[0].export_stmt); } -#line 3519 "bison_parser.cpp" +#line 3539 "bison_parser.cpp" break; - case 10: /* preparable_statement: select_statement */ -#line 393 "bison_parser.y" + case 11: /* preparable_statement: select_statement */ +#line 397 "bison_parser.y" { (yyval.statement) = (yyvsp[0].select_stmt); } -#line 3525 "bison_parser.cpp" +#line 3545 "bison_parser.cpp" break; - case 11: /* preparable_statement: create_statement */ -#line 394 "bison_parser.y" + case 12: /* preparable_statement: create_statement */ +#line 398 "bison_parser.y" { (yyval.statement) = (yyvsp[0].create_stmt); } -#line 3531 "bison_parser.cpp" +#line 3551 "bison_parser.cpp" break; - case 12: /* preparable_statement: insert_statement */ -#line 395 "bison_parser.y" + case 13: /* preparable_statement: insert_statement */ +#line 399 "bison_parser.y" { (yyval.statement) = (yyvsp[0].insert_stmt); } -#line 3537 "bison_parser.cpp" +#line 3557 "bison_parser.cpp" break; - case 13: /* preparable_statement: delete_statement */ -#line 396 "bison_parser.y" + case 14: /* preparable_statement: delete_statement */ +#line 400 "bison_parser.y" { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 3543 "bison_parser.cpp" +#line 3563 "bison_parser.cpp" break; - case 14: /* preparable_statement: truncate_statement */ -#line 397 "bison_parser.y" + case 15: /* preparable_statement: truncate_statement */ +#line 401 "bison_parser.y" { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 3549 "bison_parser.cpp" +#line 3569 "bison_parser.cpp" break; - case 15: /* preparable_statement: update_statement */ -#line 398 "bison_parser.y" + case 16: /* preparable_statement: update_statement */ +#line 402 "bison_parser.y" { (yyval.statement) = (yyvsp[0].update_stmt); } -#line 3555 "bison_parser.cpp" +#line 3575 "bison_parser.cpp" break; - case 16: /* preparable_statement: drop_statement */ -#line 399 "bison_parser.y" + case 17: /* preparable_statement: drop_statement */ +#line 403 "bison_parser.y" { (yyval.statement) = (yyvsp[0].drop_stmt); } -#line 3561 "bison_parser.cpp" +#line 3581 "bison_parser.cpp" break; - case 17: /* preparable_statement: alter_statement */ -#line 400 "bison_parser.y" + case 18: /* preparable_statement: alter_statement */ +#line 404 "bison_parser.y" { (yyval.statement) = (yyvsp[0].alter_stmt); } -#line 3567 "bison_parser.cpp" +#line 3587 "bison_parser.cpp" break; - case 18: /* preparable_statement: execute_statement */ -#line 401 "bison_parser.y" + case 19: /* preparable_statement: execute_statement */ +#line 405 "bison_parser.y" { (yyval.statement) = (yyvsp[0].exec_stmt); } -#line 3573 "bison_parser.cpp" +#line 3593 "bison_parser.cpp" break; - case 19: /* preparable_statement: transaction_statement */ -#line 402 "bison_parser.y" + case 20: /* preparable_statement: transaction_statement */ +#line 406 "bison_parser.y" { (yyval.statement) = (yyvsp[0].transaction_stmt); } -#line 3579 "bison_parser.cpp" +#line 3599 "bison_parser.cpp" break; - case 20: /* opt_hints: WITH HINT '(' hint_list ')' */ -#line 408 "bison_parser.y" + case 21: /* opt_hints: WITH HINT '(' hint_list ')' */ +#line 412 "bison_parser.y" { (yyval.expr_vec) = (yyvsp[-1].expr_vec); } -#line 3585 "bison_parser.cpp" +#line 3605 "bison_parser.cpp" break; - case 21: /* opt_hints: %empty */ -#line 409 "bison_parser.y" + case 22: /* opt_hints: %empty */ +#line 413 "bison_parser.y" { (yyval.expr_vec) = nullptr; } -#line 3591 "bison_parser.cpp" +#line 3611 "bison_parser.cpp" break; - case 22: /* hint_list: hint */ -#line 411 "bison_parser.y" + case 23: /* hint_list: hint */ +#line 415 "bison_parser.y" { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 3600 "bison_parser.cpp" +#line 3620 "bison_parser.cpp" break; - case 23: /* hint_list: hint_list ',' hint */ -#line 415 "bison_parser.y" + case 24: /* hint_list: hint_list ',' hint */ +#line 419 "bison_parser.y" { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 3609 "bison_parser.cpp" +#line 3629 "bison_parser.cpp" break; - case 24: /* hint: IDENTIFIER */ -#line 420 "bison_parser.y" + case 25: /* hint: IDENTIFIER */ +#line 424 "bison_parser.y" { (yyval.expr) = Expr::make(kExprHint); (yyval.expr)->name = (yyvsp[0].sval); } -#line 3618 "bison_parser.cpp" +#line 3638 "bison_parser.cpp" break; - case 25: /* hint: IDENTIFIER '(' extended_literal_list ')' */ -#line 424 "bison_parser.y" + case 26: /* hint: IDENTIFIER '(' extended_literal_list ')' */ +#line 428 "bison_parser.y" { (yyval.expr) = Expr::make(kExprHint); (yyval.expr)->name = (yyvsp[-3].sval); (yyval.expr)->exprList = (yyvsp[-1].expr_vec); } -#line 3628 "bison_parser.cpp" +#line 3648 "bison_parser.cpp" break; - case 26: /* transaction_statement: BEGIN opt_transaction_keyword */ -#line 434 "bison_parser.y" + case 27: /* transaction_statement: BEGIN opt_transaction_keyword */ +#line 438 "bison_parser.y" { (yyval.transaction_stmt) = new TransactionStatement(kBeginTransaction); } -#line 3634 "bison_parser.cpp" +#line 3654 "bison_parser.cpp" break; - case 27: /* transaction_statement: ROLLBACK opt_transaction_keyword */ -#line 435 "bison_parser.y" + case 28: /* transaction_statement: ROLLBACK opt_transaction_keyword */ +#line 439 "bison_parser.y" { (yyval.transaction_stmt) = new TransactionStatement(kRollbackTransaction); } -#line 3640 "bison_parser.cpp" +#line 3660 "bison_parser.cpp" break; - case 28: /* transaction_statement: COMMIT opt_transaction_keyword */ -#line 436 "bison_parser.y" + case 29: /* transaction_statement: COMMIT opt_transaction_keyword */ +#line 440 "bison_parser.y" { (yyval.transaction_stmt) = new TransactionStatement(kCommitTransaction); } -#line 3646 "bison_parser.cpp" +#line 3666 "bison_parser.cpp" break; - case 31: /* prepare_statement: PREPARE IDENTIFIER FROM prepare_target_query */ -#line 444 "bison_parser.y" + case 32: /* prepare_statement: PREPARE IDENTIFIER FROM prepare_target_query */ +#line 448 "bison_parser.y" { (yyval.prep_stmt) = new PrepareStatement(); (yyval.prep_stmt)->name = (yyvsp[-2].sval); (yyval.prep_stmt)->query = (yyvsp[0].sval); } -#line 3656 "bison_parser.cpp" +#line 3676 "bison_parser.cpp" break; - case 33: /* execute_statement: EXECUTE IDENTIFIER */ -#line 452 "bison_parser.y" + case 34: /* execute_statement: EXECUTE IDENTIFIER */ +#line 456 "bison_parser.y" { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[0].sval); } -#line 3665 "bison_parser.cpp" +#line 3685 "bison_parser.cpp" break; - case 34: /* execute_statement: EXECUTE IDENTIFIER '(' opt_extended_literal_list ')' */ -#line 456 "bison_parser.y" + case 35: /* execute_statement: EXECUTE IDENTIFIER '(' opt_extended_literal_list ')' */ +#line 460 "bison_parser.y" { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[-3].sval); (yyval.exec_stmt)->parameters = (yyvsp[-1].expr_vec); } -#line 3675 "bison_parser.cpp" +#line 3695 "bison_parser.cpp" break; - case 35: /* import_statement: IMPORT FROM file_type FILE file_path INTO table_name */ -#line 468 "bison_parser.y" + case 36: /* import_statement: IMPORT FROM file_type FILE file_path INTO table_name */ +#line 472 "bison_parser.y" { (yyval.import_stmt) = new ImportStatement((yyvsp[-4].import_type_t)); (yyval.import_stmt)->filePath = (yyvsp[-2].sval); (yyval.import_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.import_stmt)->tableName = (yyvsp[0].table_name).name; } -#line 3686 "bison_parser.cpp" +#line 3706 "bison_parser.cpp" break; - case 36: /* import_statement: COPY table_name FROM file_path opt_import_export_options opt_where */ -#line 474 "bison_parser.y" + case 37: /* import_statement: COPY table_name FROM file_path opt_import_export_options opt_where */ +#line 478 "bison_parser.y" { (yyval.import_stmt) = new ImportStatement((yyvsp[-1].import_export_option_t)->format); (yyval.import_stmt)->filePath = (yyvsp[-2].sval); @@ -3703,11 +3722,11 @@ YYLTYPE yylloc = yyloc_default; } delete (yyvsp[-1].import_export_option_t); } -#line 3707 "bison_parser.cpp" +#line 3727 "bison_parser.cpp" break; - case 37: /* file_type: IDENTIFIER */ -#line 491 "bison_parser.y" + case 38: /* file_type: IDENTIFIER */ +#line 495 "bison_parser.y" { if (strcasecmp((yyvsp[0].sval), "csv") == 0) { (yyval.import_type_t) = kImportCSV; @@ -3722,35 +3741,35 @@ YYLTYPE yylloc = yyloc_default; } free((yyvsp[0].sval)); } -#line 3726 "bison_parser.cpp" +#line 3746 "bison_parser.cpp" break; - case 38: /* file_path: STRING */ -#line 506 "bison_parser.y" + case 39: /* file_path: STRING */ +#line 510 "bison_parser.y" { (yyval.sval) = (yyvsp[0].sval); } -#line 3732 "bison_parser.cpp" +#line 3752 "bison_parser.cpp" break; - case 39: /* opt_import_export_options: WITH '(' import_export_options ')' */ -#line 508 "bison_parser.y" + case 40: /* opt_import_export_options: WITH '(' import_export_options ')' */ +#line 512 "bison_parser.y" { (yyval.import_export_option_t) = (yyvsp[-1].import_export_option_t); } -#line 3738 "bison_parser.cpp" +#line 3758 "bison_parser.cpp" break; - case 40: /* opt_import_export_options: '(' import_export_options ')' */ -#line 509 "bison_parser.y" + case 41: /* opt_import_export_options: '(' import_export_options ')' */ +#line 513 "bison_parser.y" { (yyval.import_export_option_t) = (yyvsp[-1].import_export_option_t); } -#line 3744 "bison_parser.cpp" +#line 3764 "bison_parser.cpp" break; - case 41: /* opt_import_export_options: %empty */ -#line 510 "bison_parser.y" + case 42: /* opt_import_export_options: %empty */ +#line 514 "bison_parser.y" { (yyval.import_export_option_t) = new ImportExportOptions{}; } -#line 3750 "bison_parser.cpp" +#line 3770 "bison_parser.cpp" break; - case 42: /* import_export_options: import_export_options ',' FORMAT file_type */ -#line 512 "bison_parser.y" + case 43: /* import_export_options: import_export_options ',' FORMAT file_type */ +#line 516 "bison_parser.y" { if ((yyvsp[-3].import_export_option_t)->format != kImportAuto) { delete (yyvsp[-3].import_export_option_t); @@ -3765,20 +3784,20 @@ YYLTYPE yylloc = yyloc_default; (yyvsp[-3].import_export_option_t)->format = (yyvsp[0].import_type_t); (yyval.import_export_option_t) = (yyvsp[-3].import_export_option_t); } -#line 3769 "bison_parser.cpp" +#line 3789 "bison_parser.cpp" break; - case 43: /* import_export_options: FORMAT file_type */ -#line 526 "bison_parser.y" + case 44: /* import_export_options: FORMAT file_type */ +#line 530 "bison_parser.y" { (yyval.import_export_option_t) = new ImportExportOptions{}; (yyval.import_export_option_t)->format = (yyvsp[0].import_type_t); } -#line 3778 "bison_parser.cpp" +#line 3798 "bison_parser.cpp" break; - case 44: /* import_export_options: import_export_options ',' ENCODING STRING */ -#line 530 "bison_parser.y" + case 45: /* import_export_options: import_export_options ',' ENCODING STRING */ +#line 534 "bison_parser.y" { if ((yyvsp[-3].import_export_option_t)->encoding) { delete (yyvsp[-3].import_export_option_t); @@ -3789,20 +3808,20 @@ YYLTYPE yylloc = yyloc_default; (yyvsp[-3].import_export_option_t)->encoding = (yyvsp[0].sval); (yyval.import_export_option_t) = (yyvsp[-3].import_export_option_t); } -#line 3793 "bison_parser.cpp" +#line 3813 "bison_parser.cpp" break; - case 45: /* import_export_options: ENCODING STRING */ -#line 540 "bison_parser.y" + case 46: /* import_export_options: ENCODING STRING */ +#line 544 "bison_parser.y" { (yyval.import_export_option_t) = new ImportExportOptions{}; (yyval.import_export_option_t)->encoding = (yyvsp[0].sval); } -#line 3802 "bison_parser.cpp" +#line 3822 "bison_parser.cpp" break; - case 46: /* import_export_options: import_export_options ',' csv_option */ -#line 544 "bison_parser.y" + case 47: /* import_export_options: import_export_options ',' csv_option */ +#line 548 "bison_parser.y" { if ((yyvsp[-2].import_export_option_t)->format != kImportAuto && (yyvsp[-2].import_export_option_t)->format != kImportCSV) { delete (yyvsp[-2].import_export_option_t); @@ -3827,11 +3846,11 @@ YYLTYPE yylloc = yyloc_default; delete (yyvsp[0].csv_option_t); (yyval.import_export_option_t) = (yyvsp[-2].import_export_option_t); } -#line 3831 "bison_parser.cpp" +#line 3851 "bison_parser.cpp" break; - case 47: /* import_export_options: csv_option */ -#line 568 "bison_parser.y" + case 48: /* import_export_options: csv_option */ +#line 572 "bison_parser.y" { (yyval.import_export_option_t) = new ImportExportOptions{}; (yyval.import_export_option_t)->csv_options = new CsvOptions{}; @@ -3839,11 +3858,11 @@ YYLTYPE yylloc = yyloc_default; delete (yyvsp[0].csv_option_t); } -#line 3843 "bison_parser.cpp" +#line 3863 "bison_parser.cpp" break; - case 48: /* csv_option: IDENTIFIER STRING */ -#line 576 "bison_parser.y" + case 49: /* csv_option: IDENTIFIER STRING */ +#line 580 "bison_parser.y" { if (strcasecmp((yyvsp[-1].sval), "DELIMITER") == 0) { (yyval.csv_option_t) = new std::pair(CsvOptionType::Delimiter, (yyvsp[0].sval)); @@ -3857,17 +3876,17 @@ YYLTYPE yylloc = yyloc_default; } free((yyvsp[-1].sval)); } -#line 3861 "bison_parser.cpp" +#line 3881 "bison_parser.cpp" break; - case 49: /* csv_option: NULL STRING */ -#line 589 "bison_parser.y" + case 50: /* csv_option: NULL STRING */ +#line 593 "bison_parser.y" { (yyval.csv_option_t) = new std::pair(CsvOptionType::Null, (yyvsp[0].sval)); } -#line 3867 "bison_parser.cpp" +#line 3887 "bison_parser.cpp" break; - case 50: /* export_statement: COPY table_name TO file_path opt_import_export_options */ -#line 596 "bison_parser.y" + case 51: /* export_statement: COPY table_name TO file_path opt_import_export_options */ +#line 600 "bison_parser.y" { (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_export_option_t)->format); (yyval.export_stmt)->filePath = (yyvsp[-1].sval); @@ -3883,11 +3902,11 @@ YYLTYPE yylloc = yyloc_default; } delete (yyvsp[0].import_export_option_t); } -#line 3887 "bison_parser.cpp" +#line 3907 "bison_parser.cpp" break; - case 51: /* export_statement: COPY select_with_paren TO file_path opt_import_export_options */ -#line 611 "bison_parser.y" + case 52: /* export_statement: COPY select_with_paren TO file_path opt_import_export_options */ +#line 615 "bison_parser.y" { (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_export_option_t)->format); (yyval.export_stmt)->filePath = (yyvsp[-1].sval); @@ -3902,37 +3921,37 @@ YYLTYPE yylloc = yyloc_default; } delete (yyvsp[0].import_export_option_t); } -#line 3906 "bison_parser.cpp" +#line 3926 "bison_parser.cpp" break; - case 52: /* show_statement: SHOW TABLES */ -#line 631 "bison_parser.y" + case 53: /* show_statement: SHOW TABLES */ +#line 635 "bison_parser.y" { (yyval.show_stmt) = new ShowStatement(kShowTables); } -#line 3912 "bison_parser.cpp" +#line 3932 "bison_parser.cpp" break; - case 53: /* show_statement: SHOW COLUMNS table_name */ -#line 632 "bison_parser.y" + case 54: /* show_statement: SHOW COLUMNS table_name */ +#line 636 "bison_parser.y" { (yyval.show_stmt) = new ShowStatement(kShowColumns); (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.show_stmt)->name = (yyvsp[0].table_name).name; } -#line 3922 "bison_parser.cpp" +#line 3942 "bison_parser.cpp" break; - case 54: /* show_statement: DESCRIBE table_name */ -#line 637 "bison_parser.y" + case 55: /* show_statement: DESCRIBE table_name */ +#line 641 "bison_parser.y" { (yyval.show_stmt) = new ShowStatement(kShowColumns); (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.show_stmt)->name = (yyvsp[0].table_name).name; } -#line 3932 "bison_parser.cpp" +#line 3952 "bison_parser.cpp" break; - case 55: /* create_statement: CREATE TABLE opt_not_exists table_name FROM IDENTIFIER FILE file_path */ -#line 648 "bison_parser.y" + case 56: /* create_statement: CREATE TABLE opt_not_exists table_name FROM IDENTIFIER FILE file_path */ +#line 652 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateTableFromTbl); (yyval.create_stmt)->ifNotExists = (yyvsp[-5].bval); @@ -3946,11 +3965,11 @@ YYLTYPE yylloc = yyloc_default; free((yyvsp[-2].sval)); (yyval.create_stmt)->filePath = (yyvsp[0].sval); } -#line 3950 "bison_parser.cpp" +#line 3970 "bison_parser.cpp" break; - case 56: /* create_statement: CREATE TABLE opt_not_exists table_name '(' table_elem_commalist ')' */ -#line 661 "bison_parser.y" + case 57: /* create_statement: CREATE TABLE opt_not_exists table_name '(' table_elem_commalist ')' */ +#line 665 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateTable); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); @@ -3963,11 +3982,11 @@ YYLTYPE yylloc = yyloc_default; YYERROR; } } -#line 3967 "bison_parser.cpp" +#line 3987 "bison_parser.cpp" break; - case 57: /* create_statement: CREATE TABLE opt_not_exists table_name AS select_statement */ -#line 673 "bison_parser.y" + case 58: /* create_statement: CREATE TABLE opt_not_exists table_name AS select_statement */ +#line 677 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateTable); (yyval.create_stmt)->ifNotExists = (yyvsp[-3].bval); @@ -3975,11 +3994,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.create_stmt)->tableName = (yyvsp[-2].table_name).name; (yyval.create_stmt)->select = (yyvsp[0].select_stmt); } -#line 3979 "bison_parser.cpp" +#line 3999 "bison_parser.cpp" break; - case 58: /* create_statement: CREATE INDEX opt_not_exists opt_index_name ON table_name '(' ident_commalist ')' */ -#line 680 "bison_parser.y" + case 59: /* create_statement: CREATE INDEX opt_not_exists opt_index_name ON table_name '(' ident_commalist ')' */ +#line 684 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateIndex); (yyval.create_stmt)->indexName = (yyvsp[-5].sval); @@ -3987,11 +4006,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; (yyval.create_stmt)->indexColumns = (yyvsp[-1].str_vec); } -#line 3991 "bison_parser.cpp" +#line 4011 "bison_parser.cpp" break; - case 59: /* create_statement: CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement */ -#line 687 "bison_parser.y" + case 60: /* create_statement: CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement */ +#line 691 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateView); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); @@ -4000,53 +4019,53 @@ YYLTYPE yylloc = yyloc_default; (yyval.create_stmt)->viewColumns = (yyvsp[-2].str_vec); (yyval.create_stmt)->select = (yyvsp[0].select_stmt); } -#line 4004 "bison_parser.cpp" +#line 4024 "bison_parser.cpp" break; - case 60: /* opt_not_exists: IF NOT EXISTS */ -#line 696 "bison_parser.y" + case 61: /* opt_not_exists: IF NOT EXISTS */ +#line 700 "bison_parser.y" { (yyval.bval) = true; } -#line 4010 "bison_parser.cpp" +#line 4030 "bison_parser.cpp" break; - case 61: /* opt_not_exists: %empty */ -#line 697 "bison_parser.y" + case 62: /* opt_not_exists: %empty */ +#line 701 "bison_parser.y" { (yyval.bval) = false; } -#line 4016 "bison_parser.cpp" +#line 4036 "bison_parser.cpp" break; - case 62: /* table_elem_commalist: table_elem */ -#line 699 "bison_parser.y" + case 63: /* table_elem_commalist: table_elem */ +#line 703 "bison_parser.y" { (yyval.table_element_vec) = new std::vector(); (yyval.table_element_vec)->push_back((yyvsp[0].table_element_t)); } -#line 4025 "bison_parser.cpp" +#line 4045 "bison_parser.cpp" break; - case 63: /* table_elem_commalist: table_elem_commalist ',' table_elem */ -#line 703 "bison_parser.y" + case 64: /* table_elem_commalist: table_elem_commalist ',' table_elem */ +#line 707 "bison_parser.y" { (yyvsp[-2].table_element_vec)->push_back((yyvsp[0].table_element_t)); (yyval.table_element_vec) = (yyvsp[-2].table_element_vec); } -#line 4034 "bison_parser.cpp" +#line 4054 "bison_parser.cpp" break; - case 64: /* table_elem: column_def */ -#line 708 "bison_parser.y" + case 65: /* table_elem: column_def */ +#line 712 "bison_parser.y" { (yyval.table_element_t) = (yyvsp[0].column_t); } -#line 4040 "bison_parser.cpp" +#line 4060 "bison_parser.cpp" break; - case 65: /* table_elem: table_constraint */ -#line 709 "bison_parser.y" + case 66: /* table_elem: table_constraint */ +#line 713 "bison_parser.y" { (yyval.table_element_t) = (yyvsp[0].table_constraint_t); } -#line 4046 "bison_parser.cpp" +#line 4066 "bison_parser.cpp" break; - case 66: /* column_def: IDENTIFIER column_type opt_column_constraints */ -#line 711 "bison_parser.y" + case 67: /* column_def: IDENTIFIER column_type opt_column_constraints */ +#line 715 "bison_parser.y" { (yyval.column_t) = new ColumnDefinition((yyvsp[-2].sval), (yyvsp[-1].column_type_t), (yyvsp[0].column_constraints_t)->constraints, (yyvsp[0].column_constraints_t)->references); if (!(yyval.column_t)->trySetNullableExplicit()) { @@ -4054,192 +4073,192 @@ YYLTYPE yylloc = yyloc_default; } delete (yyvsp[0].column_constraints_t); } -#line 4058 "bison_parser.cpp" +#line 4078 "bison_parser.cpp" break; - case 67: /* column_type: BIGINT */ -#line 719 "bison_parser.y" + case 68: /* column_type: BIGINT */ +#line 723 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::BIGINT}; } -#line 4064 "bison_parser.cpp" +#line 4084 "bison_parser.cpp" break; - case 68: /* column_type: BOOLEAN */ -#line 720 "bison_parser.y" + case 69: /* column_type: BOOLEAN */ +#line 724 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::BOOLEAN}; } -#line 4070 "bison_parser.cpp" +#line 4090 "bison_parser.cpp" break; - case 69: /* column_type: CHAR '(' INTVAL ')' */ -#line 721 "bison_parser.y" + case 70: /* column_type: CHAR '(' INTVAL ')' */ +#line 725 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::CHAR, (yyvsp[-1].ival)}; } -#line 4076 "bison_parser.cpp" +#line 4096 "bison_parser.cpp" break; - case 70: /* column_type: CHARACTER_VARYING '(' INTVAL ')' */ -#line 722 "bison_parser.y" + case 71: /* column_type: CHARACTER_VARYING '(' INTVAL ')' */ +#line 726 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } -#line 4082 "bison_parser.cpp" +#line 4102 "bison_parser.cpp" break; - case 71: /* column_type: DATE */ -#line 723 "bison_parser.y" + case 72: /* column_type: DATE */ +#line 727 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::DATE}; } -#line 4088 "bison_parser.cpp" +#line 4108 "bison_parser.cpp" break; - case 72: /* column_type: DATETIME */ -#line 724 "bison_parser.y" + case 73: /* column_type: DATETIME */ +#line 728 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::DATETIME}; } -#line 4094 "bison_parser.cpp" +#line 4114 "bison_parser.cpp" break; - case 73: /* column_type: DECIMAL opt_decimal_specification */ -#line 725 "bison_parser.y" + case 74: /* column_type: DECIMAL opt_decimal_specification */ +#line 729 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::DECIMAL, 0, (yyvsp[0].ival_pair)->first, (yyvsp[0].ival_pair)->second}; delete (yyvsp[0].ival_pair); } -#line 4103 "bison_parser.cpp" +#line 4123 "bison_parser.cpp" break; - case 74: /* column_type: DOUBLE */ -#line 729 "bison_parser.y" + case 75: /* column_type: DOUBLE */ +#line 733 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::DOUBLE}; } -#line 4109 "bison_parser.cpp" +#line 4129 "bison_parser.cpp" break; - case 75: /* column_type: FLOAT */ -#line 730 "bison_parser.y" + case 76: /* column_type: FLOAT */ +#line 734 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::FLOAT}; } -#line 4115 "bison_parser.cpp" +#line 4135 "bison_parser.cpp" break; - case 76: /* column_type: INT */ -#line 731 "bison_parser.y" + case 77: /* column_type: INT */ +#line 735 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::INT}; } -#line 4121 "bison_parser.cpp" +#line 4141 "bison_parser.cpp" break; - case 77: /* column_type: INTEGER */ -#line 732 "bison_parser.y" + case 78: /* column_type: INTEGER */ +#line 736 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::INT}; } -#line 4127 "bison_parser.cpp" +#line 4147 "bison_parser.cpp" break; - case 78: /* column_type: LONG */ -#line 733 "bison_parser.y" + case 79: /* column_type: LONG */ +#line 737 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::LONG}; } -#line 4133 "bison_parser.cpp" +#line 4153 "bison_parser.cpp" break; - case 79: /* column_type: REAL */ -#line 734 "bison_parser.y" + case 80: /* column_type: REAL */ +#line 738 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::REAL}; } -#line 4139 "bison_parser.cpp" +#line 4159 "bison_parser.cpp" break; - case 80: /* column_type: SMALLINT */ -#line 735 "bison_parser.y" + case 81: /* column_type: SMALLINT */ +#line 739 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::SMALLINT}; } -#line 4145 "bison_parser.cpp" +#line 4165 "bison_parser.cpp" break; - case 81: /* column_type: TEXT */ -#line 736 "bison_parser.y" + case 82: /* column_type: TEXT */ +#line 740 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::TEXT}; } -#line 4151 "bison_parser.cpp" +#line 4171 "bison_parser.cpp" break; - case 82: /* column_type: TIME opt_time_precision */ -#line 737 "bison_parser.y" + case 83: /* column_type: TIME opt_time_precision */ +#line 741 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::TIME, 0, (yyvsp[0].ival)}; } -#line 4157 "bison_parser.cpp" +#line 4177 "bison_parser.cpp" break; - case 83: /* column_type: TIMESTAMP */ -#line 738 "bison_parser.y" + case 84: /* column_type: TIMESTAMP */ +#line 742 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::DATETIME}; } -#line 4163 "bison_parser.cpp" +#line 4183 "bison_parser.cpp" break; - case 84: /* column_type: VARCHAR '(' INTVAL ')' */ -#line 739 "bison_parser.y" + case 85: /* column_type: VARCHAR '(' INTVAL ')' */ +#line 743 "bison_parser.y" { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } -#line 4169 "bison_parser.cpp" +#line 4189 "bison_parser.cpp" break; - case 85: /* opt_time_precision: '(' INTVAL ')' */ -#line 741 "bison_parser.y" + case 86: /* opt_time_precision: '(' INTVAL ')' */ +#line 745 "bison_parser.y" { (yyval.ival) = (yyvsp[-1].ival); } -#line 4175 "bison_parser.cpp" +#line 4195 "bison_parser.cpp" break; - case 86: /* opt_time_precision: %empty */ -#line 742 "bison_parser.y" + case 87: /* opt_time_precision: %empty */ +#line 746 "bison_parser.y" { (yyval.ival) = 0; } -#line 4181 "bison_parser.cpp" +#line 4201 "bison_parser.cpp" break; - case 87: /* opt_decimal_specification: '(' INTVAL ',' INTVAL ')' */ -#line 744 "bison_parser.y" + case 88: /* opt_decimal_specification: '(' INTVAL ',' INTVAL ')' */ +#line 748 "bison_parser.y" { (yyval.ival_pair) = new std::pair{(yyvsp[-3].ival), (yyvsp[-1].ival)}; } -#line 4187 "bison_parser.cpp" +#line 4207 "bison_parser.cpp" break; - case 88: /* opt_decimal_specification: '(' INTVAL ')' */ -#line 745 "bison_parser.y" + case 89: /* opt_decimal_specification: '(' INTVAL ')' */ +#line 749 "bison_parser.y" { (yyval.ival_pair) = new std::pair{(yyvsp[-1].ival), 0}; } -#line 4193 "bison_parser.cpp" +#line 4213 "bison_parser.cpp" break; - case 89: /* opt_decimal_specification: %empty */ -#line 746 "bison_parser.y" + case 90: /* opt_decimal_specification: %empty */ +#line 750 "bison_parser.y" { (yyval.ival_pair) = new std::pair{0, 0}; } -#line 4199 "bison_parser.cpp" +#line 4219 "bison_parser.cpp" break; - case 90: /* opt_column_constraints: column_constraints */ -#line 748 "bison_parser.y" + case 91: /* opt_column_constraints: column_constraints */ +#line 752 "bison_parser.y" { (yyval.column_constraints_t) = (yyvsp[0].column_constraints_t); } -#line 4205 "bison_parser.cpp" +#line 4225 "bison_parser.cpp" break; - case 91: /* opt_column_constraints: %empty */ -#line 749 "bison_parser.y" + case 92: /* opt_column_constraints: %empty */ +#line 753 "bison_parser.y" { (yyval.column_constraints_t) = new ColumnConstraints(); } -#line 4211 "bison_parser.cpp" +#line 4231 "bison_parser.cpp" break; - case 92: /* column_constraints: column_constraint */ -#line 751 "bison_parser.y" + case 93: /* column_constraints: column_constraint */ +#line 755 "bison_parser.y" { (yyval.column_constraints_t) = new ColumnConstraints(); (yyval.column_constraints_t)->constraints->insert((yyvsp[0].column_constraint_t)); } -#line 4220 "bison_parser.cpp" +#line 4240 "bison_parser.cpp" break; - case 93: /* column_constraints: column_constraints column_constraint */ -#line 755 "bison_parser.y" + case 94: /* column_constraints: column_constraints column_constraint */ +#line 759 "bison_parser.y" { (yyvsp[-1].column_constraints_t)->constraints->insert((yyvsp[0].column_constraint_t)); (yyval.column_constraints_t) = (yyvsp[-1].column_constraints_t); } -#line 4229 "bison_parser.cpp" +#line 4249 "bison_parser.cpp" break; - case 94: /* column_constraints: references_spec */ -#line 759 "bison_parser.y" + case 95: /* column_constraints: references_spec */ +#line 763 "bison_parser.y" { (yyval.column_constraints_t) = new ColumnConstraints(); (yyval.column_constraints_t)->constraints->insert(ConstraintType::ForeignKey); (yyval.column_constraints_t)->references->emplace_back((yyvsp[0].references_spec_t)); } -#line 4239 "bison_parser.cpp" +#line 4259 "bison_parser.cpp" break; - case 95: /* column_constraints: column_constraints references_spec */ -#line 764 "bison_parser.y" + case 96: /* column_constraints: column_constraints references_spec */ +#line 768 "bison_parser.y" { // Multiple foreign keys for the same column could be possible, so we do not raise an error in that case. // Think of foreign keys referenced on multiple levels (returned item references sold item references items). @@ -4247,159 +4266,159 @@ YYLTYPE yylloc = yyloc_default; (yyvsp[-1].column_constraints_t)->references->emplace_back((yyvsp[0].references_spec_t)); (yyval.column_constraints_t) = (yyvsp[-1].column_constraints_t); } -#line 4251 "bison_parser.cpp" +#line 4271 "bison_parser.cpp" break; - case 96: /* column_constraint: PRIMARY KEY */ -#line 772 "bison_parser.y" + case 97: /* column_constraint: PRIMARY KEY */ +#line 776 "bison_parser.y" { (yyval.column_constraint_t) = ConstraintType::PrimaryKey; } -#line 4257 "bison_parser.cpp" +#line 4277 "bison_parser.cpp" break; - case 97: /* column_constraint: UNIQUE */ -#line 773 "bison_parser.y" + case 98: /* column_constraint: UNIQUE */ +#line 777 "bison_parser.y" { (yyval.column_constraint_t) = ConstraintType::Unique; } -#line 4263 "bison_parser.cpp" +#line 4283 "bison_parser.cpp" break; - case 98: /* column_constraint: NULL */ -#line 774 "bison_parser.y" + case 99: /* column_constraint: NULL */ +#line 778 "bison_parser.y" { (yyval.column_constraint_t) = ConstraintType::Null; } -#line 4269 "bison_parser.cpp" +#line 4289 "bison_parser.cpp" break; - case 99: /* column_constraint: NOT NULL */ -#line 775 "bison_parser.y" + case 100: /* column_constraint: NOT NULL */ +#line 779 "bison_parser.y" { (yyval.column_constraint_t) = ConstraintType::NotNull; } -#line 4275 "bison_parser.cpp" +#line 4295 "bison_parser.cpp" break; - case 100: /* table_constraint: PRIMARY KEY '(' ident_commalist ')' */ -#line 777 "bison_parser.y" + case 101: /* table_constraint: PRIMARY KEY '(' ident_commalist ')' */ +#line 781 "bison_parser.y" { (yyval.table_constraint_t) = new TableConstraint(ConstraintType::PrimaryKey, (yyvsp[-1].str_vec)); } -#line 4281 "bison_parser.cpp" +#line 4301 "bison_parser.cpp" break; - case 101: /* table_constraint: UNIQUE '(' ident_commalist ')' */ -#line 778 "bison_parser.y" + case 102: /* table_constraint: UNIQUE '(' ident_commalist ')' */ +#line 782 "bison_parser.y" { (yyval.table_constraint_t) = new TableConstraint(ConstraintType::Unique, (yyvsp[-1].str_vec)); } -#line 4287 "bison_parser.cpp" +#line 4307 "bison_parser.cpp" break; - case 102: /* table_constraint: FOREIGN KEY '(' ident_commalist ')' references_spec */ -#line 779 "bison_parser.y" + case 103: /* table_constraint: FOREIGN KEY '(' ident_commalist ')' references_spec */ +#line 783 "bison_parser.y" { (yyval.table_constraint_t) = new ForeignKeyConstraint((yyvsp[-2].str_vec), (yyvsp[0].references_spec_t)); } -#line 4293 "bison_parser.cpp" +#line 4313 "bison_parser.cpp" break; - case 103: /* references_spec: REFERENCES table_name opt_column_list */ -#line 781 "bison_parser.y" + case 104: /* references_spec: REFERENCES table_name opt_column_list */ +#line 785 "bison_parser.y" { (yyval.references_spec_t) = new ReferencesSpecification((yyvsp[-1].table_name).schema, (yyvsp[-1].table_name).name, (yyvsp[0].str_vec)); } -#line 4299 "bison_parser.cpp" +#line 4319 "bison_parser.cpp" break; - case 104: /* drop_statement: DROP TABLE opt_exists table_name */ -#line 789 "bison_parser.y" + case 105: /* drop_statement: DROP TABLE opt_exists table_name */ +#line 793 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropTable); (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; } -#line 4310 "bison_parser.cpp" +#line 4330 "bison_parser.cpp" break; - case 105: /* drop_statement: DROP VIEW opt_exists table_name */ -#line 795 "bison_parser.y" + case 106: /* drop_statement: DROP VIEW opt_exists table_name */ +#line 799 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropView); (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; } -#line 4321 "bison_parser.cpp" +#line 4341 "bison_parser.cpp" break; - case 106: /* drop_statement: DEALLOCATE PREPARE IDENTIFIER */ -#line 801 "bison_parser.y" + case 107: /* drop_statement: DEALLOCATE PREPARE IDENTIFIER */ +#line 805 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropPreparedStatement); (yyval.drop_stmt)->ifExists = false; (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 4331 "bison_parser.cpp" +#line 4351 "bison_parser.cpp" break; - case 107: /* drop_statement: DROP INDEX opt_exists IDENTIFIER */ -#line 807 "bison_parser.y" + case 108: /* drop_statement: DROP INDEX opt_exists IDENTIFIER */ +#line 811 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropIndex); (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); (yyval.drop_stmt)->indexName = (yyvsp[0].sval); } -#line 4341 "bison_parser.cpp" +#line 4361 "bison_parser.cpp" break; - case 108: /* opt_exists: IF EXISTS */ -#line 813 "bison_parser.y" + case 109: /* opt_exists: IF EXISTS */ +#line 817 "bison_parser.y" { (yyval.bval) = true; } -#line 4347 "bison_parser.cpp" +#line 4367 "bison_parser.cpp" break; - case 109: /* opt_exists: %empty */ -#line 814 "bison_parser.y" + case 110: /* opt_exists: %empty */ +#line 818 "bison_parser.y" { (yyval.bval) = false; } -#line 4353 "bison_parser.cpp" +#line 4373 "bison_parser.cpp" break; - case 110: /* alter_statement: ALTER TABLE opt_exists table_name alter_action */ -#line 821 "bison_parser.y" + case 111: /* alter_statement: ALTER TABLE opt_exists table_name alter_action */ +#line 825 "bison_parser.y" { (yyval.alter_stmt) = new AlterStatement((yyvsp[-1].table_name).name, (yyvsp[0].alter_action_t)); (yyval.alter_stmt)->ifTableExists = (yyvsp[-2].bval); (yyval.alter_stmt)->schema = (yyvsp[-1].table_name).schema; } -#line 4363 "bison_parser.cpp" +#line 4383 "bison_parser.cpp" break; - case 111: /* alter_action: drop_action */ -#line 827 "bison_parser.y" + case 112: /* alter_action: drop_action */ +#line 831 "bison_parser.y" { (yyval.alter_action_t) = (yyvsp[0].drop_action_t); } -#line 4369 "bison_parser.cpp" +#line 4389 "bison_parser.cpp" break; - case 112: /* drop_action: DROP COLUMN opt_exists IDENTIFIER */ -#line 829 "bison_parser.y" + case 113: /* drop_action: DROP COLUMN opt_exists IDENTIFIER */ +#line 833 "bison_parser.y" { (yyval.drop_action_t) = new DropColumnAction((yyvsp[0].sval)); (yyval.drop_action_t)->ifExists = (yyvsp[-1].bval); } -#line 4378 "bison_parser.cpp" +#line 4398 "bison_parser.cpp" break; - case 113: /* delete_statement: DELETE FROM table_name opt_where */ -#line 839 "bison_parser.y" + case 114: /* delete_statement: DELETE FROM table_name opt_where */ +#line 843 "bison_parser.y" { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->schema = (yyvsp[-1].table_name).schema; (yyval.delete_stmt)->tableName = (yyvsp[-1].table_name).name; (yyval.delete_stmt)->expr = (yyvsp[0].expr); } -#line 4389 "bison_parser.cpp" +#line 4409 "bison_parser.cpp" break; - case 114: /* truncate_statement: TRUNCATE table_name */ -#line 846 "bison_parser.y" + case 115: /* truncate_statement: TRUNCATE table_name */ +#line 850 "bison_parser.y" { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.delete_stmt)->tableName = (yyvsp[0].table_name).name; } -#line 4399 "bison_parser.cpp" +#line 4419 "bison_parser.cpp" break; - case 115: /* insert_statement: INSERT INTO table_name opt_column_list VALUES '(' extended_literal_list ')' */ -#line 857 "bison_parser.y" + case 116: /* insert_statement: INSERT INTO table_name opt_column_list VALUES '(' extended_literal_list ')' */ +#line 861 "bison_parser.y" { (yyval.insert_stmt) = new InsertStatement(kInsertValues); (yyval.insert_stmt)->schema = (yyvsp[-5].table_name).schema; @@ -4407,11 +4426,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.insert_stmt)->columns = (yyvsp[-4].str_vec); (yyval.insert_stmt)->values = (yyvsp[-1].expr_vec); } -#line 4411 "bison_parser.cpp" +#line 4431 "bison_parser.cpp" break; - case 116: /* insert_statement: INSERT INTO table_name opt_column_list select_no_paren */ -#line 864 "bison_parser.y" + case 117: /* insert_statement: INSERT INTO table_name opt_column_list select_no_paren */ +#line 868 "bison_parser.y" { (yyval.insert_stmt) = new InsertStatement(kInsertSelect); (yyval.insert_stmt)->schema = (yyvsp[-2].table_name).schema; @@ -4419,80 +4438,80 @@ YYLTYPE yylloc = yyloc_default; (yyval.insert_stmt)->columns = (yyvsp[-1].str_vec); (yyval.insert_stmt)->select = (yyvsp[0].select_stmt); } -#line 4423 "bison_parser.cpp" +#line 4443 "bison_parser.cpp" break; - case 117: /* opt_column_list: '(' ident_commalist ')' */ -#line 872 "bison_parser.y" + case 118: /* opt_column_list: '(' ident_commalist ')' */ +#line 876 "bison_parser.y" { (yyval.str_vec) = (yyvsp[-1].str_vec); } -#line 4429 "bison_parser.cpp" +#line 4449 "bison_parser.cpp" break; - case 118: /* opt_column_list: %empty */ -#line 873 "bison_parser.y" + case 119: /* opt_column_list: %empty */ +#line 877 "bison_parser.y" { (yyval.str_vec) = nullptr; } -#line 4435 "bison_parser.cpp" +#line 4455 "bison_parser.cpp" break; - case 119: /* update_statement: UPDATE table_ref_name_no_alias SET update_clause_commalist opt_where */ -#line 880 "bison_parser.y" + case 120: /* update_statement: UPDATE table_ref_name_no_alias SET update_clause_commalist opt_where */ +#line 884 "bison_parser.y" { (yyval.update_stmt) = new UpdateStatement(); (yyval.update_stmt)->table = (yyvsp[-3].table); (yyval.update_stmt)->updates = (yyvsp[-1].update_vec); (yyval.update_stmt)->where = (yyvsp[0].expr); } -#line 4446 "bison_parser.cpp" +#line 4466 "bison_parser.cpp" break; - case 120: /* update_clause_commalist: update_clause */ -#line 887 "bison_parser.y" + case 121: /* update_clause_commalist: update_clause */ +#line 891 "bison_parser.y" { (yyval.update_vec) = new std::vector(); (yyval.update_vec)->push_back((yyvsp[0].update_t)); } -#line 4455 "bison_parser.cpp" +#line 4475 "bison_parser.cpp" break; - case 121: /* update_clause_commalist: update_clause_commalist ',' update_clause */ -#line 891 "bison_parser.y" + case 122: /* update_clause_commalist: update_clause_commalist ',' update_clause */ +#line 895 "bison_parser.y" { (yyvsp[-2].update_vec)->push_back((yyvsp[0].update_t)); (yyval.update_vec) = (yyvsp[-2].update_vec); } -#line 4464 "bison_parser.cpp" +#line 4484 "bison_parser.cpp" break; - case 122: /* update_clause: IDENTIFIER '=' expr */ -#line 896 "bison_parser.y" + case 123: /* update_clause: IDENTIFIER '=' expr */ +#line 900 "bison_parser.y" { (yyval.update_t) = new UpdateClause(); (yyval.update_t)->column = (yyvsp[-2].sval); (yyval.update_t)->value = (yyvsp[0].expr); } -#line 4474 "bison_parser.cpp" +#line 4494 "bison_parser.cpp" break; - case 123: /* select_statement: opt_with_clause select_with_paren */ -#line 906 "bison_parser.y" + case 124: /* select_statement: opt_with_clause select_with_paren */ +#line 910 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[0].select_stmt); (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); } -#line 4483 "bison_parser.cpp" +#line 4503 "bison_parser.cpp" break; - case 124: /* select_statement: opt_with_clause select_no_paren */ -#line 910 "bison_parser.y" + case 125: /* select_statement: opt_with_clause select_no_paren */ +#line 914 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[0].select_stmt); (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); } -#line 4492 "bison_parser.cpp" +#line 4512 "bison_parser.cpp" break; - case 125: /* select_statement: opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit */ -#line 914 "bison_parser.y" + case 126: /* select_statement: opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit */ +#line 918 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-4].select_stmt); if ((yyval.select_stmt)->setOperations == nullptr) { @@ -4504,17 +4523,17 @@ YYLTYPE yylloc = yyloc_default; (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[0].limit); (yyval.select_stmt)->withDescriptions = (yyvsp[-5].with_description_vec); } -#line 4508 "bison_parser.cpp" +#line 4528 "bison_parser.cpp" break; - case 128: /* select_within_set_operation_no_parentheses: select_clause */ -#line 928 "bison_parser.y" + case 129: /* select_within_set_operation_no_parentheses: select_clause */ +#line 932 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[0].select_stmt); } -#line 4514 "bison_parser.cpp" +#line 4534 "bison_parser.cpp" break; - case 129: /* select_within_set_operation_no_parentheses: select_clause set_operator select_within_set_operation */ -#line 929 "bison_parser.y" + case 130: /* select_within_set_operation_no_parentheses: select_clause set_operator select_within_set_operation */ +#line 933 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-2].select_stmt); if ((yyval.select_stmt)->setOperations == nullptr) { @@ -4523,23 +4542,23 @@ YYLTYPE yylloc = yyloc_default; (yyval.select_stmt)->setOperations->push_back((yyvsp[-1].set_operator_t)); (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[0].select_stmt); } -#line 4527 "bison_parser.cpp" +#line 4547 "bison_parser.cpp" break; - case 130: /* select_with_paren: '(' select_no_paren ')' */ -#line 938 "bison_parser.y" + case 131: /* select_with_paren: '(' select_no_paren ')' */ +#line 942 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 4533 "bison_parser.cpp" +#line 4553 "bison_parser.cpp" break; - case 131: /* select_with_paren: '(' select_with_paren ')' */ -#line 939 "bison_parser.y" + case 132: /* select_with_paren: '(' select_with_paren ')' */ +#line 943 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 4539 "bison_parser.cpp" +#line 4559 "bison_parser.cpp" break; - case 132: /* select_no_paren: select_clause opt_order opt_limit opt_locking_clause */ -#line 941 "bison_parser.y" + case 133: /* select_no_paren: select_clause opt_order opt_limit opt_locking_clause */ +#line 945 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-3].select_stmt); (yyval.select_stmt)->order = (yyvsp[-2].order_vec); @@ -4554,11 +4573,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.select_stmt)->lockings = (yyvsp[0].locking_clause_vec); } } -#line 4558 "bison_parser.cpp" +#line 4578 "bison_parser.cpp" break; - case 133: /* select_no_paren: select_clause set_operator select_within_set_operation opt_order opt_limit opt_locking_clause */ -#line 955 "bison_parser.y" + case 134: /* select_no_paren: select_clause set_operator select_within_set_operation opt_order opt_limit opt_locking_clause */ +#line 959 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-5].select_stmt); if ((yyval.select_stmt)->setOperations == nullptr) { @@ -4570,59 +4589,59 @@ YYLTYPE yylloc = yyloc_default; (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[-1].limit); (yyval.select_stmt)->lockings = (yyvsp[0].locking_clause_vec); } -#line 4574 "bison_parser.cpp" +#line 4594 "bison_parser.cpp" break; - case 134: /* set_operator: set_type opt_all */ -#line 967 "bison_parser.y" + case 135: /* set_operator: set_type opt_all */ +#line 971 "bison_parser.y" { (yyval.set_operator_t) = (yyvsp[-1].set_operator_t); (yyval.set_operator_t)->isAll = (yyvsp[0].bval); } -#line 4583 "bison_parser.cpp" +#line 4603 "bison_parser.cpp" break; - case 135: /* set_type: UNION */ -#line 972 "bison_parser.y" + case 136: /* set_type: UNION */ +#line 976 "bison_parser.y" { (yyval.set_operator_t) = new SetOperation(); (yyval.set_operator_t)->setType = SetType::kSetUnion; } -#line 4592 "bison_parser.cpp" +#line 4612 "bison_parser.cpp" break; - case 136: /* set_type: INTERSECT */ -#line 976 "bison_parser.y" + case 137: /* set_type: INTERSECT */ +#line 980 "bison_parser.y" { (yyval.set_operator_t) = new SetOperation(); (yyval.set_operator_t)->setType = SetType::kSetIntersect; } -#line 4601 "bison_parser.cpp" +#line 4621 "bison_parser.cpp" break; - case 137: /* set_type: EXCEPT */ -#line 980 "bison_parser.y" + case 138: /* set_type: EXCEPT */ +#line 984 "bison_parser.y" { (yyval.set_operator_t) = new SetOperation(); (yyval.set_operator_t)->setType = SetType::kSetExcept; } -#line 4610 "bison_parser.cpp" +#line 4630 "bison_parser.cpp" break; - case 138: /* opt_all: ALL */ -#line 985 "bison_parser.y" + case 139: /* opt_all: ALL */ +#line 989 "bison_parser.y" { (yyval.bval) = true; } -#line 4616 "bison_parser.cpp" +#line 4636 "bison_parser.cpp" break; - case 139: /* opt_all: %empty */ -#line 986 "bison_parser.y" + case 140: /* opt_all: %empty */ +#line 990 "bison_parser.y" { (yyval.bval) = false; } -#line 4622 "bison_parser.cpp" +#line 4642 "bison_parser.cpp" break; - case 140: /* select_clause: SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group opt_having */ -#line 988 "bison_parser.y" + case 141: /* select_clause: SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group opt_having */ +#line 992 "bison_parser.y" { (yyval.select_stmt) = new SelectStatement(); (yyval.select_stmt)->limit = (yyvsp[-6].limit); @@ -4637,140 +4656,140 @@ YYLTYPE yylloc = yyloc_default; (yyval.select_stmt)->having = (yyvsp[0].expr); } } -#line 4641 "bison_parser.cpp" +#line 4661 "bison_parser.cpp" break; - case 141: /* opt_distinct: DISTINCT */ -#line 1003 "bison_parser.y" + case 142: /* opt_distinct: DISTINCT */ +#line 1007 "bison_parser.y" { (yyval.bval) = true; } -#line 4647 "bison_parser.cpp" +#line 4667 "bison_parser.cpp" break; - case 142: /* opt_distinct: %empty */ -#line 1004 "bison_parser.y" + case 143: /* opt_distinct: %empty */ +#line 1008 "bison_parser.y" { (yyval.bval) = false; } -#line 4653 "bison_parser.cpp" +#line 4673 "bison_parser.cpp" break; - case 144: /* opt_from_clause: from_clause */ -#line 1008 "bison_parser.y" + case 145: /* opt_from_clause: from_clause */ +#line 1012 "bison_parser.y" { (yyval.table) = (yyvsp[0].table); } -#line 4659 "bison_parser.cpp" +#line 4679 "bison_parser.cpp" break; - case 145: /* opt_from_clause: %empty */ -#line 1009 "bison_parser.y" + case 146: /* opt_from_clause: %empty */ +#line 1013 "bison_parser.y" { (yyval.table) = nullptr; } -#line 4665 "bison_parser.cpp" +#line 4685 "bison_parser.cpp" break; - case 146: /* from_clause: FROM table_ref */ -#line 1011 "bison_parser.y" + case 147: /* from_clause: FROM table_ref */ +#line 1015 "bison_parser.y" { (yyval.table) = (yyvsp[0].table); } -#line 4671 "bison_parser.cpp" +#line 4691 "bison_parser.cpp" break; - case 147: /* opt_where: WHERE expr */ -#line 1013 "bison_parser.y" + case 148: /* opt_where: WHERE expr */ +#line 1017 "bison_parser.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 4677 "bison_parser.cpp" +#line 4697 "bison_parser.cpp" break; - case 148: /* opt_where: %empty */ -#line 1014 "bison_parser.y" + case 149: /* opt_where: %empty */ +#line 1018 "bison_parser.y" { (yyval.expr) = nullptr; } -#line 4683 "bison_parser.cpp" +#line 4703 "bison_parser.cpp" break; - case 149: /* opt_group: GROUP BY expr_list */ -#line 1016 "bison_parser.y" + case 150: /* opt_group: GROUP BY expr_list */ +#line 1020 "bison_parser.y" { (yyval.group_t) = new GroupByDescription(); (yyval.group_t)->columns = (yyvsp[0].expr_vec); } -#line 4692 "bison_parser.cpp" +#line 4712 "bison_parser.cpp" break; - case 150: /* opt_group: %empty */ -#line 1020 "bison_parser.y" + case 151: /* opt_group: %empty */ +#line 1024 "bison_parser.y" { (yyval.group_t) = nullptr; } -#line 4698 "bison_parser.cpp" +#line 4718 "bison_parser.cpp" break; - case 151: /* opt_having: HAVING expr */ -#line 1022 "bison_parser.y" + case 152: /* opt_having: HAVING expr */ +#line 1026 "bison_parser.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 4704 "bison_parser.cpp" +#line 4724 "bison_parser.cpp" break; - case 152: /* opt_having: %empty */ -#line 1023 "bison_parser.y" + case 153: /* opt_having: %empty */ +#line 1027 "bison_parser.y" { (yyval.expr) = nullptr; } -#line 4710 "bison_parser.cpp" +#line 4730 "bison_parser.cpp" break; - case 153: /* opt_order: ORDER BY order_list */ -#line 1025 "bison_parser.y" + case 154: /* opt_order: ORDER BY order_list */ +#line 1029 "bison_parser.y" { (yyval.order_vec) = (yyvsp[0].order_vec); } -#line 4716 "bison_parser.cpp" +#line 4736 "bison_parser.cpp" break; - case 154: /* opt_order: %empty */ -#line 1026 "bison_parser.y" + case 155: /* opt_order: %empty */ +#line 1030 "bison_parser.y" { (yyval.order_vec) = nullptr; } -#line 4722 "bison_parser.cpp" +#line 4742 "bison_parser.cpp" break; - case 155: /* order_list: order_desc */ -#line 1028 "bison_parser.y" + case 156: /* order_list: order_desc */ +#line 1032 "bison_parser.y" { (yyval.order_vec) = new std::vector(); (yyval.order_vec)->push_back((yyvsp[0].order)); } -#line 4731 "bison_parser.cpp" +#line 4751 "bison_parser.cpp" break; - case 156: /* order_list: order_list ',' order_desc */ -#line 1032 "bison_parser.y" + case 157: /* order_list: order_list ',' order_desc */ +#line 1036 "bison_parser.y" { (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); (yyval.order_vec) = (yyvsp[-2].order_vec); } -#line 4740 "bison_parser.cpp" +#line 4760 "bison_parser.cpp" break; - case 157: /* order_desc: expr opt_order_type opt_null_ordering */ -#line 1037 "bison_parser.y" + case 158: /* order_desc: expr opt_order_type opt_null_ordering */ +#line 1041 "bison_parser.y" { (yyval.order) = new OrderDescription((yyvsp[-1].order_type), (yyvsp[-2].expr), (yyvsp[0].null_ordering_t)); } -#line 4746 "bison_parser.cpp" +#line 4766 "bison_parser.cpp" break; - case 158: /* opt_order_type: ASC */ -#line 1039 "bison_parser.y" + case 159: /* opt_order_type: ASC */ +#line 1043 "bison_parser.y" { (yyval.order_type) = kOrderAsc; } -#line 4752 "bison_parser.cpp" +#line 4772 "bison_parser.cpp" break; - case 159: /* opt_order_type: DESC */ -#line 1040 "bison_parser.y" + case 160: /* opt_order_type: DESC */ +#line 1044 "bison_parser.y" { (yyval.order_type) = kOrderDesc; } -#line 4758 "bison_parser.cpp" +#line 4778 "bison_parser.cpp" break; - case 160: /* opt_order_type: %empty */ -#line 1041 "bison_parser.y" + case 161: /* opt_order_type: %empty */ +#line 1045 "bison_parser.y" { (yyval.order_type) = kOrderAsc; } -#line 4764 "bison_parser.cpp" +#line 4784 "bison_parser.cpp" break; - case 161: /* opt_null_ordering: %empty */ -#line 1043 "bison_parser.y" + case 162: /* opt_null_ordering: %empty */ +#line 1047 "bison_parser.y" { (yyval.null_ordering_t) = NullOrdering::Undefined; } -#line 4770 "bison_parser.cpp" +#line 4790 "bison_parser.cpp" break; - case 162: /* opt_null_ordering: IDENTIFIER IDENTIFIER */ -#line 1044 "bison_parser.y" + case 163: /* opt_null_ordering: IDENTIFIER IDENTIFIER */ +#line 1048 "bison_parser.y" { auto null_ordering = NullOrdering::Undefined; if (strcasecmp((yyvsp[-1].sval), "nulls") == 0) { @@ -4790,115 +4809,115 @@ YYLTYPE yylloc = yyloc_default; (yyval.null_ordering_t) = null_ordering; } -#line 4794 "bison_parser.cpp" +#line 4814 "bison_parser.cpp" break; - case 163: /* opt_top: TOP int_literal */ -#line 1066 "bison_parser.y" + case 164: /* opt_top: TOP int_literal */ +#line 1070 "bison_parser.y" { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } -#line 4800 "bison_parser.cpp" +#line 4820 "bison_parser.cpp" break; - case 164: /* opt_top: %empty */ -#line 1067 "bison_parser.y" + case 165: /* opt_top: %empty */ +#line 1071 "bison_parser.y" { (yyval.limit) = nullptr; } -#line 4806 "bison_parser.cpp" +#line 4826 "bison_parser.cpp" break; - case 165: /* opt_limit: LIMIT expr */ -#line 1069 "bison_parser.y" + case 166: /* opt_limit: LIMIT expr */ +#line 1073 "bison_parser.y" { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } -#line 4812 "bison_parser.cpp" +#line 4832 "bison_parser.cpp" break; - case 166: /* opt_limit: OFFSET expr */ -#line 1070 "bison_parser.y" + case 167: /* opt_limit: OFFSET expr */ +#line 1074 "bison_parser.y" { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } -#line 4818 "bison_parser.cpp" +#line 4838 "bison_parser.cpp" break; - case 167: /* opt_limit: LIMIT expr OFFSET expr */ -#line 1071 "bison_parser.y" + case 168: /* opt_limit: LIMIT expr OFFSET expr */ +#line 1075 "bison_parser.y" { (yyval.limit) = new LimitDescription((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 4824 "bison_parser.cpp" +#line 4844 "bison_parser.cpp" break; - case 168: /* opt_limit: LIMIT ALL */ -#line 1072 "bison_parser.y" + case 169: /* opt_limit: LIMIT ALL */ +#line 1076 "bison_parser.y" { (yyval.limit) = new LimitDescription(nullptr, nullptr); } -#line 4830 "bison_parser.cpp" +#line 4850 "bison_parser.cpp" break; - case 169: /* opt_limit: LIMIT ALL OFFSET expr */ -#line 1073 "bison_parser.y" + case 170: /* opt_limit: LIMIT ALL OFFSET expr */ +#line 1077 "bison_parser.y" { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } -#line 4836 "bison_parser.cpp" +#line 4856 "bison_parser.cpp" break; - case 170: /* opt_limit: %empty */ -#line 1074 "bison_parser.y" + case 171: /* opt_limit: %empty */ +#line 1078 "bison_parser.y" { (yyval.limit) = nullptr; } -#line 4842 "bison_parser.cpp" +#line 4862 "bison_parser.cpp" break; - case 171: /* expr_list: expr_alias */ -#line 1079 "bison_parser.y" + case 172: /* expr_list: expr_alias */ +#line 1083 "bison_parser.y" { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 4851 "bison_parser.cpp" +#line 4871 "bison_parser.cpp" break; - case 172: /* expr_list: expr_list ',' expr_alias */ -#line 1083 "bison_parser.y" + case 173: /* expr_list: expr_list ',' expr_alias */ +#line 1087 "bison_parser.y" { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 4860 "bison_parser.cpp" +#line 4880 "bison_parser.cpp" break; - case 173: /* opt_extended_literal_list: extended_literal_list */ -#line 1089 "bison_parser.y" + case 174: /* opt_extended_literal_list: extended_literal_list */ +#line 1093 "bison_parser.y" { (yyval.expr_vec) = (yyvsp[0].expr_vec); } -#line 4866 "bison_parser.cpp" +#line 4886 "bison_parser.cpp" break; - case 174: /* opt_extended_literal_list: %empty */ -#line 1090 "bison_parser.y" + case 175: /* opt_extended_literal_list: %empty */ +#line 1094 "bison_parser.y" { (yyval.expr_vec) = nullptr; } -#line 4872 "bison_parser.cpp" +#line 4892 "bison_parser.cpp" break; - case 175: /* extended_literal_list: casted_extended_literal */ -#line 1092 "bison_parser.y" + case 176: /* extended_literal_list: casted_extended_literal */ +#line 1096 "bison_parser.y" { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 4881 "bison_parser.cpp" +#line 4901 "bison_parser.cpp" break; - case 176: /* extended_literal_list: extended_literal_list ',' casted_extended_literal */ -#line 1096 "bison_parser.y" + case 177: /* extended_literal_list: extended_literal_list ',' casted_extended_literal */ +#line 1100 "bison_parser.y" { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 4890 "bison_parser.cpp" +#line 4910 "bison_parser.cpp" break; - case 178: /* casted_extended_literal: CAST '(' extended_literal AS column_type ')' */ -#line 1101 "bison_parser.y" + case 179: /* casted_extended_literal: CAST '(' extended_literal AS column_type ')' */ +#line 1105 "bison_parser.y" { (yyval.expr) = Expr::makeCast((yyvsp[-3].expr), (yyvsp[-1].column_type_t)); } -#line 4898 "bison_parser.cpp" +#line 4918 "bison_parser.cpp" break; - case 179: /* extended_literal: literal */ -#line 1105 "bison_parser.y" + case 180: /* extended_literal: literal */ +#line 1109 "bison_parser.y" { if ((yyvsp[0].expr)->type == ExprType::kExprParameter) { delete (yyvsp[0].expr); @@ -4907,23 +4926,23 @@ YYLTYPE yylloc = yyloc_default; } (yyval.expr) = (yyvsp[0].expr); } -#line 4911 "bison_parser.cpp" +#line 4931 "bison_parser.cpp" break; - case 180: /* extended_literal: '-' num_literal */ -#line 1113 "bison_parser.y" + case 181: /* extended_literal: '-' num_literal */ +#line 1117 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 4917 "bison_parser.cpp" +#line 4937 "bison_parser.cpp" break; - case 181: /* extended_literal: '-' interval_literal */ -#line 1114 "bison_parser.y" + case 182: /* extended_literal: '-' interval_literal */ +#line 1118 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 4923 "bison_parser.cpp" +#line 4943 "bison_parser.cpp" break; - case 182: /* expr_alias: expr opt_alias */ -#line 1116 "bison_parser.y" + case 183: /* expr_alias: expr opt_alias */ +#line 1120 "bison_parser.y" { (yyval.expr) = (yyvsp[-1].expr); if ((yyvsp[0].alias_t)) { @@ -4932,597 +4951,597 @@ YYLTYPE yylloc = yyloc_default; delete (yyvsp[0].alias_t); } } -#line 4936 "bison_parser.cpp" +#line 4956 "bison_parser.cpp" break; - case 188: /* operand: '(' expr ')' */ -#line 1127 "bison_parser.y" + case 189: /* operand: '(' expr ')' */ +#line 1131 "bison_parser.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 4942 "bison_parser.cpp" +#line 4962 "bison_parser.cpp" break; - case 198: /* operand: '(' select_no_paren ')' */ -#line 1129 "bison_parser.y" + case 199: /* operand: '(' select_no_paren ')' */ +#line 1133 "bison_parser.y" { (yyval.expr) = Expr::makeSelect((yyvsp[-1].select_stmt)); } -#line 4950 "bison_parser.cpp" +#line 4970 "bison_parser.cpp" break; - case 201: /* unary_expr: '-' operand */ -#line 1135 "bison_parser.y" + case 202: /* unary_expr: '-' operand */ +#line 1139 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 4956 "bison_parser.cpp" +#line 4976 "bison_parser.cpp" break; - case 202: /* unary_expr: NOT operand */ -#line 1136 "bison_parser.y" + case 203: /* unary_expr: NOT operand */ +#line 1140 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } -#line 4962 "bison_parser.cpp" +#line 4982 "bison_parser.cpp" break; - case 203: /* unary_expr: operand ISNULL */ -#line 1137 "bison_parser.y" + case 204: /* unary_expr: operand ISNULL */ +#line 1141 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-1].expr)); } -#line 4968 "bison_parser.cpp" +#line 4988 "bison_parser.cpp" break; - case 204: /* unary_expr: operand IS NULL */ -#line 1138 "bison_parser.y" + case 205: /* unary_expr: operand IS NULL */ +#line 1142 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-2].expr)); } -#line 4974 "bison_parser.cpp" +#line 4994 "bison_parser.cpp" break; - case 205: /* unary_expr: operand IS NOT NULL */ -#line 1139 "bison_parser.y" + case 206: /* unary_expr: operand IS NOT NULL */ +#line 1143 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, (yyvsp[-3].expr))); } -#line 4980 "bison_parser.cpp" +#line 5000 "bison_parser.cpp" break; - case 207: /* binary_expr: operand '-' operand */ -#line 1141 "bison_parser.y" + case 208: /* binary_expr: operand '-' operand */ +#line 1145 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMinus, (yyvsp[0].expr)); } -#line 4986 "bison_parser.cpp" +#line 5006 "bison_parser.cpp" break; - case 208: /* binary_expr: operand '+' operand */ -#line 1142 "bison_parser.y" + case 209: /* binary_expr: operand '+' operand */ +#line 1146 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPlus, (yyvsp[0].expr)); } -#line 4992 "bison_parser.cpp" +#line 5012 "bison_parser.cpp" break; - case 209: /* binary_expr: operand '/' operand */ -#line 1143 "bison_parser.y" + case 210: /* binary_expr: operand '/' operand */ +#line 1147 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpSlash, (yyvsp[0].expr)); } -#line 4998 "bison_parser.cpp" +#line 5018 "bison_parser.cpp" break; - case 210: /* binary_expr: operand '*' operand */ -#line 1144 "bison_parser.y" + case 211: /* binary_expr: operand '*' operand */ +#line 1148 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAsterisk, (yyvsp[0].expr)); } -#line 5004 "bison_parser.cpp" +#line 5024 "bison_parser.cpp" break; - case 211: /* binary_expr: operand '%' operand */ -#line 1145 "bison_parser.y" + case 212: /* binary_expr: operand '%' operand */ +#line 1149 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPercentage, (yyvsp[0].expr)); } -#line 5010 "bison_parser.cpp" +#line 5030 "bison_parser.cpp" break; - case 212: /* binary_expr: operand MOD operand */ -#line 1146 "bison_parser.y" + case 213: /* binary_expr: operand MOD operand */ +#line 1150 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMod, (yyvsp[0].expr)); } -#line 5016 "bison_parser.cpp" +#line 5036 "bison_parser.cpp" break; - case 213: /* binary_expr: operand DIV operand */ -#line 1147 "bison_parser.y" + case 214: /* binary_expr: operand DIV operand */ +#line 1151 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpDiv, (yyvsp[0].expr)); } -#line 5022 "bison_parser.cpp" +#line 5042 "bison_parser.cpp" break; - case 214: /* binary_expr: operand '^' operand */ -#line 1148 "bison_parser.y" + case 215: /* binary_expr: operand '^' operand */ +#line 1152 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitXor, (yyvsp[0].expr)); } -#line 5028 "bison_parser.cpp" +#line 5048 "bison_parser.cpp" break; - case 215: /* binary_expr: operand '&' operand */ -#line 1149 "bison_parser.y" + case 216: /* binary_expr: operand '&' operand */ +#line 1153 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitAnd, (yyvsp[0].expr)); } -#line 5034 "bison_parser.cpp" +#line 5054 "bison_parser.cpp" break; - case 216: /* binary_expr: operand '|' operand */ -#line 1150 "bison_parser.y" + case 217: /* binary_expr: operand '|' operand */ +#line 1154 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitOr, (yyvsp[0].expr)); } -#line 5040 "bison_parser.cpp" +#line 5060 "bison_parser.cpp" break; - case 217: /* binary_expr: operand BITSHIFTLEFT operand */ -#line 1151 "bison_parser.y" + case 218: /* binary_expr: operand BITSHIFTLEFT operand */ +#line 1155 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitShiftLeft, (yyvsp[0].expr)); } -#line 5046 "bison_parser.cpp" +#line 5066 "bison_parser.cpp" break; - case 218: /* binary_expr: operand BITSHIFTRIGHT operand */ -#line 1152 "bison_parser.y" + case 219: /* binary_expr: operand BITSHIFTRIGHT operand */ +#line 1156 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitShiftRight, (yyvsp[0].expr)); } -#line 5052 "bison_parser.cpp" +#line 5072 "bison_parser.cpp" break; - case 219: /* binary_expr: operand LIKE operand */ -#line 1153 "bison_parser.y" + case 220: /* binary_expr: operand LIKE operand */ +#line 1157 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } -#line 5058 "bison_parser.cpp" +#line 5078 "bison_parser.cpp" break; - case 220: /* binary_expr: operand NOT LIKE operand */ -#line 1154 "bison_parser.y" + case 221: /* binary_expr: operand NOT LIKE operand */ +#line 1158 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } -#line 5064 "bison_parser.cpp" +#line 5084 "bison_parser.cpp" break; - case 221: /* binary_expr: operand ILIKE operand */ -#line 1155 "bison_parser.y" + case 222: /* binary_expr: operand ILIKE operand */ +#line 1159 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpILike, (yyvsp[0].expr)); } -#line 5070 "bison_parser.cpp" +#line 5090 "bison_parser.cpp" break; - case 222: /* binary_expr: operand CONCAT operand */ -#line 1156 "bison_parser.y" + case 223: /* binary_expr: operand CONCAT operand */ +#line 1160 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpConcat, (yyvsp[0].expr)); } -#line 5076 "bison_parser.cpp" +#line 5096 "bison_parser.cpp" break; - case 223: /* logic_expr: expr AND expr */ -#line 1158 "bison_parser.y" + case 224: /* logic_expr: expr AND expr */ +#line 1162 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } -#line 5082 "bison_parser.cpp" +#line 5102 "bison_parser.cpp" break; - case 224: /* logic_expr: expr LOGICALAND expr */ -#line 1159 "bison_parser.y" + case 225: /* logic_expr: expr LOGICALAND expr */ +#line 1163 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } -#line 5088 "bison_parser.cpp" +#line 5108 "bison_parser.cpp" break; - case 225: /* logic_expr: expr OR expr */ -#line 1160 "bison_parser.y" + case 226: /* logic_expr: expr OR expr */ +#line 1164 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } -#line 5094 "bison_parser.cpp" +#line 5114 "bison_parser.cpp" break; - case 226: /* logic_expr: expr LOGICALOR expr */ -#line 1161 "bison_parser.y" + case 227: /* logic_expr: expr LOGICALOR expr */ +#line 1165 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } -#line 5100 "bison_parser.cpp" +#line 5120 "bison_parser.cpp" break; - case 227: /* in_expr: operand IN '(' expr_list ')' */ -#line 1163 "bison_parser.y" + case 228: /* in_expr: operand IN '(' expr_list ')' */ +#line 1167 "bison_parser.y" { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } -#line 5106 "bison_parser.cpp" +#line 5126 "bison_parser.cpp" break; - case 228: /* in_expr: operand NOT IN '(' expr_list ')' */ -#line 1164 "bison_parser.y" + case 229: /* in_expr: operand NOT IN '(' expr_list ')' */ +#line 1168 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } -#line 5112 "bison_parser.cpp" +#line 5132 "bison_parser.cpp" break; - case 229: /* in_expr: operand IN '(' select_no_paren ')' */ -#line 1165 "bison_parser.y" + case 230: /* in_expr: operand IN '(' select_no_paren ')' */ +#line 1169 "bison_parser.y" { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } -#line 5118 "bison_parser.cpp" +#line 5138 "bison_parser.cpp" break; - case 230: /* in_expr: operand NOT IN '(' select_no_paren ')' */ -#line 1166 "bison_parser.y" + case 231: /* in_expr: operand NOT IN '(' select_no_paren ')' */ +#line 1170 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } -#line 5124 "bison_parser.cpp" +#line 5144 "bison_parser.cpp" break; - case 231: /* case_expr: CASE expr case_list END */ -#line 1170 "bison_parser.y" + case 232: /* case_expr: CASE expr case_list END */ +#line 1174 "bison_parser.y" { (yyval.expr) = Expr::makeCase((yyvsp[-2].expr), (yyvsp[-1].expr), nullptr); } -#line 5130 "bison_parser.cpp" +#line 5150 "bison_parser.cpp" break; - case 232: /* case_expr: CASE expr case_list ELSE expr END */ -#line 1171 "bison_parser.y" + case 233: /* case_expr: CASE expr case_list ELSE expr END */ +#line 1175 "bison_parser.y" { (yyval.expr) = Expr::makeCase((yyvsp[-4].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 5136 "bison_parser.cpp" +#line 5156 "bison_parser.cpp" break; - case 233: /* case_expr: CASE case_list END */ -#line 1172 "bison_parser.y" + case 234: /* case_expr: CASE case_list END */ +#line 1176 "bison_parser.y" { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-1].expr), nullptr); } -#line 5142 "bison_parser.cpp" +#line 5162 "bison_parser.cpp" break; - case 234: /* case_expr: CASE case_list ELSE expr END */ -#line 1173 "bison_parser.y" + case 235: /* case_expr: CASE case_list ELSE expr END */ +#line 1177 "bison_parser.y" { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 5148 "bison_parser.cpp" +#line 5168 "bison_parser.cpp" break; - case 235: /* case_list: WHEN expr THEN expr */ -#line 1175 "bison_parser.y" + case 236: /* case_list: WHEN expr THEN expr */ +#line 1179 "bison_parser.y" { (yyval.expr) = Expr::makeCaseList(Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 5154 "bison_parser.cpp" +#line 5174 "bison_parser.cpp" break; - case 236: /* case_list: case_list WHEN expr THEN expr */ -#line 1176 "bison_parser.y" + case 237: /* case_list: case_list WHEN expr THEN expr */ +#line 1180 "bison_parser.y" { (yyval.expr) = Expr::caseListAppend((yyvsp[-4].expr), Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 5160 "bison_parser.cpp" +#line 5180 "bison_parser.cpp" break; - case 237: /* exists_expr: EXISTS '(' select_no_paren ')' */ -#line 1178 "bison_parser.y" + case 238: /* exists_expr: EXISTS '(' select_no_paren ')' */ +#line 1182 "bison_parser.y" { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } -#line 5166 "bison_parser.cpp" +#line 5186 "bison_parser.cpp" break; - case 238: /* exists_expr: NOT EXISTS '(' select_no_paren ')' */ -#line 1179 "bison_parser.y" + case 239: /* exists_expr: NOT EXISTS '(' select_no_paren ')' */ +#line 1183 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } -#line 5172 "bison_parser.cpp" +#line 5192 "bison_parser.cpp" break; - case 239: /* comp_expr: operand '=' operand */ -#line 1181 "bison_parser.y" + case 240: /* comp_expr: operand '=' operand */ +#line 1185 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } -#line 5178 "bison_parser.cpp" +#line 5198 "bison_parser.cpp" break; - case 240: /* comp_expr: operand EQUALS operand */ -#line 1182 "bison_parser.y" + case 241: /* comp_expr: operand EQUALS operand */ +#line 1186 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } -#line 5184 "bison_parser.cpp" +#line 5204 "bison_parser.cpp" break; - case 241: /* comp_expr: operand NULLSAFEEQUALS operand */ -#line 1183 "bison_parser.y" + case 242: /* comp_expr: operand NULLSAFEEQUALS operand */ +#line 1187 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNullSafeEquals, (yyvsp[0].expr)); } -#line 5190 "bison_parser.cpp" +#line 5210 "bison_parser.cpp" break; - case 242: /* comp_expr: operand NOTEQUALS operand */ -#line 1184 "bison_parser.y" + case 243: /* comp_expr: operand NOTEQUALS operand */ +#line 1188 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } -#line 5196 "bison_parser.cpp" +#line 5216 "bison_parser.cpp" break; - case 243: /* comp_expr: operand '<' operand */ -#line 1185 "bison_parser.y" + case 244: /* comp_expr: operand '<' operand */ +#line 1189 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLess, (yyvsp[0].expr)); } -#line 5202 "bison_parser.cpp" +#line 5222 "bison_parser.cpp" break; - case 244: /* comp_expr: operand '>' operand */ -#line 1186 "bison_parser.y" + case 245: /* comp_expr: operand '>' operand */ +#line 1190 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreater, (yyvsp[0].expr)); } -#line 5208 "bison_parser.cpp" +#line 5228 "bison_parser.cpp" break; - case 245: /* comp_expr: operand LESSEQ operand */ -#line 1187 "bison_parser.y" + case 246: /* comp_expr: operand LESSEQ operand */ +#line 1191 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } -#line 5214 "bison_parser.cpp" +#line 5234 "bison_parser.cpp" break; - case 246: /* comp_expr: operand GREATEREQ operand */ -#line 1188 "bison_parser.y" + case 247: /* comp_expr: operand GREATEREQ operand */ +#line 1192 "bison_parser.y" { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } -#line 5220 "bison_parser.cpp" +#line 5240 "bison_parser.cpp" break; - case 247: /* function_expr: IDENTIFIER '(' ')' opt_window */ -#line 1192 "bison_parser.y" + case 248: /* function_expr: IDENTIFIER '(' ')' opt_window */ +#line 1196 "bison_parser.y" { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-3].sval), new std::vector(), false, (yyvsp[0].window_description)); } -#line 5226 "bison_parser.cpp" +#line 5246 "bison_parser.cpp" break; - case 248: /* function_expr: IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ -#line 1193 "bison_parser.y" + case 249: /* function_expr: IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ +#line 1197 "bison_parser.y" { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-5].sval), (yyvsp[-2].expr_vec), (yyvsp[-3].bval), (yyvsp[0].window_description)); } -#line 5232 "bison_parser.cpp" +#line 5252 "bison_parser.cpp" break; - case 249: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' ')' opt_window */ -#line 1194 "bison_parser.y" + case 250: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' ')' opt_window */ +#line 1198 "bison_parser.y" { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-3].sval), (yyvsp[-5].sval), new std::vector(), false, (yyvsp[0].window_description)); } -#line 5238 "bison_parser.cpp" +#line 5258 "bison_parser.cpp" break; - case 250: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ -#line 1195 "bison_parser.y" + case 251: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ +#line 1199 "bison_parser.y" { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-5].sval), (yyvsp[-7].sval), (yyvsp[-2].expr_vec), (yyvsp[-3].bval), (yyvsp[0].window_description)); } -#line 5244 "bison_parser.cpp" +#line 5264 "bison_parser.cpp" break; - case 251: /* opt_window: OVER '(' opt_partition opt_order opt_frame_clause ')' */ -#line 1199 "bison_parser.y" + case 252: /* opt_window: OVER '(' opt_partition opt_order opt_frame_clause ')' */ +#line 1203 "bison_parser.y" { (yyval.window_description) = new WindowDescription((yyvsp[-3].expr_vec), (yyvsp[-2].order_vec), (yyvsp[-1].frame_description)); } -#line 5250 "bison_parser.cpp" +#line 5270 "bison_parser.cpp" break; - case 252: /* opt_window: %empty */ -#line 1200 "bison_parser.y" + case 253: /* opt_window: %empty */ +#line 1204 "bison_parser.y" { (yyval.window_description) = nullptr; } -#line 5256 "bison_parser.cpp" +#line 5276 "bison_parser.cpp" break; - case 253: /* opt_partition: PARTITION BY expr_list */ -#line 1202 "bison_parser.y" + case 254: /* opt_partition: PARTITION BY expr_list */ +#line 1206 "bison_parser.y" { (yyval.expr_vec) = (yyvsp[0].expr_vec); } -#line 5262 "bison_parser.cpp" +#line 5282 "bison_parser.cpp" break; - case 254: /* opt_partition: %empty */ -#line 1203 "bison_parser.y" + case 255: /* opt_partition: %empty */ +#line 1207 "bison_parser.y" { (yyval.expr_vec) = nullptr; } -#line 5268 "bison_parser.cpp" +#line 5288 "bison_parser.cpp" break; - case 255: /* opt_frame_clause: frame_type frame_bound */ -#line 1208 "bison_parser.y" + case 256: /* opt_frame_clause: frame_type frame_bound */ +#line 1212 "bison_parser.y" { (yyval.frame_description) = new FrameDescription{(yyvsp[-1].frame_type), (yyvsp[0].frame_bound), new FrameBound{0, kCurrentRow, false}}; } -#line 5274 "bison_parser.cpp" +#line 5294 "bison_parser.cpp" break; - case 256: /* opt_frame_clause: frame_type BETWEEN frame_bound AND frame_bound */ -#line 1209 "bison_parser.y" + case 257: /* opt_frame_clause: frame_type BETWEEN frame_bound AND frame_bound */ +#line 1213 "bison_parser.y" { (yyval.frame_description) = new FrameDescription{(yyvsp[-4].frame_type), (yyvsp[-2].frame_bound), (yyvsp[0].frame_bound)}; } -#line 5280 "bison_parser.cpp" +#line 5300 "bison_parser.cpp" break; - case 257: /* opt_frame_clause: %empty */ -#line 1210 "bison_parser.y" + case 258: /* opt_frame_clause: %empty */ +#line 1214 "bison_parser.y" { (yyval.frame_description) = new FrameDescription{kRange, new FrameBound{0, kPreceding, true}, new FrameBound{0, kCurrentRow, false}}; } -#line 5288 "bison_parser.cpp" +#line 5308 "bison_parser.cpp" break; - case 258: /* frame_type: RANGE */ -#line 1214 "bison_parser.y" + case 259: /* frame_type: RANGE */ +#line 1218 "bison_parser.y" { (yyval.frame_type) = kRange; } -#line 5294 "bison_parser.cpp" +#line 5314 "bison_parser.cpp" break; - case 259: /* frame_type: ROWS */ -#line 1215 "bison_parser.y" + case 260: /* frame_type: ROWS */ +#line 1219 "bison_parser.y" { (yyval.frame_type) = kRows; } -#line 5300 "bison_parser.cpp" +#line 5320 "bison_parser.cpp" break; - case 260: /* frame_type: GROUPS */ -#line 1216 "bison_parser.y" + case 261: /* frame_type: GROUPS */ +#line 1220 "bison_parser.y" { (yyval.frame_type) = kGroups; } -#line 5306 "bison_parser.cpp" +#line 5326 "bison_parser.cpp" break; - case 261: /* frame_bound: UNBOUNDED PRECEDING */ -#line 1218 "bison_parser.y" + case 262: /* frame_bound: UNBOUNDED PRECEDING */ +#line 1222 "bison_parser.y" { (yyval.frame_bound) = new FrameBound{0, kPreceding, true}; } -#line 5312 "bison_parser.cpp" +#line 5332 "bison_parser.cpp" break; - case 262: /* frame_bound: INTVAL PRECEDING */ -#line 1219 "bison_parser.y" + case 263: /* frame_bound: INTVAL PRECEDING */ +#line 1223 "bison_parser.y" { (yyval.frame_bound) = new FrameBound{(yyvsp[-1].ival), kPreceding, false}; } -#line 5318 "bison_parser.cpp" +#line 5338 "bison_parser.cpp" break; - case 263: /* frame_bound: UNBOUNDED FOLLOWING */ -#line 1220 "bison_parser.y" + case 264: /* frame_bound: UNBOUNDED FOLLOWING */ +#line 1224 "bison_parser.y" { (yyval.frame_bound) = new FrameBound{0, kFollowing, true}; } -#line 5324 "bison_parser.cpp" +#line 5344 "bison_parser.cpp" break; - case 264: /* frame_bound: INTVAL FOLLOWING */ -#line 1221 "bison_parser.y" + case 265: /* frame_bound: INTVAL FOLLOWING */ +#line 1225 "bison_parser.y" { (yyval.frame_bound) = new FrameBound{(yyvsp[-1].ival), kFollowing, false}; } -#line 5330 "bison_parser.cpp" +#line 5350 "bison_parser.cpp" break; - case 265: /* frame_bound: CURRENT_ROW */ -#line 1222 "bison_parser.y" + case 266: /* frame_bound: CURRENT_ROW */ +#line 1226 "bison_parser.y" { (yyval.frame_bound) = new FrameBound{0, kCurrentRow, false}; } -#line 5336 "bison_parser.cpp" +#line 5356 "bison_parser.cpp" break; - case 266: /* extract_expr: EXTRACT '(' datetime_field FROM expr ')' */ -#line 1224 "bison_parser.y" + case 267: /* extract_expr: EXTRACT '(' datetime_field FROM expr ')' */ +#line 1228 "bison_parser.y" { (yyval.expr) = Expr::makeExtract((yyvsp[-3].datetime_field), (yyvsp[-1].expr)); } -#line 5342 "bison_parser.cpp" +#line 5362 "bison_parser.cpp" break; - case 267: /* cast_expr: CAST '(' expr AS column_type ')' */ -#line 1226 "bison_parser.y" + case 268: /* cast_expr: CAST '(' expr AS column_type ')' */ +#line 1230 "bison_parser.y" { (yyval.expr) = Expr::makeCast((yyvsp[-3].expr), (yyvsp[-1].column_type_t)); } -#line 5348 "bison_parser.cpp" +#line 5368 "bison_parser.cpp" break; - case 268: /* datetime_field: SECOND */ -#line 1228 "bison_parser.y" + case 269: /* datetime_field: SECOND */ +#line 1232 "bison_parser.y" { (yyval.datetime_field) = kDatetimeSecond; } -#line 5354 "bison_parser.cpp" +#line 5374 "bison_parser.cpp" break; - case 269: /* datetime_field: MINUTE */ -#line 1229 "bison_parser.y" + case 270: /* datetime_field: MINUTE */ +#line 1233 "bison_parser.y" { (yyval.datetime_field) = kDatetimeMinute; } -#line 5360 "bison_parser.cpp" +#line 5380 "bison_parser.cpp" break; - case 270: /* datetime_field: HOUR */ -#line 1230 "bison_parser.y" + case 271: /* datetime_field: HOUR */ +#line 1234 "bison_parser.y" { (yyval.datetime_field) = kDatetimeHour; } -#line 5366 "bison_parser.cpp" +#line 5386 "bison_parser.cpp" break; - case 271: /* datetime_field: DAY */ -#line 1231 "bison_parser.y" + case 272: /* datetime_field: DAY */ +#line 1235 "bison_parser.y" { (yyval.datetime_field) = kDatetimeDay; } -#line 5372 "bison_parser.cpp" +#line 5392 "bison_parser.cpp" break; - case 272: /* datetime_field: MONTH */ -#line 1232 "bison_parser.y" + case 273: /* datetime_field: MONTH */ +#line 1236 "bison_parser.y" { (yyval.datetime_field) = kDatetimeMonth; } -#line 5378 "bison_parser.cpp" +#line 5398 "bison_parser.cpp" break; - case 273: /* datetime_field: YEAR */ -#line 1233 "bison_parser.y" + case 274: /* datetime_field: YEAR */ +#line 1237 "bison_parser.y" { (yyval.datetime_field) = kDatetimeYear; } -#line 5384 "bison_parser.cpp" +#line 5404 "bison_parser.cpp" break; - case 274: /* datetime_field_plural: SECONDS */ -#line 1235 "bison_parser.y" + case 275: /* datetime_field_plural: SECONDS */ +#line 1239 "bison_parser.y" { (yyval.datetime_field) = kDatetimeSecond; } -#line 5390 "bison_parser.cpp" +#line 5410 "bison_parser.cpp" break; - case 275: /* datetime_field_plural: MINUTES */ -#line 1236 "bison_parser.y" + case 276: /* datetime_field_plural: MINUTES */ +#line 1240 "bison_parser.y" { (yyval.datetime_field) = kDatetimeMinute; } -#line 5396 "bison_parser.cpp" +#line 5416 "bison_parser.cpp" break; - case 276: /* datetime_field_plural: HOURS */ -#line 1237 "bison_parser.y" + case 277: /* datetime_field_plural: HOURS */ +#line 1241 "bison_parser.y" { (yyval.datetime_field) = kDatetimeHour; } -#line 5402 "bison_parser.cpp" +#line 5422 "bison_parser.cpp" break; - case 277: /* datetime_field_plural: DAYS */ -#line 1238 "bison_parser.y" + case 278: /* datetime_field_plural: DAYS */ +#line 1242 "bison_parser.y" { (yyval.datetime_field) = kDatetimeDay; } -#line 5408 "bison_parser.cpp" +#line 5428 "bison_parser.cpp" break; - case 278: /* datetime_field_plural: MONTHS */ -#line 1239 "bison_parser.y" + case 279: /* datetime_field_plural: MONTHS */ +#line 1243 "bison_parser.y" { (yyval.datetime_field) = kDatetimeMonth; } -#line 5414 "bison_parser.cpp" +#line 5434 "bison_parser.cpp" break; - case 279: /* datetime_field_plural: YEARS */ -#line 1240 "bison_parser.y" + case 280: /* datetime_field_plural: YEARS */ +#line 1244 "bison_parser.y" { (yyval.datetime_field) = kDatetimeYear; } -#line 5420 "bison_parser.cpp" +#line 5440 "bison_parser.cpp" break; - case 282: /* array_expr: ARRAY '[' expr_list ']' */ -#line 1244 "bison_parser.y" + case 283: /* array_expr: ARRAY '[' expr_list ']' */ +#line 1248 "bison_parser.y" { (yyval.expr) = Expr::makeArray((yyvsp[-1].expr_vec)); } -#line 5426 "bison_parser.cpp" +#line 5446 "bison_parser.cpp" break; - case 283: /* array_index: operand '[' int_literal ']' */ -#line 1246 "bison_parser.y" + case 284: /* array_index: operand '[' int_literal ']' */ +#line 1250 "bison_parser.y" { (yyval.expr) = Expr::makeArrayIndex((yyvsp[-3].expr), (yyvsp[-1].expr)->ival); } -#line 5432 "bison_parser.cpp" +#line 5452 "bison_parser.cpp" break; - case 284: /* between_expr: operand BETWEEN operand AND operand */ -#line 1248 "bison_parser.y" + case 285: /* between_expr: operand BETWEEN operand AND operand */ +#line 1252 "bison_parser.y" { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 5438 "bison_parser.cpp" +#line 5458 "bison_parser.cpp" break; - case 285: /* between_expr: operand NOT BETWEEN operand AND operand */ -#line 1249 "bison_parser.y" + case 286: /* between_expr: operand NOT BETWEEN operand AND operand */ +#line 1253 "bison_parser.y" { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeBetween((yyvsp[-5].expr), (yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 5444 "bison_parser.cpp" +#line 5464 "bison_parser.cpp" break; - case 286: /* column_name: IDENTIFIER */ -#line 1251 "bison_parser.y" + case 287: /* column_name: IDENTIFIER */ +#line 1255 "bison_parser.y" { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } -#line 5450 "bison_parser.cpp" +#line 5470 "bison_parser.cpp" break; - case 287: /* column_name: OFFSET */ -#line 1252 "bison_parser.y" + case 288: /* column_name: OFFSET */ +#line 1256 "bison_parser.y" { (yyval.expr) = Expr::makeColumnRef(strdup("offset")); } -#line 5456 "bison_parser.cpp" +#line 5476 "bison_parser.cpp" break; - case 288: /* column_name: IDENTIFIER '.' IDENTIFIER */ -#line 1253 "bison_parser.y" + case 289: /* column_name: IDENTIFIER '.' IDENTIFIER */ +#line 1257 "bison_parser.y" { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 5462 "bison_parser.cpp" +#line 5482 "bison_parser.cpp" break; - case 289: /* column_name: IDENTIFIER '.' IDENTIFIER '.' IDENTIFIER */ -#line 1254 "bison_parser.y" + case 290: /* column_name: IDENTIFIER '.' IDENTIFIER '.' IDENTIFIER */ +#line 1258 "bison_parser.y" { (yyval.expr) = Expr::makeColumnRef((yyvsp[-4].sval), (yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 5468 "bison_parser.cpp" +#line 5488 "bison_parser.cpp" break; - case 290: /* column_name: '*' */ -#line 1255 "bison_parser.y" + case 291: /* column_name: '*' */ +#line 1259 "bison_parser.y" { (yyval.expr) = Expr::makeStar(); } -#line 5474 "bison_parser.cpp" +#line 5494 "bison_parser.cpp" break; - case 291: /* column_name: IDENTIFIER '.' '*' */ -#line 1256 "bison_parser.y" + case 292: /* column_name: IDENTIFIER '.' '*' */ +#line 1260 "bison_parser.y" { (yyval.expr) = Expr::makeStar((yyvsp[-2].sval)); } -#line 5480 "bison_parser.cpp" +#line 5500 "bison_parser.cpp" break; - case 299: /* string_literal: STRING */ -#line 1260 "bison_parser.y" + case 300: /* string_literal: STRING */ +#line 1264 "bison_parser.y" { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } -#line 5486 "bison_parser.cpp" +#line 5506 "bison_parser.cpp" break; - case 300: /* bool_literal: TRUE */ -#line 1262 "bison_parser.y" + case 301: /* bool_literal: TRUE */ +#line 1266 "bison_parser.y" { (yyval.expr) = Expr::makeLiteral(true); } -#line 5492 "bison_parser.cpp" +#line 5512 "bison_parser.cpp" break; - case 301: /* bool_literal: FALSE */ -#line 1263 "bison_parser.y" + case 302: /* bool_literal: FALSE */ +#line 1267 "bison_parser.y" { (yyval.expr) = Expr::makeLiteral(false); } -#line 5498 "bison_parser.cpp" +#line 5518 "bison_parser.cpp" break; - case 302: /* num_literal: FLOATVAL */ -#line 1265 "bison_parser.y" + case 303: /* num_literal: FLOATVAL */ +#line 1269 "bison_parser.y" { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } -#line 5504 "bison_parser.cpp" +#line 5524 "bison_parser.cpp" break; - case 304: /* int_literal: INTVAL */ -#line 1268 "bison_parser.y" + case 305: /* int_literal: INTVAL */ +#line 1272 "bison_parser.y" { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } -#line 5510 "bison_parser.cpp" +#line 5530 "bison_parser.cpp" break; - case 305: /* int_literal: BIGINTVAL */ -#line 1269 "bison_parser.y" + case 306: /* int_literal: BIGINTVAL */ +#line 1273 "bison_parser.y" { (yyval.expr) = Expr::makeLiteralIntString((yyvsp[0].sval)); } -#line 5516 "bison_parser.cpp" +#line 5536 "bison_parser.cpp" break; - case 306: /* null_literal: NULL */ -#line 1271 "bison_parser.y" + case 307: /* null_literal: NULL */ +#line 1275 "bison_parser.y" { (yyval.expr) = Expr::makeNullLiteral(); } -#line 5522 "bison_parser.cpp" +#line 5542 "bison_parser.cpp" break; - case 307: /* date_literal: DATE STRING */ -#line 1273 "bison_parser.y" + case 308: /* date_literal: DATE STRING */ +#line 1277 "bison_parser.y" { int day{0}, month{0}, year{0}, chars_parsed{0}; // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character @@ -5533,17 +5552,17 @@ YYLTYPE yylloc = yyloc_default; } (yyval.expr) = Expr::makeDateLiteral((yyvsp[0].sval)); } -#line 5537 "bison_parser.cpp" +#line 5557 "bison_parser.cpp" break; - case 308: /* interval_literal: INTVAL duration_field */ -#line 1284 "bison_parser.y" + case 309: /* interval_literal: INTVAL duration_field */ +#line 1288 "bison_parser.y" { (yyval.expr) = Expr::makeIntervalLiteral((yyvsp[-1].ival), (yyvsp[0].datetime_field)); } -#line 5543 "bison_parser.cpp" +#line 5563 "bison_parser.cpp" break; - case 309: /* interval_literal: INTERVAL STRING datetime_field */ -#line 1285 "bison_parser.y" + case 310: /* interval_literal: INTERVAL STRING datetime_field */ +#line 1289 "bison_parser.y" { int duration{0}, chars_parsed{0}; // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character @@ -5555,11 +5574,11 @@ YYLTYPE yylloc = yyloc_default; free((yyvsp[-1].sval)); (yyval.expr) = Expr::makeIntervalLiteral(duration, (yyvsp[0].datetime_field)); } -#line 5559 "bison_parser.cpp" +#line 5579 "bison_parser.cpp" break; - case 310: /* interval_literal: INTERVAL STRING */ -#line 1296 "bison_parser.y" + case 311: /* interval_literal: INTERVAL STRING */ +#line 1300 "bison_parser.y" { int duration{0}, chars_parsed{0}; // 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte @@ -5591,61 +5610,61 @@ YYLTYPE yylloc = yyloc_default; } (yyval.expr) = Expr::makeIntervalLiteral(duration, unit); } -#line 5595 "bison_parser.cpp" +#line 5615 "bison_parser.cpp" break; - case 311: /* param_expr: '?' */ -#line 1328 "bison_parser.y" + case 312: /* param_expr: '?' */ +#line 1332 "bison_parser.y" { (yyval.expr) = Expr::makeParameter(yylloc.total_column); (yyval.expr)->ival2 = yyloc.param_list.size(); yyloc.param_list.push_back((yyval.expr)); } -#line 5605 "bison_parser.cpp" +#line 5625 "bison_parser.cpp" break; - case 313: /* table_ref: table_ref_commalist ',' table_ref_atomic */ -#line 1337 "bison_parser.y" + case 314: /* table_ref: table_ref_commalist ',' table_ref_atomic */ +#line 1341 "bison_parser.y" { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); auto tbl = new TableRef(kTableCrossProduct); tbl->list = (yyvsp[-2].table_vec); (yyval.table) = tbl; } -#line 5616 "bison_parser.cpp" +#line 5636 "bison_parser.cpp" break; - case 317: /* nonjoin_table_ref_atomic: '(' select_statement ')' opt_table_alias */ -#line 1346 "bison_parser.y" + case 318: /* nonjoin_table_ref_atomic: '(' select_statement ')' opt_table_alias */ +#line 1350 "bison_parser.y" { auto tbl = new TableRef(kTableSelect); tbl->select = (yyvsp[-2].select_stmt); tbl->alias = (yyvsp[0].alias_t); (yyval.table) = tbl; } -#line 5627 "bison_parser.cpp" +#line 5647 "bison_parser.cpp" break; - case 318: /* table_ref_commalist: table_ref_atomic */ -#line 1353 "bison_parser.y" + case 319: /* table_ref_commalist: table_ref_atomic */ +#line 1357 "bison_parser.y" { (yyval.table_vec) = new std::vector(); (yyval.table_vec)->push_back((yyvsp[0].table)); } -#line 5636 "bison_parser.cpp" +#line 5656 "bison_parser.cpp" break; - case 319: /* table_ref_commalist: table_ref_commalist ',' table_ref_atomic */ -#line 1357 "bison_parser.y" + case 320: /* table_ref_commalist: table_ref_commalist ',' table_ref_atomic */ +#line 1361 "bison_parser.y" { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); (yyval.table_vec) = (yyvsp[-2].table_vec); } -#line 5645 "bison_parser.cpp" +#line 5665 "bison_parser.cpp" break; - case 320: /* table_ref_name: table_name opt_table_alias */ -#line 1362 "bison_parser.y" + case 321: /* table_ref_name: table_name opt_table_alias */ +#line 1366 "bison_parser.y" { auto tbl = new TableRef(kTableName); tbl->schema = (yyvsp[-1].table_name).schema; @@ -5653,215 +5672,215 @@ YYLTYPE yylloc = yyloc_default; tbl->alias = (yyvsp[0].alias_t); (yyval.table) = tbl; } -#line 5657 "bison_parser.cpp" +#line 5677 "bison_parser.cpp" break; - case 321: /* table_ref_name_no_alias: table_name */ -#line 1370 "bison_parser.y" + case 322: /* table_ref_name_no_alias: table_name */ +#line 1374 "bison_parser.y" { (yyval.table) = new TableRef(kTableName); (yyval.table)->schema = (yyvsp[0].table_name).schema; (yyval.table)->name = (yyvsp[0].table_name).name; } -#line 5667 "bison_parser.cpp" +#line 5687 "bison_parser.cpp" break; - case 322: /* table_name: IDENTIFIER */ -#line 1376 "bison_parser.y" + case 323: /* table_name: IDENTIFIER */ +#line 1380 "bison_parser.y" { (yyval.table_name).schema = nullptr; (yyval.table_name).name = (yyvsp[0].sval); } -#line 5676 "bison_parser.cpp" +#line 5696 "bison_parser.cpp" break; - case 323: /* table_name: IDENTIFIER '.' IDENTIFIER */ -#line 1380 "bison_parser.y" + case 324: /* table_name: IDENTIFIER '.' IDENTIFIER */ +#line 1384 "bison_parser.y" { (yyval.table_name).schema = (yyvsp[-2].sval); (yyval.table_name).name = (yyvsp[0].sval); } -#line 5685 "bison_parser.cpp" +#line 5705 "bison_parser.cpp" break; - case 324: /* opt_index_name: IDENTIFIER */ -#line 1385 "bison_parser.y" + case 325: /* opt_index_name: IDENTIFIER */ +#line 1389 "bison_parser.y" { (yyval.sval) = (yyvsp[0].sval); } -#line 5691 "bison_parser.cpp" +#line 5711 "bison_parser.cpp" break; - case 325: /* opt_index_name: %empty */ -#line 1386 "bison_parser.y" + case 326: /* opt_index_name: %empty */ +#line 1390 "bison_parser.y" { (yyval.sval) = nullptr; } -#line 5697 "bison_parser.cpp" +#line 5717 "bison_parser.cpp" break; - case 327: /* table_alias: AS IDENTIFIER '(' ident_commalist ')' */ -#line 1388 "bison_parser.y" + case 328: /* table_alias: AS IDENTIFIER '(' ident_commalist ')' */ +#line 1392 "bison_parser.y" { (yyval.alias_t) = new Alias((yyvsp[-3].sval), (yyvsp[-1].str_vec)); } -#line 5703 "bison_parser.cpp" +#line 5723 "bison_parser.cpp" break; - case 329: /* opt_table_alias: %empty */ -#line 1390 "bison_parser.y" + case 330: /* opt_table_alias: %empty */ +#line 1394 "bison_parser.y" { (yyval.alias_t) = nullptr; } -#line 5709 "bison_parser.cpp" +#line 5729 "bison_parser.cpp" break; - case 330: /* alias: AS IDENTIFIER */ -#line 1392 "bison_parser.y" + case 331: /* alias: AS IDENTIFIER */ +#line 1396 "bison_parser.y" { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } -#line 5715 "bison_parser.cpp" +#line 5735 "bison_parser.cpp" break; - case 331: /* alias: IDENTIFIER */ -#line 1393 "bison_parser.y" + case 332: /* alias: IDENTIFIER */ +#line 1397 "bison_parser.y" { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } -#line 5721 "bison_parser.cpp" +#line 5741 "bison_parser.cpp" break; - case 333: /* opt_alias: %empty */ -#line 1395 "bison_parser.y" + case 334: /* opt_alias: %empty */ +#line 1399 "bison_parser.y" { (yyval.alias_t) = nullptr; } -#line 5727 "bison_parser.cpp" +#line 5747 "bison_parser.cpp" break; - case 334: /* opt_locking_clause: opt_locking_clause_list */ -#line 1401 "bison_parser.y" + case 335: /* opt_locking_clause: opt_locking_clause_list */ +#line 1405 "bison_parser.y" { (yyval.locking_clause_vec) = (yyvsp[0].locking_clause_vec); } -#line 5733 "bison_parser.cpp" +#line 5753 "bison_parser.cpp" break; - case 335: /* opt_locking_clause: %empty */ -#line 1402 "bison_parser.y" + case 336: /* opt_locking_clause: %empty */ +#line 1406 "bison_parser.y" { (yyval.locking_clause_vec) = nullptr; } -#line 5739 "bison_parser.cpp" +#line 5759 "bison_parser.cpp" break; - case 336: /* opt_locking_clause_list: locking_clause */ -#line 1404 "bison_parser.y" + case 337: /* opt_locking_clause_list: locking_clause */ +#line 1408 "bison_parser.y" { (yyval.locking_clause_vec) = new std::vector(); (yyval.locking_clause_vec)->push_back((yyvsp[0].locking_t)); } -#line 5748 "bison_parser.cpp" +#line 5768 "bison_parser.cpp" break; - case 337: /* opt_locking_clause_list: opt_locking_clause_list locking_clause */ -#line 1408 "bison_parser.y" + case 338: /* opt_locking_clause_list: opt_locking_clause_list locking_clause */ +#line 1412 "bison_parser.y" { (yyvsp[-1].locking_clause_vec)->push_back((yyvsp[0].locking_t)); (yyval.locking_clause_vec) = (yyvsp[-1].locking_clause_vec); } -#line 5757 "bison_parser.cpp" +#line 5777 "bison_parser.cpp" break; - case 338: /* locking_clause: FOR row_lock_mode opt_row_lock_policy */ -#line 1413 "bison_parser.y" + case 339: /* locking_clause: FOR row_lock_mode opt_row_lock_policy */ +#line 1417 "bison_parser.y" { (yyval.locking_t) = new LockingClause(); (yyval.locking_t)->rowLockMode = (yyvsp[-1].lock_mode_t); (yyval.locking_t)->rowLockWaitPolicy = (yyvsp[0].lock_wait_policy_t); (yyval.locking_t)->tables = nullptr; } -#line 5768 "bison_parser.cpp" +#line 5788 "bison_parser.cpp" break; - case 339: /* locking_clause: FOR row_lock_mode OF ident_commalist opt_row_lock_policy */ -#line 1419 "bison_parser.y" + case 340: /* locking_clause: FOR row_lock_mode OF ident_commalist opt_row_lock_policy */ +#line 1423 "bison_parser.y" { (yyval.locking_t) = new LockingClause(); (yyval.locking_t)->rowLockMode = (yyvsp[-3].lock_mode_t); (yyval.locking_t)->tables = (yyvsp[-1].str_vec); (yyval.locking_t)->rowLockWaitPolicy = (yyvsp[0].lock_wait_policy_t); } -#line 5779 "bison_parser.cpp" +#line 5799 "bison_parser.cpp" break; - case 340: /* row_lock_mode: UPDATE */ -#line 1426 "bison_parser.y" + case 341: /* row_lock_mode: UPDATE */ +#line 1430 "bison_parser.y" { (yyval.lock_mode_t) = RowLockMode::ForUpdate; } -#line 5785 "bison_parser.cpp" +#line 5805 "bison_parser.cpp" break; - case 341: /* row_lock_mode: NO KEY UPDATE */ -#line 1427 "bison_parser.y" + case 342: /* row_lock_mode: NO KEY UPDATE */ +#line 1431 "bison_parser.y" { (yyval.lock_mode_t) = RowLockMode::ForNoKeyUpdate; } -#line 5791 "bison_parser.cpp" +#line 5811 "bison_parser.cpp" break; - case 342: /* row_lock_mode: SHARE */ -#line 1428 "bison_parser.y" + case 343: /* row_lock_mode: SHARE */ +#line 1432 "bison_parser.y" { (yyval.lock_mode_t) = RowLockMode::ForShare; } -#line 5797 "bison_parser.cpp" +#line 5817 "bison_parser.cpp" break; - case 343: /* row_lock_mode: KEY SHARE */ -#line 1429 "bison_parser.y" + case 344: /* row_lock_mode: KEY SHARE */ +#line 1433 "bison_parser.y" { (yyval.lock_mode_t) = RowLockMode::ForKeyShare; } -#line 5803 "bison_parser.cpp" +#line 5823 "bison_parser.cpp" break; - case 344: /* opt_row_lock_policy: SKIP LOCKED */ -#line 1431 "bison_parser.y" + case 345: /* opt_row_lock_policy: SKIP LOCKED */ +#line 1435 "bison_parser.y" { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::SkipLocked; } -#line 5809 "bison_parser.cpp" +#line 5829 "bison_parser.cpp" break; - case 345: /* opt_row_lock_policy: NOWAIT */ -#line 1432 "bison_parser.y" + case 346: /* opt_row_lock_policy: NOWAIT */ +#line 1436 "bison_parser.y" { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::NoWait; } -#line 5815 "bison_parser.cpp" +#line 5835 "bison_parser.cpp" break; - case 346: /* opt_row_lock_policy: %empty */ -#line 1433 "bison_parser.y" + case 347: /* opt_row_lock_policy: %empty */ +#line 1437 "bison_parser.y" { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::None; } -#line 5821 "bison_parser.cpp" +#line 5841 "bison_parser.cpp" break; - case 348: /* opt_with_clause: %empty */ -#line 1439 "bison_parser.y" + case 349: /* opt_with_clause: %empty */ +#line 1443 "bison_parser.y" { (yyval.with_description_vec) = nullptr; } -#line 5827 "bison_parser.cpp" +#line 5847 "bison_parser.cpp" break; - case 349: /* with_clause: WITH with_description_list */ -#line 1441 "bison_parser.y" + case 350: /* with_clause: WITH with_description_list */ +#line 1445 "bison_parser.y" { (yyval.with_description_vec) = (yyvsp[0].with_description_vec); } -#line 5833 "bison_parser.cpp" +#line 5853 "bison_parser.cpp" break; - case 350: /* with_description_list: with_description */ -#line 1443 "bison_parser.y" + case 351: /* with_description_list: with_description */ +#line 1447 "bison_parser.y" { (yyval.with_description_vec) = new std::vector(); (yyval.with_description_vec)->push_back((yyvsp[0].with_description_t)); } -#line 5842 "bison_parser.cpp" +#line 5862 "bison_parser.cpp" break; - case 351: /* with_description_list: with_description_list ',' with_description */ -#line 1447 "bison_parser.y" + case 352: /* with_description_list: with_description_list ',' with_description */ +#line 1451 "bison_parser.y" { (yyvsp[-2].with_description_vec)->push_back((yyvsp[0].with_description_t)); (yyval.with_description_vec) = (yyvsp[-2].with_description_vec); } -#line 5851 "bison_parser.cpp" +#line 5871 "bison_parser.cpp" break; - case 352: /* with_description: IDENTIFIER AS select_with_paren */ -#line 1452 "bison_parser.y" + case 353: /* with_description: IDENTIFIER AS select_with_paren */ +#line 1456 "bison_parser.y" { (yyval.with_description_t) = new WithDescription(); (yyval.with_description_t)->alias = (yyvsp[-2].sval); (yyval.with_description_t)->select = (yyvsp[0].select_stmt); } -#line 5861 "bison_parser.cpp" +#line 5881 "bison_parser.cpp" break; - case 353: /* join_clause: table_ref_atomic NATURAL JOIN nonjoin_table_ref_atomic */ -#line 1462 "bison_parser.y" + case 354: /* join_clause: table_ref_atomic NATURAL JOIN nonjoin_table_ref_atomic */ +#line 1466 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -5870,11 +5889,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.table)->join->left = (yyvsp[-3].table); (yyval.table)->join->right = (yyvsp[0].table); } -#line 5874 "bison_parser.cpp" +#line 5894 "bison_parser.cpp" break; - case 354: /* join_clause: table_ref_atomic NATURAL natural_join_type JOIN nonjoin_table_ref_atomic */ -#line 1470 "bison_parser.y" + case 355: /* join_clause: table_ref_atomic NATURAL natural_join_type JOIN nonjoin_table_ref_atomic */ +#line 1474 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -5883,11 +5902,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.table)->join->left = (yyvsp[-4].table); (yyval.table)->join->right = (yyvsp[0].table); } -#line 5887 "bison_parser.cpp" +#line 5907 "bison_parser.cpp" break; - case 355: /* join_clause: table_ref_atomic CROSS JOIN nonjoin_table_ref_atomic */ -#line 1478 "bison_parser.y" + case 356: /* join_clause: table_ref_atomic CROSS JOIN nonjoin_table_ref_atomic */ +#line 1482 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -5895,11 +5914,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.table)->join->left = (yyvsp[-3].table); (yyval.table)->join->right = (yyvsp[0].table); } -#line 5899 "bison_parser.cpp" +#line 5919 "bison_parser.cpp" break; - case 356: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic ON join_condition */ -#line 1485 "bison_parser.y" + case 357: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic ON join_condition */ +#line 1489 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -5908,11 +5927,11 @@ YYLTYPE yylloc = yyloc_default; (yyval.table)->join->right = (yyvsp[-2].table); (yyval.table)->join->condition = (yyvsp[0].expr); } -#line 5912 "bison_parser.cpp" +#line 5932 "bison_parser.cpp" break; - case 357: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic USING '(' ident_commalist ')' */ -#line 1493 "bison_parser.y" + case 358: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic USING '(' ident_commalist ')' */ +#line 1497 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -5921,125 +5940,125 @@ YYLTYPE yylloc = yyloc_default; (yyval.table)->join->right = (yyvsp[-4].table); (yyval.table)->join->namedColumns = (yyvsp[-1].str_vec); } -#line 5925 "bison_parser.cpp" +#line 5945 "bison_parser.cpp" break; - case 358: /* opt_join_type: INNER */ -#line 1502 "bison_parser.y" + case 359: /* opt_join_type: INNER */ +#line 1506 "bison_parser.y" { (yyval.join_type) = kJoinInner; } -#line 5931 "bison_parser.cpp" +#line 5951 "bison_parser.cpp" break; - case 359: /* opt_join_type: LEFT OUTER */ -#line 1503 "bison_parser.y" + case 360: /* opt_join_type: LEFT OUTER */ +#line 1507 "bison_parser.y" { (yyval.join_type) = kJoinLeft; } -#line 5937 "bison_parser.cpp" +#line 5957 "bison_parser.cpp" break; - case 360: /* opt_join_type: LEFT */ -#line 1504 "bison_parser.y" + case 361: /* opt_join_type: LEFT */ +#line 1508 "bison_parser.y" { (yyval.join_type) = kJoinLeft; } -#line 5943 "bison_parser.cpp" +#line 5963 "bison_parser.cpp" break; - case 361: /* opt_join_type: RIGHT OUTER */ -#line 1505 "bison_parser.y" + case 362: /* opt_join_type: RIGHT OUTER */ +#line 1509 "bison_parser.y" { (yyval.join_type) = kJoinRight; } -#line 5949 "bison_parser.cpp" +#line 5969 "bison_parser.cpp" break; - case 362: /* opt_join_type: RIGHT */ -#line 1506 "bison_parser.y" + case 363: /* opt_join_type: RIGHT */ +#line 1510 "bison_parser.y" { (yyval.join_type) = kJoinRight; } -#line 5955 "bison_parser.cpp" +#line 5975 "bison_parser.cpp" break; - case 363: /* opt_join_type: FULL OUTER */ -#line 1507 "bison_parser.y" + case 364: /* opt_join_type: FULL OUTER */ +#line 1511 "bison_parser.y" { (yyval.join_type) = kJoinFull; } -#line 5961 "bison_parser.cpp" +#line 5981 "bison_parser.cpp" break; - case 364: /* opt_join_type: OUTER */ -#line 1508 "bison_parser.y" + case 365: /* opt_join_type: OUTER */ +#line 1512 "bison_parser.y" { (yyval.join_type) = kJoinFull; } -#line 5967 "bison_parser.cpp" +#line 5987 "bison_parser.cpp" break; - case 365: /* opt_join_type: FULL */ -#line 1509 "bison_parser.y" + case 366: /* opt_join_type: FULL */ +#line 1513 "bison_parser.y" { (yyval.join_type) = kJoinFull; } -#line 5973 "bison_parser.cpp" +#line 5993 "bison_parser.cpp" break; - case 366: /* opt_join_type: %empty */ -#line 1510 "bison_parser.y" + case 367: /* opt_join_type: %empty */ +#line 1514 "bison_parser.y" { (yyval.join_type) = kJoinInner; } -#line 5979 "bison_parser.cpp" +#line 5999 "bison_parser.cpp" break; - case 367: /* natural_join_type: INNER */ -#line 1512 "bison_parser.y" + case 368: /* natural_join_type: INNER */ +#line 1516 "bison_parser.y" { (yyval.join_type) = kJoinInner; } -#line 5985 "bison_parser.cpp" +#line 6005 "bison_parser.cpp" break; - case 368: /* natural_join_type: LEFT OUTER */ -#line 1513 "bison_parser.y" + case 369: /* natural_join_type: LEFT OUTER */ +#line 1517 "bison_parser.y" { (yyval.join_type) = kJoinLeft; } -#line 5991 "bison_parser.cpp" +#line 6011 "bison_parser.cpp" break; - case 369: /* natural_join_type: LEFT */ -#line 1514 "bison_parser.y" + case 370: /* natural_join_type: LEFT */ +#line 1518 "bison_parser.y" { (yyval.join_type) = kJoinLeft; } -#line 5997 "bison_parser.cpp" +#line 6017 "bison_parser.cpp" break; - case 370: /* natural_join_type: RIGHT OUTER */ -#line 1515 "bison_parser.y" + case 371: /* natural_join_type: RIGHT OUTER */ +#line 1519 "bison_parser.y" { (yyval.join_type) = kJoinRight; } -#line 6003 "bison_parser.cpp" +#line 6023 "bison_parser.cpp" break; - case 371: /* natural_join_type: RIGHT */ -#line 1516 "bison_parser.y" + case 372: /* natural_join_type: RIGHT */ +#line 1520 "bison_parser.y" { (yyval.join_type) = kJoinRight; } -#line 6009 "bison_parser.cpp" +#line 6029 "bison_parser.cpp" break; - case 372: /* natural_join_type: FULL OUTER */ -#line 1517 "bison_parser.y" + case 373: /* natural_join_type: FULL OUTER */ +#line 1521 "bison_parser.y" { (yyval.join_type) = kJoinFull; } -#line 6015 "bison_parser.cpp" +#line 6035 "bison_parser.cpp" break; - case 373: /* natural_join_type: FULL */ -#line 1518 "bison_parser.y" + case 374: /* natural_join_type: FULL */ +#line 1522 "bison_parser.y" { (yyval.join_type) = kJoinFull; } -#line 6021 "bison_parser.cpp" +#line 6041 "bison_parser.cpp" break; - case 377: /* ident_commalist: IDENTIFIER */ -#line 1529 "bison_parser.y" + case 376: /* ident_commalist: IDENTIFIER */ +#line 1530 "bison_parser.y" { (yyval.str_vec) = new std::vector(); (yyval.str_vec)->push_back((yyvsp[0].sval)); } -#line 6030 "bison_parser.cpp" +#line 6050 "bison_parser.cpp" break; - case 378: /* ident_commalist: ident_commalist ',' IDENTIFIER */ -#line 1533 "bison_parser.y" + case 377: /* ident_commalist: ident_commalist ',' IDENTIFIER */ +#line 1534 "bison_parser.y" { (yyvsp[-2].str_vec)->push_back((yyvsp[0].sval)); (yyval.str_vec) = (yyvsp[-2].str_vec); } -#line 6039 "bison_parser.cpp" +#line 6059 "bison_parser.cpp" break; -#line 6043 "bison_parser.cpp" +#line 6063 "bison_parser.cpp" default: break; } @@ -6269,7 +6288,7 @@ YYLTYPE yylloc = yyloc_default; return yyresult; } -#line 1539 "bison_parser.y" +#line 1540 "bison_parser.y" /********************************* @@ -6278,4 +6297,4 @@ YYLTYPE yylloc = yyloc_default; /* empty */ - // clang-format on +// clang-format on diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.y b/extern/hyrise_sql_parser/src/parser/bison_parser.y index b7b897c446..f4ecd41ff5 100644 --- a/extern/hyrise_sql_parser/src/parser/bison_parser.y +++ b/extern/hyrise_sql_parser/src/parser/bison_parser.y @@ -346,7 +346,7 @@ *********************************/ // Defines our general input. -input : statement_list opt_semicolon { +input : statement_list { for (SQLStatement* stmt : *$1) { // Transfers ownership of the statement. result->addStatement(stmt); @@ -371,6 +371,10 @@ statement_list : statement { $$ = new std::vector(); $$->push_back($1); } +| statement_list ';' { + yylloc.string_length = 0; + $$ = $1; +} | statement_list ';' statement { $3->stringLength = yylloc.string_length; yylloc.string_length = 0; @@ -1191,8 +1195,12 @@ comp_expr : operand '=' operand { $$ = Expr::makeOpBinary($1, kOpEquals, $3); } // reduce conflicts when splitting them. function_expr : IDENTIFIER '(' ')' opt_window { $$ = Expr::makeFunctionRef($1, new std::vector(), false, $4); } | IDENTIFIER '(' opt_distinct expr_list ')' opt_window { $$ = Expr::makeFunctionRef($1, $4, $3, $6); } -| IDENTIFIER '.' IDENTIFIER '(' ')' opt_window { $$ = Expr::makeFunctionRef($3, $1, new std::vector(), false, $6); } -| IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window { $$ = Expr::makeFunctionRef($3, $1, $6, $5, $8); }; +| IDENTIFIER '.' IDENTIFIER '(' ')' opt_window { + $$ = Expr::makeFunctionRef($3, $1, new std::vector(), false, $6); +} +| IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window { + $$ = Expr::makeFunctionRef($3, $1, $6, $5, $8); +}; // Window function expressions, based on https://www.postgresql.org/docs/15/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS // We do not support named windows, collations and exclusions (for simplicity) and filters (not part of the SQL standard). @@ -1523,9 +1531,6 @@ join_condition : expr; * Misc ******************************/ -opt_semicolon : ';' | /* empty */ - ; - ident_commalist : IDENTIFIER { $$ = new std::vector(); $$->push_back($1); diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp b/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp index 6b8d0b3f21..87ea092d62 100644 --- a/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp +++ b/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp @@ -2,7 +2,7 @@ #line 3 "flex_lexer.cpp" -#define YY_INT_ALIGNED short int +#define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ @@ -251,10 +251,10 @@ /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ -#include -#include #include +#include #include +#include /* end standard C headers. */ @@ -265,7 +265,7 @@ /* C99 systems have . Non-C99 systems may or may not. */ -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. @@ -281,46 +281,45 @@ typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; -typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; +typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN -#define INT8_MIN (-128) +#define INT8_MIN (-128) #endif #ifndef INT16_MIN -#define INT16_MIN (-32767-1) +#define INT16_MIN (-32767 - 1) #endif #ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) +#define INT32_MIN (-2147483647 - 1) #endif #ifndef INT8_MAX -#define INT8_MAX (127) +#define INT8_MAX (127) #endif #ifndef INT16_MAX -#define INT16_MAX (32767) +#define INT16_MAX (32767) #endif #ifndef INT32_MAX -#define INT32_MAX (2147483647) +#define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX -#define UINT8_MAX (255U) +#define UINT8_MAX (255U) #endif #ifndef UINT16_MAX -#define UINT16_MAX (65535U) +#define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) +#define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) +#define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ @@ -344,7 +343,7 @@ typedef unsigned int flex_uint32_t; /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ -#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) +#define YY_SC_TO_UI(c) ((YY_CHAR)(c)) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T @@ -377,7 +376,7 @@ typedef void* yyscan_t; /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin , yyscanner ) +#define YY_NEW_FILE yyrestart(yyin, yyscanner) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ @@ -395,11 +394,11 @@ typedef void* yyscan_t; /* The state buf must be large enough to hold one state per character in the main buffer. */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; +typedef struct yy_buffer_state* YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T @@ -410,76 +409,73 @@ typedef size_t yy_size_t; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - #define YY_LINENO_REWIND_TO(ptr) - + +#define YY_LESS_LINENO(n) +#define YY_LINENO_REWIND_TO(ptr) + /* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = yyg->yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) -#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) +#define yyless(n) \ + do { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg); \ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } while (0) +#define unput(c) yyunput(c, yyg->yytext_ptr, yyscanner) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; +struct yy_buffer_state { + FILE* yy_input_file; - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ + char* yy_ch_buf; /* input buffer */ + char* yy_buf_pos; /* current position in input buffer */ - /* Size of input buffer in bytes, not including room for EOB + /* Size of input buffer in bytes, not including room for EOB * characters. */ - int yy_buf_size; + int yy_buf_size; - /* Number of characters read into yy_ch_buf, not including EOB + /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - yy_size_t yy_n_chars; + int yy_n_chars; - /* Whether we "own" the buffer - i.e., we know we created it, + /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ - int yy_is_our_buffer; + int yy_is_our_buffer; - /* Whether this is an "interactive" input source; if so, and + /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ - int yy_is_interactive; + int yy_is_interactive; - /* Whether we're considered to be at the beginning of a line. + /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ - int yy_at_bol; + int yy_at_bol; - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ - /* Whether to try to fill the input buffer when we reach the + /* Whether to try to fill the input buffer when we reach the * end of it. */ - int yy_fill_buffer; + int yy_fill_buffer; - int yy_buffer_status; + int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process + /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of @@ -490,8 +486,7 @@ struct yy_buffer_state * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 - - }; +}; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the @@ -500,59 +495,55 @@ struct yy_buffer_state * * Returns the top of the stack, or NULL. */ -#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ - ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ - : NULL) +#define YY_CURRENT_BUFFER (yyg->yy_buffer_stack ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -void yypop_buffer_state ( yyscan_t yyscanner ); +void yyrestart(FILE* input_file, yyscan_t yyscanner); +void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); +YY_BUFFER_STATE yy_create_buffer(FILE* file, int size, yyscan_t yyscanner); +void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); +void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); +void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); +void yypop_buffer_state(yyscan_t yyscanner); -static void yyensure_buffer_stack ( yyscan_t yyscanner ); -static void yy_load_buffer_state ( yyscan_t yyscanner ); -static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); -#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) +static void yyensure_buffer_stack(yyscan_t yyscanner); +static void yy_load_buffer_state(yyscan_t yyscanner); +static void yy_init_buffer(YY_BUFFER_STATE b, FILE* file, yyscan_t yyscanner); +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER, yyscanner) -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_buffer(char* base, yy_size_t size, yyscan_t yyscanner); +YY_BUFFER_STATE yy_scan_string(const char* yy_str, yyscan_t yyscanner); +YY_BUFFER_STATE yy_scan_bytes(const char* bytes, int len, yyscan_t yyscanner); -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); +void* yyalloc(yy_size_t, yyscan_t yyscanner); +void* yyrealloc(void*, yy_size_t, yyscan_t yyscanner); +void yyfree(void*, yyscan_t yyscanner); #define yy_new_buffer yy_create_buffer -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } +#define yy_set_interactive(is_interactive) \ + { \ + if (!YY_CURRENT_BUFFER) { \ + yyensure_buffer_stack(yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } +#define yy_set_bol(at_bol) \ + { \ + if (!YY_CURRENT_BUFFER) { \ + yyensure_buffer_stack(yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ -#define hsql_wrap(yyscanner) (/*CONSTCOND*/1) +#define hsql_wrap(yyscanner) (/*CONSTCOND*/ 1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; @@ -560,2595 +551,1634 @@ typedef int yy_state_type; #define yytext_ptr yytext_r -static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); -static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); -static int yy_get_next_buffer ( yyscan_t yyscanner ); -static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); +static yy_state_type yy_get_previous_state(yyscan_t yyscanner); +static yy_state_type yy_try_NUL_trans(yy_state_type current_state, yyscan_t yyscanner); +static int yy_get_next_buffer(yyscan_t yyscanner); +static void yynoreturn yy_fatal_error(const char* msg, yyscan_t yyscanner); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ -#define YY_DO_BEFORE_ACTION \ - yyg->yytext_ptr = yy_bp; \ - yyleng = (yy_size_t) (yy_cp - yy_bp); \ - yyg->yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yyg->yy_c_buf_p = yy_cp; +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (int)(yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; #define YY_NUM_RULES 197 #define YY_END_OF_BUFFER 198 /* This struct is not used in this scanner, but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static const flex_int16_t yy_accept[1406] = - { 0, - 0, 0, 194, 194, 2, 2, 198, 196, 4, 4, - 196, 196, 183, 183, 192, 183, 183, 188, 183, 183, - 183, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 196, 183, 194, 195, 2, - 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, - 175, 0, 179, 1, 0, 185, 184, 188, 0, 181, - - 177, 176, 173, 178, 182, 191, 191, 191, 191, 191, - 191, 12, 191, 191, 191, 19, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 74, 191, 191, 77, 86, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 105, 191, 191, 110, 113, - 114, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 151, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 0, 180, 194, 193, 2, 2, 2, 2, 2, - - 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 189, 0, 0, 184, 0, 0, 186, 174, 5, 191, - 7, 191, 191, 10, 191, 13, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 34, 191, 191, 191, 191, 191, 191, 191, - 45, 191, 191, 191, 191, 50, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 61, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 81, 191, 191, 89, 191, 191, 191, 191, 191, 191, - 191, 191, 101, 191, 191, 106, 191, 191, 191, 111, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - - 191, 191, 191, 191, 191, 191, 191, 191, 137, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 152, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 190, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 0, 0, 185, 0, 184, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 20, 191, 22, 23, - 24, 191, 191, 191, 29, 191, 191, 191, 32, 35, - - 191, 191, 191, 191, 191, 41, 191, 191, 191, 47, - 48, 191, 191, 191, 191, 191, 191, 191, 191, 58, - 191, 191, 191, 191, 64, 65, 191, 191, 69, 191, - 71, 72, 191, 191, 191, 191, 191, 191, 85, 191, - 88, 90, 91, 191, 93, 191, 191, 96, 191, 191, - 191, 191, 191, 108, 191, 191, 191, 191, 117, 191, - 191, 120, 191, 191, 191, 191, 125, 191, 191, 191, - 191, 191, 131, 191, 191, 191, 191, 139, 140, 191, - 191, 191, 191, 191, 147, 148, 149, 191, 154, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 164, 191, - - 166, 191, 168, 169, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 6, 8, 191, - 11, 191, 15, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 31, 191, 191, 191, 191, 191, 191, 40, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 57, 59, 191, 191, 191, 191, 67, 191, 73, - 75, 191, 78, 79, 191, 191, 191, 191, 92, 94, - 191, 97, 98, 191, 102, 191, 191, 191, 191, 115, - - 116, 191, 191, 191, 191, 191, 124, 191, 191, 191, - 129, 191, 191, 191, 191, 138, 191, 191, 191, 144, - 191, 191, 191, 191, 191, 157, 191, 191, 191, 161, - 191, 191, 191, 167, 170, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 0, 191, 14, 191, 17, 191, - 191, 191, 25, 27, 191, 30, 191, 191, 191, 191, - 191, 39, 191, 43, 191, 46, 191, 51, 52, 191, - 54, 191, 191, 191, 191, 63, 66, 68, 70, 76, - 80, 191, 191, 191, 87, 95, 99, 103, 191, 107, - 191, 112, 191, 191, 191, 191, 191, 191, 127, 191, - 191, 132, 134, 136, 191, 142, 191, 145, 191, 191, - - 191, 191, 191, 158, 159, 160, 162, 191, 191, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 0, 9, 16, 18, 21, 191, - 26, 28, 191, 191, 191, 37, 38, 191, 191, 191, - - 53, 55, 56, 191, 62, 82, 191, 191, 100, 104, - 191, 191, 191, 191, 122, 123, 191, 191, 191, 133, - 135, 191, 143, 191, 191, 191, 191, 191, 163, 165, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 191, 0, 33, - 191, 42, 44, 49, 191, 191, 84, 109, 191, 191, - 191, 191, 128, 130, 141, 191, 191, 191, 155, 191, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 0, 191, 0, 191, 60, 83, - 191, 119, 121, 191, 146, 150, 191, 156, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 0, 0, 0, 36, 118, 126, 191, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 171, 153, - 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, - 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, - 0, 0, 2, 2, 0, 172, 2, 2, 0, 2, - - 0, 2, 187, 2, 0 - } ; - -static const YY_CHAR yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 4, 5, 1, 1, 6, 7, 8, 6, - 6, 6, 9, 6, 10, 11, 6, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 6, 6, 22, - 23, 24, 6, 1, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 6, 1, 6, 6, 51, 52, 53, 54, 55, 56, - - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 6, 79, 6, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static const YY_CHAR yy_meta[80] = - { 0, - 1, 1, 2, 1, 3, 1, 1, 4, 5, 5, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 1, 1, 1, 8, 8, 8, 8, 9, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 10, 8, 8, 8, 8, 9, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 1 - } ; - -static const flex_int16_t yy_base[1421] = - { 0, - 0, 0, 667, 661, 79, 0, 662, 9173, 157, 159, - 635, 0, 9173, 648, 9173, 153, 152, 164, 154, 622, - 156, 194, 152, 158, 181, 169, 241, 205, 228, 254, - 148, 159, 239, 270, 276, 294, 234, 0, 305, 346, - 390, 308, 308, 166, 214, 0, 558, 0, 613, 0, - 192, 252, 582, 596, 0, 591, 0, 236, 375, 450, - 331, 559, 239, 507, 586, 641, 694, 743, 796, 382, - 471, 840, 507, 550, 573, 587, 892, 942, 992, 600, - 643, 1039, 1092, 686, 664, 736, 741, 514, 481, 314, - 9173, 553, 9173, 9173, 541, 250, 253, 348, 347, 9173, - - 527, 9173, 9173, 9173, 9173, 0, 257, 291, 363, 403, - 300, 353, 447, 351, 345, 0, 490, 373, 457, 415, - 375, 490, 797, 741, 376, 416, 430, 447, 472, 818, - 505, 506, 505, 511, 513, 521, 537, 561, 613, 565, - 568, 0, 581, 578, 856, 585, 591, 583, 641, 644, - 855, 636, 650, 700, 668, 688, 694, 714, 715, 0, - 721, 734, 759, 747, 770, 810, 787, 877, 795, 878, - 799, 896, 894, 803, 812, 802, 821, 855, 881, 856, - 889, 896, 924, 937, 922, 922, 940, 929, 946, 935, - 960, 446, 9173, 0, 9173, 0, 431, 0, 487, 0, - - 0, 476, 1158, 1204, 1251, 1300, 0, 465, 0, 0, - 0, 0, 990, 993, 1079, 1039, 1297, 1084, 1296, 1344, - 1293, 1052, 1309, 982, 1353, 1394, 1389, 1394, 1424, 1477, - 1518, 1163, 1449, 1164, 1568, 1457, 1618, 1210, 1211, 1470, - 1527, 1485, 1564, 1576, 1617, 1634, 1633, 1675, 1653, 1673, - 1698, 1748, 1678, 1728, 1741, 1764, 1813, 1866, 1790, 1735, - 1801, 1851, 1907, 1860, 1910, 1929, 1932, 1956, 1971, 1977, - 2007, 2026, 2024, 2024, 2079, 2075, 2078, 2092, 2142, 2142, - 2143, 2182, 2183, 2208, 2197, 2230, 2223, 2250, 2253, 2280, - 2328, 2295, 2309, 2345, 2361, 2368, 2375, 2401, 436, 0, - - 9173, 473, 427, 976, 429, 1176, 1276, 9173, 0, 998, - 0, 1006, 1000, 0, 1016, 0, 1022, 1053, 1083, 1100, - 1099, 1101, 1299, 1096, 1094, 1120, 1137, 1133, 1161, 1155, - 1161, 1175, 1170, 1209, 1217, 1226, 1354, 1228, 1227, 1213, - 0, 1273, 1262, 1308, 1310, 0, 1354, 1352, 1357, 1342, - 1357, 1355, 1396, 1412, 1419, 1411, 1520, 1411, 1413, 1426, - 1438, 1457, 1461, 1464, 1497, 1505, 1505, 1516, 1521, 1522, - 1551, 1510, 1520, 0, 1515, 1542, 1568, 1582, 1596, 1582, - 1583, 1575, 0, 1582, 1582, 0, 1611, 1624, 1623, 1644, - 1678, 1696, 1686, 1735, 1698, 1790, 1735, 1750, 1746, 1758, - - 1798, 1783, 1803, 1800, 1797, 1814, 1808, 1824, 0, 1827, - 1826, 1839, 1846, 1839, 1840, 1849, 1848, 1848, 1862, 1876, - 0, 1868, 1900, 1902, 1921, 1922, 1960, 1959, 1956, 1975, - 1964, 1973, 2010, 2001, 1999, 9173, 0, 472, 2470, 2480, - 2529, 2498, 2508, 0, 2394, 2522, 2523, 2524, 2401, 2522, - 2539, 2559, 2575, 2580, 2611, 2610, 2590, 2626, 2676, 2662, - 2667, 2712, 2713, 2726, 2739, 2759, 2772, 2772, 2808, 2809, - 2821, 2838, 2857, 2883, 2864, 2904, 2878, 2897, 2923, 2940, - 2949, 2954, 2979, 2980, 3006, 3006, 3026, 3043, 3051, 3067, - 3096, 3094, 3117, 3122, 3150, 3154, 3167, 3181, 3215, 3217, - - 3220, 3266, 3267, 3269, 3292, 3306, 3309, 3323, 3339, 3356, - 3370, 3362, 3404, 3419, 3472, 3433, 3473, 3470, 3487, 3512, - 3513, 3526, 3543, 3559, 3563, 3576, 3589, 3612, 3615, 3668, - 3632, 3719, 3668, 3705, 3713, 3661, 3753, 3764, 3783, 3781, - 3790, 3820, 3829, 3834, 3843, 3860, 3879, 3874, 3886, 3917, - 3928, 3931, 3937, 3973, 3948, 3989, 3994, 3993, 4024, 4019, - 4044, 4045, 4085, 4061, 4105, 4092, 4136, 4144, 4153, 4161, - 4192, 0, 470, 4229, 4257, 4267, 4277, 2008, 2016, 2017, - 2021, 2029, 2044, 2063, 2067, 2079, 0, 2094, 0, 0, - 2104, 2094, 2105, 2118, 0, 2117, 2122, 2141, 2129, 0, - - 2138, 2140, 2151, 2173, 2202, 2200, 2221, 2230, 2245, 0, - 0, 2260, 2258, 2263, 2259, 2264, 2288, 2293, 2306, 0, - 2293, 2304, 2312, 2343, 0, 0, 2349, 2338, 0, 2346, - 0, 2370, 2391, 2404, 2405, 2433, 2434, 2575, 0, 2466, - 0, 0, 0, 2461, 0, 2470, 2478, 0, 2479, 2636, - 2499, 2498, 2533, 0, 2591, 2591, 2585, 2611, 0, 2628, - 2637, 0, 2653, 2660, 2664, 2665, 0, 2657, 2689, 2688, - 2691, 2712, 0, 2719, 2733, 2749, 2752, 0, 0, 2755, - 2765, 2765, 2783, 2774, 0, 0, 2784, 2788, 0, 2807, - 2792, 2815, 2816, 2839, 2822, 2845, 2871, 2887, 0, 2897, - - 0, 2920, 0, 2914, 469, 4287, 4297, 4307, 4317, 4303, - 4306, 4100, 4314, 4351, 4349, 4365, 4363, 4402, 4404, 4411, - 4437, 4444, 4467, 4458, 4493, 4498, 4500, 4540, 4500, 4549, - 4570, 4589, 4577, 4596, 4632, 4621, 4638, 4646, 4663, 4686, - 4685, 4688, 4694, 4738, 4735, 4744, 4752, 4783, 4797, 4805, - 4803, 4833, 4854, 4856, 4863, 4889, 4896, 4910, 4919, 4945, - 4950, 4952, 4955, 4972, 4996, 5013, 5001, 5018, 5033, 5079, - 5064, 5070, 5115, 5116, 5124, 5130, 5161, 5167, 5062, 5179, - 5190, 5178, 5223, 5222, 5246, 5251, 5277, 5272, 5298, 5324, - 5313, 5349, 5338, 5363, 5364, 5394, 5403, 5405, 5420, 5434, - - 5457, 5460, 5459, 5486, 5499, 5512, 5514, 5545, 5525, 5558, - 5565, 5565, 5591, 5594, 5605, 5620, 5631, 5634, 5664, 5667, - 5678, 5686, 5710, 5723, 5727, 5742, 5766, 5781, 5782, 5821, - 5822, 5835, 5836, 5861, 5862, 5878, 461, 0, 0, 2916, - 0, 2938, 0, 2939, 2942, 2967, 2971, 2975, 2984, 2979, - 2985, 2996, 0, 3000, 3010, 3009, 3035, 3029, 3046, 0, - 3047, 3040, 3057, 3069, 3072, 3081, 3067, 3076, 3093, 3107, - 3114, 0, 0, 3100, 3136, 3128, 3140, 3138, 3175, 0, - 0, 3163, 0, 0, 3167, 3194, 3212, 3196, 0, 0, - 3209, 0, 0, 3213, 3220, 3250, 3235, 3253, 3260, 0, - - 0, 3280, 3268, 3291, 3280, 3309, 0, 3328, 3331, 3328, - 0, 3340, 3349, 3353, 3353, 0, 3365, 3379, 3387, 3373, - 3375, 3377, 3403, 3406, 3412, 0, 3422, 3427, 3428, 0, - 3417, 3438, 3442, 0, 0, 427, 5889, 5897, 5898, 5934, - 5918, 5954, 5955, 5957, 5984, 5997, 6011, 6019, 6027, 6040, - 6047, 6073, 6073, 6086, 6099, 6126, 6126, 6128, 6139, 6165, - 6179, 6177, 6178, 6205, 6228, 6230, 6231, 6235, 6261, 6286, - 6287, 6288, 6313, 6328, 6342, 6330, 6364, 6377, 6386, 6401, - 6420, 6423, 6437, 6462, 6478, 6466, 6493, 6508, 6522, 6525, - 6539, 6542, 6578, 6566, 6595, 6608, 6622, 6647, 6651, 6664, - - 6675, 6677, 6717, 6718, 6747, 6704, 6754, 6773, 6780, 6787, - 6810, 6813, 6840, 6849, 6866, 6875, 6901, 6906, 6734, 6918, - 6933, 6955, 6975, 6974, 6989, 7015, 7028, 7029, 7030, 7045, - 7074, 7077, 7088, 7096, 397, 3441, 0, 3451, 0, 3500, - 3524, 3513, 3517, 0, 3527, 0, 3554, 3571, 3582, 3579, - 3577, 0, 3605, 0, 3605, 0, 3615, 0, 0, 3626, - 0, 3620, 3619, 3634, 3633, 0, 0, 0, 0, 0, - 0, 3632, 3658, 3684, 0, 0, 3671, 0, 3683, 0, - 3699, 0, 3682, 3697, 3727, 3734, 3717, 3730, 0, 3743, - 3745, 3730, 3756, 0, 3769, 0, 3773, 0, 3786, 3793, - - 3796, 3798, 3860, 0, 0, 0, 0, 3863, 3879, 385, - 7122, 7136, 7120, 7144, 7152, 7165, 7192, 7169, 7191, 7208, - 7222, 7237, 7254, 7251, 7278, 7293, 7297, 7312, 7334, 7348, - 7349, 7363, 7380, 7394, 7414, 7428, 7402, 7436, 7454, 7456, - 7480, 7481, 7500, 7517, 7525, 7531, 7542, 7565, 7586, 7588, - 7591, 7593, 7608, 7635, 7639, 7664, 7650, 7689, 7690, 7705, - 7719, 7730, 7735, 7752, 7766, 7767, 7781, 7798, 7812, 7813, - 7827, 7844, 7858, 7861, 7875, 7904, 7900, 7917, 7931, 7946, - 7960, 7963, 7977, 7980, 388, 0, 0, 0, 0, 3890, - 0, 0, 438, 3930, 3945, 0, 0, 3949, 3938, 3995, - - 0, 0, 0, 3997, 0, 0, 4015, 4011, 0, 0, - 4037, 4058, 4050, 4054, 0, 0, 4071, 4059, 4073, 0, - 0, 4072, 0, 4081, 4108, 4122, 4141, 4146, 0, 0, - 386, 7994, 7997, 8014, 8028, 8048, 8062, 8067, 8081, 8088, - 8107, 8102, 8128, 8133, 8142, 8173, 8159, 8168, 8182, 8208, - 8217, 8225, 8239, 8242, 8259, 8273, 8284, 8307, 8312, 8327, - 8340, 8344, 8359, 8383, 8398, 8402, 8415, 8439, 8452, 8456, - 8471, 8495, 8501, 8515, 8516, 8541, 385, 4143, 4353, 0, - 4142, 0, 0, 0, 4159, 4161, 0, 0, 4184, 4193, - 4205, 4209, 0, 0, 0, 4190, 4300, 4317, 0, 4330, - - 359, 8546, 4414, 8571, 8582, 8596, 8601, 8622, 8636, 8637, - 8651, 8672, 8677, 8548, 8684, 8702, 8707, 8728, 8733, 8742, - 8747, 8768, 8773, 8798, 350, 478, 4321, 4332, 0, 0, - 4353, 0, 0, 4359, 0, 0, 4371, 0, 332, 8839, - 4380, 8799, 8824, 8838, 8826, 8846, 8871, 8875, 8888, 8902, - 8928, 8941, 327, 4443, 4405, 0, 0, 0, 4416, 310, - 4472, 4410, 8942, 8943, 8968, 8978, 306, 4437, 9173, 0, - 303, 4477, 0, 8995, 276, 4471, 271, 4510, 257, 4504, - 240, 4509, 230, 4529, 225, 4530, 220, 4534, 189, 4536, - 187, 4552, 185, 4562, 176, 9173, 172, 0, 177, 174, - - 164, 162, 9173, 0, 9173, 9071, 9081, 9086, 9089, 9098, - 9107, 9117, 9127, 9137, 9147, 9151, 9154, 9159, 9162, 9165 - } ; - -static const flex_int16_t yy_def[1421] = - { 0, - 1405, 1, 1406, 1406, 1405, 5, 1405, 1405, 1405, 1405, - 1405, 1407, 1405, 1405, 1405, 1405, 1405, 1408, 1405, 1405, - 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1410, 1405, 1411, 1405, 1412, - 1412, 1405, 1412, 1413, 1412, 1412, 1412, 1412, 1412, 1412, - 1412, 1412, 1412, 1414, 1414, 65, 65, 65, 66, 68, - 65, 68, 65, 65, 65, 65, 66, 66, 66, 65, - 65, 65, 65, 68, 65, 65, 65, 1415, 1412, 1405, - 1405, 1407, 1405, 1405, 1405, 1416, 1417, 1408, 1418, 1405, - - 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1410, 1405, 1411, 1405, 1412, 1412, 1412, 1413, 1412, - - 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, - 1412, 1412, 65, 65, 65, 68, 68, 68, 68, 68, - 68, 65, 65, 68, 68, 68, 65, 65, 65, 68, - 68, 68, 65, 68, 68, 68, 65, 68, 68, 65, - 68, 65, 68, 65, 65, 68, 68, 68, 68, 65, - 65, 68, 68, 65, 65, 65, 65, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, - 65, 65, 65, 68, 68, 68, 68, 68, 68, 65, - 65, 65, 65, 65, 65, 68, 65, 65, 65, 66, - 65, 65, 65, 68, 65, 65, 65, 65, 1415, 1412, - - 1405, 1405, 1419, 1417, 1420, 1405, 1405, 1405, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1405, 1412, 1412, 1412, 1412, - 1412, 1412, 1412, 1412, 65, 65, 65, 65, 68, 68, - 68, 68, 65, 65, 65, 65, 68, 68, 65, 65, - 65, 65, 65, 65, 65, 68, 68, 65, 68, 68, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 68, 68, 68, 68, 65, - 65, 68, 65, 65, 68, 68, 68, 68, 65, 65, - - 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, - 68, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 68, 68, 68, 65, 65, 65, 65, - 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, - 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, - 68, 68, 68, 68, 68, 65, 65, 68, 68, 65, - 65, 65, 65, 68, 68, 68, 68, 68, 68, 68, - 68, 1412, 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1412, 1412, 1412, 1412, 1412, 68, - 68, 65, 65, 65, 68, 65, 68, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 68, 65, - 65, 65, 68, 68, 68, 68, 68, 68, 68, 65, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 68, 68, 68, 65, 65, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, - 65, 68, 68, 68, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - - 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, - 65, 68, 65, 65, 65, 65, 65, 65, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, - 65, 65, 65, 65, 65, 68, 1405, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1412, 68, 68, 68, 68, - 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, - 65, 65, 68, 65, 65, 65, 68, 65, 65, 65, - 65, 68, 65, 65, 65, 65, 65, 68, 65, 65, - 65, 65, 65, 65, 65, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 65, 68, 68, 68, 68, 68, - 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, - - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, - 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, - 68, 68, 68, 68, 1405, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, - 65, 65, 68, 68, 68, 65, 65, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 65, 65, 68, 68, 65, 68, - 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, - 65, 68, 68, 68, 68, 68, 68, 68, 65, 65, - 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 1405, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1412, 68, 68, 68, 68, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, - 68, 68, 68, 68, 68, 68, 68, 65, 65, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 65, 65, 65, 65, 1405, 1409, 1405, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1412, 65, 1412, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 68, 68, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 1405, 1409, 1405, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, 65, - 1412, 65, 65, 65, 68, 68, 68, 68, 68, 68, - 65, 65, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1412, - 1412, 1412, 65, 65, 65, 68, 1405, 1405, 1405, 1409, - 1412, 1412, 1412, 68, 1405, 1405, 1412, 1412, 1405, 1405, - 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, - 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1412, - - 1405, 1412, 1405, 1412, 0, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405 - } ; - -static const flex_int16_t yy_nxt[9253] = - { 0, - 8, 9, 10, 11, 12, 13, 14, 15, 13, 16, - 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 38, 45, 38, - 8, 46, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 38, 45, 38, 47, 50, - 51, 52, 53, 54, 55, 56, 57, 55, 58, 59, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 80, 87, 80, 50, - 88, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 80, 87, 80, 89, 90, 90, - 90, 90, 94, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 95, 97, 100, 101, 102, 104, 105, - 113, 1404, 117, 1403, 114, 1402, 147, 148, 1401, 118, - 115, 1400, 99, 197, 90, 1399, 119, 189, 190, 120, - - 116, 1397, 121, 1395, 127, 122, 128, 1393, 113, 123, - 117, 129, 114, 124, 147, 148, 130, 118, 115, 125, - 99, 107, 126, 108, 119, 189, 190, 120, 116, 109, - 121, 110, 127, 122, 128, 111, 112, 123, 1391, 129, - 137, 124, 191, 1389, 130, 201, 138, 125, 1387, 107, - 126, 108, 139, 90, 90, 1385, 202, 109, 164, 110, - 140, 211, 212, 111, 112, 131, 141, 149, 137, 165, - 191, 150, 1383, 132, 138, 166, 133, 151, 303, 134, - 139, 305, 135, 142, 309, 136, 164, 1381, 140, 143, - 144, 145, 1379, 131, 141, 149, 146, 165, 152, 150, - - 155, 132, 153, 166, 133, 151, 303, 134, 154, 305, - 135, 142, 309, 136, 156, 90, 90, 143, 144, 145, - 157, 158, 1377, 159, 146, 1375, 152, 1371, 155, 167, - 153, 160, 187, 168, 310, 161, 154, 169, 162, 163, - 188, 315, 156, 170, 1367, 184, 1360, 185, 157, 158, - 186, 159, 207, 208, 209, 306, 306, 167, 97, 160, - 187, 168, 310, 161, 1353, 169, 162, 163, 188, 315, - 1339, 170, 171, 184, 172, 185, 99, 173, 186, 316, - 174, 320, 175, 321, 176, 177, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 1325, 324, 311, 1301, - - 171, 1277, 172, 1231, 99, 173, 312, 316, 174, 320, - 175, 321, 176, 177, 178, 1185, 331, 244, 179, 213, - 342, 180, 181, 245, 213, 324, 311, 313, 182, 213, - 314, 183, 197, 90, 312, 574, 574, 576, 576, 1279, - 1279, 1110, 178, 329, 331, 244, 179, 213, 342, 180, - 181, 245, 213, 330, 343, 313, 182, 213, 314, 183, - 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 329, 344, 345, 346, 1035, 317, 318, 206, 1354, - 1354, 330, 343, 936, 837, 705, 573, 572, 444, 438, - 319, 437, 325, 326, 327, 246, 328, 436, 347, 213, - - 344, 345, 346, 247, 317, 318, 206, 196, 196, 248, - 196, 196, 196, 196, 196, 196, 196, 196, 319, 213, - 325, 326, 327, 246, 328, 322, 347, 213, 196, 196, - 196, 247, 323, 332, 214, 213, 215, 248, 333, 213, - 353, 354, 216, 355, 217, 254, 356, 213, 218, 219, - 308, 358, 357, 322, 302, 213, 359, 301, 196, 300, - 323, 332, 214, 213, 215, 196, 333, 213, 353, 354, - 216, 355, 217, 254, 356, 360, 218, 219, 255, 358, - 357, 210, 213, 213, 359, 196, 196, 196, 213, 196, - 196, 196, 196, 196, 196, 196, 196, 200, 213, 361, - - 196, 256, 364, 360, 198, 257, 255, 196, 196, 196, - 213, 258, 365, 366, 220, 259, 213, 367, 221, 260, - 195, 213, 372, 373, 222, 261, 213, 361, 213, 256, - 364, 374, 213, 257, 223, 213, 193, 196, 213, 258, - 365, 366, 220, 259, 103, 367, 221, 260, 213, 213, - 372, 373, 222, 261, 93, 362, 213, 91, 363, 374, - 213, 1405, 223, 213, 196, 224, 213, 274, 49, 213, - 375, 275, 225, 213, 49, 276, 213, 381, 376, 226, - 377, 277, 227, 362, 1405, 228, 363, 382, 294, 213, - 1405, 213, 213, 224, 1405, 274, 295, 213, 375, 275, - - 225, 213, 213, 276, 1405, 381, 376, 226, 377, 277, - 227, 385, 213, 228, 1405, 382, 294, 213, 229, 213, - 213, 213, 230, 291, 295, 292, 231, 383, 293, 388, - 213, 386, 232, 213, 387, 233, 1405, 384, 389, 385, - 213, 1405, 213, 1405, 390, 1405, 229, 1405, 391, 213, - 230, 291, 1405, 292, 231, 383, 293, 388, 1405, 386, - 232, 213, 387, 233, 213, 384, 389, 296, 297, 298, - 213, 213, 390, 213, 213, 213, 391, 392, 234, 213, - 235, 213, 339, 340, 213, 236, 341, 393, 394, 213, - 237, 213, 213, 1405, 395, 296, 297, 298, 1405, 213, - - 1405, 213, 213, 213, 1405, 392, 234, 213, 235, 213, - 339, 340, 213, 236, 341, 393, 394, 213, 237, 213, - 238, 334, 395, 335, 398, 403, 336, 213, 239, 1405, - 406, 240, 337, 1405, 241, 412, 413, 242, 396, 338, - 243, 1405, 397, 414, 348, 415, 349, 1405, 238, 334, - 350, 335, 398, 403, 336, 213, 239, 351, 406, 240, - 337, 352, 241, 412, 413, 242, 396, 338, 243, 249, - 397, 414, 348, 415, 349, 250, 251, 252, 350, 378, - 416, 379, 253, 368, 419, 351, 1405, 213, 1405, 352, - 1405, 1405, 380, 369, 1405, 1405, 1405, 249, 370, 371, - - 1405, 399, 1405, 250, 251, 252, 400, 378, 416, 379, - 253, 368, 419, 404, 401, 213, 262, 417, 410, 402, - 380, 369, 407, 213, 405, 420, 370, 371, 418, 399, - 263, 408, 411, 213, 400, 421, 264, 265, 1405, 409, - 1405, 404, 401, 1405, 262, 417, 410, 402, 422, 427, - 407, 213, 405, 420, 428, 1405, 418, 431, 263, 408, - 411, 213, 424, 421, 264, 265, 213, 409, 423, 425, - 432, 266, 426, 213, 433, 429, 422, 427, 434, 267, - 213, 430, 428, 268, 435, 431, 269, 270, 1405, 1405, - 424, 1405, 1405, 1405, 213, 1405, 423, 425, 432, 266, - - 426, 213, 433, 429, 305, 1405, 434, 267, 213, 430, - 1405, 268, 435, 1405, 269, 270, 271, 458, 213, 213, - 445, 213, 213, 213, 459, 213, 578, 272, 213, 213, - 213, 213, 305, 273, 579, 580, 213, 1405, 213, 1405, - 581, 213, 1405, 1405, 271, 458, 213, 213, 445, 213, - 213, 213, 459, 213, 578, 272, 213, 213, 213, 213, - 582, 273, 579, 580, 213, 278, 213, 279, 581, 213, - 280, 213, 1405, 281, 447, 282, 213, 283, 284, 1405, - 213, 213, 448, 1405, 213, 583, 213, 213, 582, 1405, - 457, 1405, 1405, 278, 1405, 279, 1405, 1405, 280, 213, - - 213, 281, 447, 282, 213, 283, 284, 213, 213, 213, - 448, 213, 213, 583, 213, 213, 285, 213, 457, 213, - 286, 213, 446, 287, 288, 451, 213, 213, 213, 584, - 289, 213, 585, 290, 586, 213, 587, 591, 592, 213, - 213, 1405, 1405, 1405, 285, 213, 1405, 213, 286, 213, - 446, 287, 288, 451, 213, 213, 593, 584, 289, 213, - 585, 290, 586, 1405, 587, 591, 592, 1405, 213, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 1405, - 594, 595, 1405, 1405, 593, 596, 439, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 597, 213, 213, - - 213, 213, 598, 599, 1405, 213, 480, 478, 594, 595, - 213, 213, 600, 596, 439, 440, 440, 440, 440, 440, - 440, 440, 440, 440, 440, 597, 213, 213, 213, 213, - 598, 599, 441, 213, 480, 478, 1405, 1405, 213, 213, - 600, 1405, 1405, 1405, 601, 489, 490, 213, 213, 602, - 603, 1405, 213, 213, 606, 607, 608, 213, 213, 1405, - 441, 204, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 601, 489, 490, 213, 213, 602, 603, 206, - 213, 213, 606, 607, 608, 213, 213, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 1405, 609, 1405, - - 1405, 610, 1405, 1405, 1405, 1405, 1405, 206, 442, 442, - 1405, 443, 443, 443, 443, 443, 443, 443, 443, 443, - 443, 449, 452, 456, 450, 588, 609, 589, 213, 610, - 213, 213, 213, 213, 213, 213, 611, 213, 213, 213, - 213, 213, 590, 213, 213, 1405, 1405, 213, 612, 449, - 452, 456, 450, 588, 1405, 589, 213, 213, 213, 213, - 213, 213, 213, 213, 611, 213, 213, 213, 213, 213, - 590, 213, 213, 453, 454, 213, 612, 460, 613, 213, - 614, 213, 604, 615, 616, 213, 213, 455, 213, 1405, - 213, 213, 617, 1405, 1405, 213, 618, 605, 1405, 1405, - - 213, 453, 454, 1405, 1405, 460, 613, 213, 614, 213, - 604, 615, 616, 1405, 213, 455, 213, 465, 213, 213, - 617, 213, 213, 213, 618, 605, 213, 466, 213, 461, - 462, 463, 213, 464, 1405, 467, 213, 213, 619, 1405, - 620, 213, 213, 621, 1405, 465, 622, 625, 626, 213, - 213, 627, 213, 1405, 213, 466, 213, 461, 462, 463, - 213, 464, 213, 467, 213, 213, 619, 468, 620, 213, - 213, 621, 469, 1405, 622, 625, 626, 213, 1405, 627, - 213, 213, 628, 483, 213, 1405, 1405, 479, 629, 1405, - 213, 1405, 213, 630, 213, 468, 1405, 213, 213, 213, - - 469, 470, 213, 471, 213, 213, 472, 631, 491, 213, - 628, 483, 473, 213, 213, 479, 629, 213, 213, 474, - 213, 630, 213, 494, 213, 213, 213, 213, 1405, 470, - 213, 471, 213, 213, 472, 631, 491, 1405, 632, 633, - 473, 213, 213, 634, 635, 213, 213, 474, 623, 636, - 637, 494, 213, 213, 640, 213, 624, 641, 642, 475, - 476, 213, 492, 477, 213, 213, 632, 633, 493, 213, - 643, 634, 635, 1405, 213, 1405, 623, 636, 637, 638, - 1405, 213, 640, 213, 624, 641, 642, 475, 476, 639, - 492, 477, 213, 213, 481, 482, 493, 213, 643, 495, - - 644, 213, 213, 213, 213, 213, 213, 638, 213, 645, - 213, 213, 648, 649, 496, 213, 1405, 639, 1405, 650, - 646, 1405, 481, 482, 213, 651, 652, 495, 644, 213, - 647, 213, 213, 213, 213, 653, 213, 645, 213, 213, - 648, 649, 496, 213, 484, 213, 485, 650, 646, 213, - 486, 1405, 213, 651, 652, 497, 213, 487, 647, 654, - 1405, 488, 1405, 653, 655, 213, 213, 1405, 213, 213, - 500, 213, 484, 213, 485, 213, 498, 213, 486, 499, - 213, 213, 1405, 497, 213, 487, 656, 654, 213, 488, - 213, 1405, 655, 213, 213, 213, 213, 213, 500, 213, - - 213, 213, 1405, 213, 498, 502, 657, 499, 213, 213, - 213, 213, 213, 213, 656, 508, 213, 213, 213, 501, - 213, 213, 213, 213, 658, 213, 213, 659, 213, 213, - 213, 1405, 1405, 502, 657, 662, 213, 503, 213, 213, - 213, 213, 1405, 508, 1405, 213, 213, 501, 213, 213, - 213, 1405, 658, 213, 213, 659, 213, 1405, 213, 660, - 509, 1405, 1405, 662, 213, 503, 213, 1405, 1405, 213, - 213, 665, 518, 213, 213, 504, 213, 213, 661, 213, - 666, 667, 213, 213, 213, 505, 668, 660, 509, 510, - 506, 507, 213, 511, 213, 213, 213, 213, 213, 665, - - 518, 213, 213, 504, 213, 213, 661, 213, 666, 667, - 213, 213, 213, 505, 668, 1405, 663, 510, 506, 507, - 213, 511, 669, 213, 213, 213, 670, 213, 519, 664, - 213, 517, 213, 1405, 671, 672, 213, 213, 520, 673, - 213, 213, 674, 213, 663, 213, 675, 512, 213, 513, - 669, 213, 676, 213, 670, 213, 519, 664, 1405, 517, - 213, 213, 671, 672, 213, 213, 520, 673, 677, 213, - 674, 213, 678, 213, 675, 512, 213, 513, 679, 213, - 676, 680, 681, 682, 683, 1405, 213, 684, 213, 213, - 514, 685, 515, 213, 521, 524, 677, 213, 213, 686, - - 678, 213, 213, 516, 687, 688, 679, 213, 213, 680, - 681, 682, 683, 213, 213, 684, 213, 1405, 514, 685, - 515, 213, 521, 524, 1405, 213, 213, 686, 689, 213, - 213, 516, 687, 688, 525, 213, 213, 690, 1405, 1405, - 691, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, - 522, 1405, 213, 523, 213, 1405, 689, 213, 526, 692, - 694, 693, 525, 1405, 213, 690, 213, 213, 691, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 522, 213, - 213, 523, 213, 527, 695, 213, 526, 692, 694, 693, - 1405, 213, 213, 213, 213, 213, 696, 213, 213, 213, - - 697, 698, 213, 213, 213, 529, 213, 213, 213, 213, - 699, 527, 695, 213, 528, 213, 700, 1405, 213, 213, - 1405, 213, 1405, 1405, 696, 213, 213, 1405, 697, 698, - 1405, 213, 703, 529, 213, 213, 213, 213, 699, 213, - 704, 213, 528, 213, 700, 213, 213, 701, 530, 838, - 531, 702, 532, 213, 213, 213, 533, 839, 213, 213, - 703, 534, 213, 213, 213, 840, 213, 213, 704, 841, - 842, 213, 213, 213, 213, 701, 530, 838, 531, 702, - 532, 843, 213, 213, 533, 839, 213, 213, 1405, 534, - 213, 844, 213, 840, 213, 1405, 1405, 841, 842, 213, - - 213, 1405, 213, 535, 845, 539, 1405, 846, 536, 843, - 213, 1405, 213, 540, 213, 213, 537, 213, 847, 844, - 213, 538, 213, 542, 541, 213, 213, 213, 848, 213, - 849, 535, 845, 539, 213, 846, 536, 850, 213, 213, - 213, 540, 213, 213, 537, 213, 847, 1405, 213, 538, - 213, 542, 541, 213, 213, 213, 848, 213, 849, 851, - 852, 1405, 213, 1405, 853, 850, 546, 213, 543, 854, - 213, 213, 855, 856, 213, 548, 857, 544, 1405, 213, - 547, 213, 1405, 1405, 213, 545, 1405, 851, 852, 213, - 213, 213, 853, 1405, 546, 858, 543, 854, 213, 213, - - 855, 856, 213, 548, 857, 544, 549, 213, 547, 213, - 213, 213, 213, 545, 213, 213, 859, 213, 213, 213, - 213, 213, 552, 858, 550, 213, 860, 1405, 1405, 213, - 213, 213, 551, 1405, 549, 213, 213, 1405, 213, 213, - 213, 861, 213, 213, 859, 213, 213, 862, 213, 213, - 552, 555, 550, 213, 860, 213, 213, 213, 213, 213, - 551, 213, 863, 213, 213, 213, 553, 213, 213, 861, - 1405, 213, 213, 213, 213, 862, 1405, 554, 213, 555, - 864, 213, 213, 213, 213, 213, 556, 865, 213, 213, - 863, 213, 557, 213, 553, 213, 1405, 866, 213, 213, - - 213, 213, 867, 868, 558, 554, 213, 869, 864, 213, - 213, 213, 870, 213, 556, 865, 213, 871, 213, 213, - 557, 213, 563, 213, 559, 866, 213, 213, 1405, 213, - 867, 868, 558, 213, 872, 869, 873, 213, 1405, 213, - 870, 564, 874, 213, 875, 871, 213, 213, 1405, 213, - 563, 213, 559, 560, 1405, 213, 213, 213, 1405, 1405, - 561, 213, 872, 562, 873, 213, 213, 876, 1405, 564, - 874, 213, 875, 877, 1405, 213, 213, 878, 1405, 1405, - 565, 560, 213, 879, 213, 213, 566, 213, 561, 567, - 1405, 562, 213, 213, 213, 876, 569, 1405, 1405, 213, - - 213, 877, 568, 213, 213, 878, 213, 213, 565, 213, - 213, 879, 880, 213, 566, 213, 213, 567, 570, 881, - 213, 213, 213, 213, 569, 571, 213, 213, 213, 213, - 568, 213, 213, 213, 213, 213, 712, 213, 213, 213, - 880, 213, 213, 213, 213, 882, 570, 881, 213, 213, - 213, 213, 883, 571, 213, 1405, 1405, 213, 1405, 1405, - 213, 213, 1405, 1405, 712, 1405, 213, 213, 1405, 1405, - 213, 213, 1405, 882, 884, 885, 213, 213, 706, 706, - 883, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 440, 440, 440, 440, 440, 440, 440, 440, 440, - - 440, 888, 884, 885, 889, 890, 891, 892, 441, 443, - 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, - 443, 443, 443, 443, 443, 443, 443, 443, 443, 888, - 895, 1405, 889, 890, 891, 892, 441, 708, 708, 896, - 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, - 710, 213, 711, 1405, 213, 213, 213, 213, 895, 213, - 213, 213, 213, 713, 213, 897, 1405, 896, 1405, 213, - 213, 213, 213, 1405, 213, 1405, 213, 1405, 710, 213, - 711, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 713, 213, 897, 213, 1405, 213, 213, 213, 213, - - 213, 213, 213, 213, 213, 886, 213, 213, 213, 213, - 1405, 1405, 715, 714, 213, 1405, 887, 898, 213, 899, - 1405, 1405, 213, 213, 213, 718, 900, 213, 213, 213, - 1405, 213, 213, 886, 213, 213, 213, 213, 213, 213, - 715, 714, 717, 213, 887, 898, 213, 899, 213, 213, - 1405, 213, 901, 718, 900, 213, 213, 716, 213, 213, - 213, 719, 1405, 213, 902, 213, 213, 213, 213, 903, - 717, 213, 1405, 213, 1405, 1405, 213, 213, 893, 894, - 901, 904, 1405, 1405, 905, 716, 213, 213, 906, 719, - 213, 213, 902, 907, 213, 213, 213, 903, 908, 213, - - 213, 213, 720, 723, 721, 213, 893, 894, 213, 904, - 213, 724, 905, 1405, 213, 213, 906, 1405, 213, 722, - 1405, 907, 213, 213, 213, 909, 908, 213, 213, 910, - 720, 723, 721, 213, 911, 1405, 213, 912, 213, 724, - 213, 213, 213, 213, 213, 213, 1405, 722, 725, 1405, - 213, 213, 213, 909, 213, 913, 726, 910, 213, 1405, - 213, 213, 911, 728, 213, 912, 1405, 213, 213, 213, - 914, 213, 213, 213, 727, 915, 725, 213, 213, 213, - 916, 1405, 213, 913, 726, 1405, 213, 213, 213, 213, - 917, 728, 213, 918, 213, 213, 213, 919, 914, 213, - - 731, 729, 727, 915, 213, 213, 213, 213, 916, 213, - 213, 920, 921, 730, 213, 213, 1405, 1405, 917, 213, - 213, 918, 213, 1405, 213, 919, 922, 1405, 731, 729, - 923, 1405, 213, 924, 213, 213, 925, 213, 213, 920, - 921, 730, 213, 213, 733, 213, 213, 213, 213, 213, - 732, 213, 926, 734, 922, 213, 213, 1405, 923, 213, - 927, 924, 735, 928, 925, 929, 213, 1405, 1405, 213, - 213, 213, 733, 213, 213, 930, 213, 213, 732, 213, - 926, 734, 1405, 213, 213, 736, 213, 213, 927, 213, - 735, 928, 739, 929, 213, 213, 213, 213, 213, 931, - - 737, 1405, 213, 930, 213, 213, 213, 1405, 1405, 738, - 213, 213, 213, 736, 213, 213, 213, 213, 932, 1405, - 739, 213, 741, 213, 213, 213, 213, 931, 737, 213, - 213, 213, 213, 213, 213, 213, 213, 738, 213, 213, - 213, 933, 213, 213, 213, 213, 932, 740, 934, 213, - 741, 213, 213, 213, 213, 213, 935, 213, 1405, 213, - 213, 213, 742, 213, 213, 1036, 1037, 1038, 743, 933, - 213, 213, 213, 213, 1405, 740, 934, 213, 213, 213, - 213, 213, 213, 213, 935, 1039, 213, 744, 213, 213, - 742, 1040, 213, 1036, 1037, 1038, 743, 213, 1041, 213, - - 213, 1042, 213, 745, 1405, 213, 213, 213, 746, 213, - 213, 213, 213, 1039, 213, 744, 213, 213, 213, 1040, - 213, 1043, 1044, 1045, 1046, 213, 1041, 213, 213, 1042, - 213, 745, 747, 1405, 213, 213, 746, 1047, 213, 213, - 213, 213, 1048, 213, 213, 213, 213, 1049, 748, 1043, - 1044, 1045, 1046, 213, 213, 213, 213, 1405, 1405, 1050, - 747, 749, 213, 213, 1051, 1047, 213, 1405, 213, 213, - 1048, 213, 213, 213, 1052, 1049, 748, 1405, 213, 1053, - 213, 213, 213, 1054, 750, 213, 213, 1050, 213, 749, - 213, 213, 1051, 751, 1055, 752, 213, 1056, 213, 213, - - 1405, 213, 1052, 1405, 1057, 213, 213, 1053, 213, 1058, - 1059, 1054, 750, 213, 213, 213, 213, 1405, 213, 1060, - 753, 751, 1055, 752, 213, 1056, 213, 213, 213, 754, - 1405, 213, 1057, 213, 213, 1061, 213, 1058, 1059, 1062, - 1063, 213, 1405, 213, 213, 755, 1064, 1060, 753, 213, - 213, 1405, 213, 756, 213, 213, 213, 754, 757, 213, - 213, 1405, 213, 1061, 213, 213, 1065, 1062, 1063, 213, - 213, 1066, 213, 755, 1064, 1067, 1405, 213, 213, 759, - 1068, 756, 213, 213, 1405, 758, 757, 213, 213, 213, - 1405, 213, 213, 213, 1065, 1405, 213, 213, 213, 1066, - - 1405, 213, 213, 1067, 213, 1069, 1070, 759, 1068, 213, - 1071, 760, 761, 758, 213, 213, 213, 213, 213, 213, - 213, 1405, 1072, 213, 213, 213, 1405, 1405, 213, 213, - 213, 1075, 213, 1069, 1070, 1405, 1076, 213, 1071, 760, - 761, 1077, 213, 213, 213, 213, 213, 762, 213, 213, - 1072, 213, 213, 213, 1073, 213, 213, 1074, 213, 1075, - 763, 764, 1078, 213, 1076, 213, 1405, 1405, 213, 1077, - 1405, 213, 1405, 213, 1079, 762, 213, 213, 1080, 1405, - 213, 213, 1073, 213, 1081, 1074, 213, 1405, 763, 764, - 1078, 213, 1405, 213, 213, 213, 213, 767, 213, 213, - - 765, 213, 1079, 1082, 213, 766, 1080, 213, 1083, 1405, - 1405, 1084, 1081, 1405, 213, 213, 1405, 213, 1085, 1405, - 768, 1086, 213, 213, 213, 767, 213, 213, 765, 213, - 213, 1082, 213, 766, 769, 213, 1083, 770, 213, 1084, - 213, 213, 213, 213, 213, 213, 1085, 771, 768, 1086, - 1087, 213, 213, 1405, 213, 213, 1088, 213, 213, 1089, - 1090, 213, 769, 1405, 1091, 770, 213, 772, 213, 213, - 1405, 213, 213, 1092, 213, 771, 773, 1405, 1087, 213, - 1093, 213, 213, 213, 1088, 213, 213, 1089, 1090, 213, - 775, 213, 1091, 213, 213, 772, 1094, 1095, 213, 213, - - 213, 1092, 213, 213, 773, 213, 1096, 213, 1093, 213, - 213, 1097, 213, 774, 213, 1098, 1099, 213, 775, 213, - 1100, 213, 213, 1405, 1094, 1095, 213, 1101, 213, 1405, - 1102, 213, 213, 213, 1096, 213, 776, 1405, 213, 1097, - 213, 774, 213, 1098, 1099, 213, 777, 213, 1100, 1103, - 1104, 213, 213, 1405, 1105, 1101, 1106, 213, 1102, 1107, - 213, 213, 1108, 780, 776, 213, 1109, 213, 1405, 1186, - 213, 213, 1405, 1405, 777, 213, 1405, 1103, 1104, 213, - 213, 213, 1105, 1405, 1106, 213, 1405, 1107, 1187, 213, - 1108, 780, 1405, 213, 1109, 213, 778, 1186, 213, 213, - - 213, 213, 213, 781, 213, 213, 779, 1405, 213, 213, - 213, 213, 1405, 1405, 782, 213, 1187, 1405, 213, 213, - 213, 213, 1405, 1405, 778, 213, 213, 1405, 213, 213, - 213, 781, 213, 213, 779, 213, 213, 1188, 213, 213, - 213, 213, 782, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 1189, 213, 213, 783, 1190, 784, 213, 1191, - 213, 213, 1192, 213, 213, 1188, 1405, 785, 213, 213, - 1405, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, - 1189, 213, 213, 783, 1190, 784, 213, 1191, 213, 213, - 1192, 213, 213, 1405, 786, 785, 213, 1193, 213, 213, - - 213, 213, 213, 213, 787, 213, 213, 1194, 1195, 213, - 213, 213, 1405, 213, 1196, 1405, 1405, 789, 788, 213, - 1197, 213, 786, 213, 213, 1193, 213, 213, 213, 213, - 1198, 1199, 787, 213, 213, 1194, 1195, 213, 213, 213, - 790, 213, 1196, 213, 213, 789, 788, 213, 1197, 213, - 213, 213, 1200, 213, 1201, 213, 791, 1202, 1198, 1199, - 213, 1405, 1203, 213, 1405, 213, 1204, 213, 790, 794, - 1205, 213, 213, 1206, 213, 213, 1405, 1405, 213, 213, - 1200, 213, 1201, 1405, 791, 1202, 1207, 1405, 213, 800, - 1203, 213, 792, 213, 1204, 213, 213, 794, 1205, 213, - - 213, 1206, 213, 213, 797, 213, 213, 213, 1208, 213, - 213, 793, 1405, 1209, 1207, 213, 213, 800, 1210, 1405, - 792, 213, 1405, 1211, 213, 1212, 1405, 213, 213, 1213, - 1405, 213, 797, 213, 213, 798, 1208, 213, 213, 793, - 213, 1209, 213, 213, 213, 795, 1210, 213, 799, 1405, - 213, 1211, 213, 1212, 213, 213, 213, 1213, 796, 1214, - 213, 213, 1215, 798, 1405, 1216, 213, 1217, 213, 1218, - 213, 1219, 1220, 795, 1405, 213, 799, 801, 213, 1405, - 213, 213, 213, 213, 213, 213, 796, 1214, 213, 213, - 1215, 213, 213, 1216, 213, 1217, 213, 1218, 1221, 1219, - - 1220, 213, 213, 1405, 1405, 801, 1222, 802, 1223, 213, - 1224, 213, 213, 213, 803, 213, 804, 1225, 213, 213, - 213, 213, 1226, 213, 213, 213, 1221, 213, 213, 213, - 213, 213, 805, 1405, 1222, 802, 1223, 213, 1224, 213, - 213, 1227, 803, 213, 804, 1225, 213, 1405, 806, 213, - 1226, 213, 213, 213, 1405, 213, 213, 213, 213, 213, - 805, 213, 808, 1405, 1405, 213, 213, 807, 213, 1227, - 1405, 213, 213, 1405, 1405, 213, 806, 213, 1405, 1405, - 213, 213, 213, 1405, 1405, 213, 213, 1228, 213, 213, - 808, 213, 213, 1405, 213, 807, 213, 1405, 213, 213, - - 213, 809, 213, 213, 1229, 213, 213, 213, 213, 213, - 213, 213, 213, 811, 1230, 1228, 213, 213, 1278, 213, - 213, 812, 213, 213, 1405, 810, 213, 213, 213, 809, - 213, 1405, 1229, 213, 213, 213, 213, 1405, 1405, 213, - 213, 811, 1230, 1405, 1405, 213, 1278, 1405, 1405, 812, - 213, 213, 213, 810, 213, 213, 213, 1405, 1280, 213, - 813, 213, 1405, 213, 213, 213, 815, 1405, 213, 1281, - 213, 814, 213, 213, 213, 213, 816, 1282, 213, 213, - 213, 1283, 213, 213, 213, 818, 1280, 213, 813, 1405, - 213, 213, 213, 213, 815, 213, 213, 1281, 213, 814, - - 213, 213, 213, 213, 816, 1282, 213, 213, 213, 1283, - 213, 213, 213, 818, 1405, 213, 817, 819, 213, 1405, - 213, 213, 213, 213, 1405, 1284, 213, 213, 213, 1405, - 820, 1405, 213, 1405, 1285, 213, 213, 213, 213, 1405, - 213, 1286, 213, 213, 817, 819, 1287, 213, 213, 213, - 213, 213, 821, 1284, 213, 213, 213, 823, 820, 213, - 213, 822, 1285, 213, 1405, 213, 213, 213, 213, 1286, - 213, 213, 213, 213, 1287, 213, 213, 213, 1288, 213, - 821, 1405, 824, 826, 825, 823, 1289, 213, 1290, 822, - 1405, 1291, 213, 213, 213, 213, 213, 1292, 828, 213, - - 213, 213, 1293, 213, 213, 213, 1288, 1294, 213, 827, - 824, 826, 825, 213, 1289, 1295, 1290, 213, 830, 1291, - 213, 213, 1296, 213, 213, 1292, 828, 213, 213, 213, - 1293, 213, 213, 213, 213, 1294, 213, 827, 213, 213, - 213, 213, 213, 1295, 1297, 213, 830, 213, 939, 829, - 1296, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, - 213, 213, 213, 1405, 1405, 1298, 213, 213, 213, 1299, - 213, 213, 1297, 213, 1300, 213, 939, 829, 213, 213, - 213, 213, 831, 213, 1326, 1328, 213, 832, 213, 1329, - 833, 213, 835, 1298, 834, 213, 213, 1299, 213, 213, - - 213, 213, 1300, 213, 1330, 1405, 213, 213, 213, 213, - 831, 213, 1326, 1328, 213, 832, 213, 1329, 833, 213, - 835, 1405, 834, 213, 213, 1331, 213, 213, 213, 213, - 1332, 213, 1330, 836, 213, 1333, 213, 1334, 1335, 213, - 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, - 1405, 1405, 1405, 1331, 1405, 213, 1405, 213, 1332, 1405, - 1405, 836, 213, 1333, 1405, 1334, 1335, 213, 575, 575, - 575, 575, 575, 575, 575, 575, 575, 575, 577, 577, - 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, - 577, 577, 577, 577, 577, 577, 577, 577, 707, 707, - - 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 707, 707, 707, 707, 707, 707, 707, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 709, 213, 1336, - 213, 213, 213, 213, 937, 213, 213, 938, 213, 1337, - 213, 1405, 213, 213, 1279, 1279, 1405, 1338, 1405, 1355, - 1356, 1405, 940, 1405, 1405, 1405, 213, 1336, 213, 213, - 213, 213, 937, 213, 213, 938, 213, 1337, 213, 213, - 213, 213, 1405, 213, 213, 1338, 942, 1355, 1356, 213, - 940, 213, 941, 943, 1327, 1357, 213, 213, 213, 213, - - 944, 1358, 1405, 213, 1405, 213, 1405, 213, 1405, 1359, - 213, 213, 213, 213, 942, 1303, 1279, 213, 1362, 213, - 941, 943, 1327, 1357, 213, 213, 213, 213, 944, 1358, - 945, 213, 213, 213, 213, 946, 213, 1359, 213, 213, - 213, 213, 213, 213, 1354, 1354, 1362, 1405, 1405, 213, - 213, 1369, 213, 1370, 1405, 1341, 1373, 1405, 945, 213, - 213, 1376, 213, 946, 213, 213, 1405, 213, 213, 213, - 213, 213, 213, 1361, 1354, 213, 213, 213, 213, 1369, - 213, 1370, 213, 1341, 1373, 213, 213, 213, 1368, 1376, - 213, 947, 213, 213, 948, 213, 213, 213, 1405, 213, - - 213, 1378, 1405, 213, 213, 213, 213, 1405, 1405, 1405, - 213, 1405, 1380, 213, 213, 213, 1368, 1372, 213, 947, - 213, 213, 948, 213, 213, 949, 213, 213, 213, 1378, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 950, - 1380, 213, 952, 213, 1405, 1372, 213, 213, 213, 213, - 1405, 1382, 1384, 949, 213, 1405, 213, 1386, 213, 213, - 213, 1388, 1390, 213, 213, 213, 213, 950, 213, 213, - 952, 1392, 213, 1394, 213, 213, 213, 953, 213, 1382, - 1384, 213, 1396, 951, 1405, 1386, 1405, 213, 213, 1388, - 1390, 1405, 1398, 1405, 1405, 1405, 213, 213, 213, 1392, - - 213, 1394, 213, 1405, 1405, 953, 213, 1405, 213, 213, - 1396, 951, 955, 954, 213, 213, 213, 213, 213, 213, - 1398, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, - 213, 213, 956, 213, 1405, 1405, 213, 213, 213, 1405, - 955, 954, 213, 213, 1405, 213, 213, 213, 1405, 213, - 1405, 1405, 213, 1405, 1405, 213, 213, 1405, 213, 213, - 956, 213, 959, 213, 958, 213, 213, 213, 213, 213, - 1405, 213, 1405, 213, 213, 213, 957, 1405, 1405, 213, - 213, 213, 1405, 213, 213, 213, 213, 960, 213, 961, - 959, 213, 958, 213, 1405, 213, 213, 213, 213, 1405, - - 213, 213, 213, 213, 957, 213, 1405, 213, 213, 213, - 213, 213, 1405, 213, 213, 960, 213, 961, 962, 1405, - 963, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, - 1405, 213, 213, 1405, 1405, 1405, 962, 1405, 963, 1405, - 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, - 213, 1405, 213, 213, 213, 964, 1405, 1405, 1405, 213, - 213, 1405, 213, 213, 965, 213, 1405, 213, 1405, 213, - 213, 213, 213, 966, 1405, 213, 213, 213, 1405, 213, - 1405, 213, 1405, 964, 213, 1405, 967, 1405, 213, 213, - - 213, 213, 965, 213, 1405, 213, 1405, 213, 213, 213, - 213, 966, 1405, 213, 213, 213, 1405, 213, 213, 213, - 213, 969, 213, 1405, 967, 213, 968, 213, 1405, 970, - 213, 971, 213, 1405, 213, 213, 1405, 1405, 1405, 213, - 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 969, - 1405, 213, 213, 213, 968, 1405, 1405, 970, 213, 971, - 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, - 213, 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, - 213, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, - 1405, 213, 213, 213, 973, 974, 1405, 972, 1405, 213, - - 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, - 213, 213, 213, 975, 213, 1405, 213, 213, 1405, 213, - 213, 213, 973, 974, 213, 972, 1405, 213, 213, 213, - 213, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, - 1405, 975, 213, 976, 213, 213, 1405, 213, 213, 213, - 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, - 1405, 1405, 213, 1405, 1405, 213, 213, 213, 1405, 1405, - 213, 976, 213, 213, 1405, 213, 213, 213, 213, 213, - 1405, 1405, 213, 213, 977, 213, 213, 213, 213, 978, - 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, - - 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 977, 1405, 979, 213, 213, 978, 213, 213, - 213, 213, 213, 1405, 980, 213, 213, 213, 213, 1405, - 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 1405, - 1405, 213, 979, 213, 213, 213, 1405, 213, 982, 1405, - 1405, 213, 980, 213, 981, 213, 213, 1405, 1405, 983, - 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, - 213, 213, 213, 213, 984, 213, 982, 1405, 1405, 213, - 213, 213, 981, 213, 1405, 1405, 1405, 983, 213, 213, - 990, 1405, 1405, 213, 213, 1405, 213, 1405, 213, 213, - - 213, 213, 984, 213, 1405, 987, 213, 213, 213, 985, - 213, 213, 213, 1405, 213, 1405, 213, 213, 990, 1405, - 986, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, - 1405, 1405, 1405, 987, 213, 213, 1405, 985, 213, 213, - 213, 1405, 213, 1405, 213, 213, 1405, 1405, 986, 213, - 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, - 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, - 1405, 213, 213, 988, 1405, 1405, 1405, 213, 213, 213, - 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, - - 213, 988, 989, 213, 213, 213, 1405, 213, 213, 213, - 1405, 213, 1405, 213, 213, 213, 1405, 213, 991, 1405, - 992, 993, 213, 1405, 213, 213, 213, 213, 213, 1405, - 989, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, - 1405, 213, 213, 213, 1405, 213, 991, 1405, 992, 993, - 213, 1405, 1405, 213, 994, 213, 213, 213, 213, 213, - 213, 1405, 1405, 995, 213, 213, 213, 1405, 1405, 213, - 213, 1405, 1405, 1405, 213, 1405, 1405, 1405, 996, 213, - 1405, 1405, 994, 213, 213, 213, 213, 213, 213, 213, - 1405, 995, 213, 213, 213, 1405, 1405, 213, 213, 213, - - 998, 1405, 213, 997, 213, 213, 996, 213, 1405, 213, - 213, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, - 213, 1405, 213, 1405, 1405, 213, 213, 213, 998, 1405, - 213, 997, 213, 213, 1405, 1405, 213, 213, 213, 999, - 1405, 213, 1405, 213, 1405, 213, 213, 1405, 213, 1405, - 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, - 1405, 213, 213, 1405, 213, 1000, 213, 999, 1405, 213, - 1002, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, - 213, 213, 1405, 1405, 213, 1001, 213, 213, 1405, 213, - 213, 213, 1003, 1000, 213, 213, 213, 213, 1002, 1405, - - 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, - 1405, 213, 213, 1001, 213, 213, 1405, 1405, 1004, 213, - 1003, 1405, 213, 213, 213, 213, 213, 1005, 1405, 213, - 213, 213, 213, 1006, 1405, 213, 1405, 213, 1405, 213, - 213, 213, 213, 213, 1405, 1405, 1004, 1405, 213, 1405, - 213, 213, 213, 213, 213, 1005, 1405, 1405, 213, 213, - 213, 1006, 213, 213, 1405, 213, 213, 1405, 213, 213, - 213, 213, 213, 1405, 1405, 1007, 213, 1405, 1405, 213, - 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, - 213, 213, 213, 1008, 213, 213, 213, 213, 213, 1405, - - 213, 1009, 1010, 1007, 1405, 213, 1405, 213, 213, 1405, - 213, 1011, 1405, 213, 213, 213, 213, 213, 213, 213, - 213, 1008, 1405, 213, 213, 213, 213, 213, 1405, 1009, - 1010, 213, 1405, 213, 213, 213, 213, 213, 1405, 1011, - 213, 1405, 213, 1405, 213, 1405, 213, 213, 1012, 213, - 213, 1013, 213, 1015, 1405, 213, 213, 213, 1405, 213, - 213, 213, 213, 213, 1405, 213, 1405, 1405, 213, 1405, - 1405, 1014, 213, 213, 1405, 213, 1012, 213, 213, 1013, - 213, 1015, 213, 1405, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1014, - - 1016, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, - 213, 1405, 213, 213, 213, 213, 1405, 1405, 213, 1017, - 213, 213, 213, 213, 213, 213, 1018, 1405, 1016, 213, - 213, 213, 213, 1019, 213, 213, 1405, 213, 1405, 213, - 213, 213, 213, 213, 1405, 1405, 1405, 1017, 213, 1405, - 213, 213, 213, 213, 1018, 1405, 1405, 213, 1020, 213, - 213, 1019, 213, 213, 1405, 213, 213, 213, 213, 213, - 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1405, 213, - 213, 213, 213, 1405, 1405, 1405, 1020, 213, 1405, 1405, - 213, 213, 1405, 1405, 213, 1405, 213, 213, 1405, 213, - - 213, 213, 213, 1405, 213, 1405, 1021, 213, 1405, 1022, - 213, 213, 1023, 213, 213, 213, 1405, 1405, 1405, 1405, - 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, - 213, 1405, 213, 213, 1021, 1405, 1405, 1022, 1405, 213, - 1023, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, - 1405, 213, 213, 213, 1024, 1405, 213, 213, 213, 1405, - 1025, 213, 213, 1405, 213, 213, 1027, 1405, 1405, 213, - 213, 1026, 1405, 213, 213, 213, 1405, 213, 1405, 213, - 213, 1405, 1024, 1405, 213, 213, 213, 1405, 1025, 213, - 213, 1405, 213, 213, 1027, 1405, 1405, 213, 213, 1026, - - 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 1028, - 1030, 1029, 213, 213, 213, 1405, 213, 213, 213, 1405, - 213, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, - 213, 213, 1405, 1405, 1405, 1405, 213, 1028, 1030, 1029, - 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, - 213, 213, 1031, 213, 213, 1405, 213, 1405, 213, 213, - 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, - 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 1032, - 1031, 213, 213, 213, 213, 1405, 1405, 213, 213, 1033, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - - 213, 213, 213, 1405, 1405, 1405, 1405, 1032, 1405, 213, - 213, 213, 213, 213, 1405, 213, 1405, 1033, 213, 1405, - 1034, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, - 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 1405, 213, 213, 213, 1112, 1111, 1034, 1405, - 213, 1405, 213, 213, 213, 1405, 213, 1405, 1405, 213, - 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, - 1405, 213, 213, 213, 1112, 1111, 213, 1405, 213, 1405, - 1405, 213, 213, 1113, 213, 213, 213, 213, 1405, 213, - 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, - - 1114, 1405, 213, 213, 213, 213, 1405, 1405, 1115, 213, - 213, 1113, 213, 213, 213, 213, 213, 213, 1405, 1405, - 213, 213, 213, 213, 1116, 213, 1405, 1405, 1114, 213, - 213, 213, 213, 213, 1405, 213, 1115, 1117, 1405, 213, - 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, - 213, 1405, 1116, 213, 213, 1405, 1118, 213, 1405, 213, - 213, 213, 213, 213, 213, 1117, 213, 213, 213, 213, - 1119, 213, 213, 213, 213, 1121, 1405, 213, 1120, 213, - 1405, 1405, 213, 1405, 1118, 213, 1405, 213, 213, 213, - 213, 1405, 213, 1405, 213, 213, 213, 213, 1119, 1405, - - 213, 213, 213, 1121, 1405, 213, 1120, 213, 213, 1405, - 1122, 213, 1405, 213, 213, 213, 213, 1405, 1123, 1405, - 213, 213, 1405, 213, 213, 1405, 1405, 213, 1405, 213, - 1405, 213, 1405, 213, 213, 1405, 213, 1124, 1122, 213, - 1405, 1405, 213, 213, 1405, 1405, 1123, 213, 213, 213, - 1125, 1405, 213, 1405, 213, 213, 1127, 1405, 213, 213, - 213, 1126, 213, 213, 213, 1124, 213, 213, 213, 1405, - 1405, 213, 1405, 213, 213, 213, 213, 213, 1125, 1405, - 1405, 1405, 213, 1405, 1127, 1405, 213, 213, 213, 1126, - 1405, 213, 213, 213, 213, 213, 213, 1128, 1405, 213, - - 1405, 213, 213, 213, 213, 213, 1131, 213, 1405, 1405, - 213, 213, 213, 213, 1130, 213, 213, 213, 1405, 213, - 1405, 213, 1129, 1405, 213, 1128, 213, 213, 1405, 1405, - 1405, 213, 1405, 213, 1131, 213, 1405, 1132, 213, 213, - 213, 213, 1130, 213, 213, 213, 1405, 213, 1405, 1405, - 1129, 1405, 213, 213, 213, 213, 1133, 1405, 213, 213, - 213, 213, 213, 213, 1405, 1132, 213, 1405, 213, 213, - 213, 213, 213, 1134, 1135, 1405, 213, 1136, 213, 213, - 1405, 213, 213, 1405, 1133, 1405, 213, 213, 213, 213, - 213, 213, 1405, 1137, 213, 1405, 213, 213, 213, 213, - - 213, 1134, 1135, 1405, 213, 1136, 213, 213, 1405, 213, - 213, 1405, 1138, 1405, 213, 213, 213, 213, 213, 213, - 213, 1137, 1405, 1405, 213, 213, 213, 213, 1405, 1405, - 1405, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, - 1138, 213, 213, 213, 213, 213, 213, 213, 213, 1405, - 1405, 213, 213, 213, 213, 1405, 213, 1405, 1140, 1139, - 213, 213, 213, 213, 213, 1142, 213, 213, 1405, 213, - 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, - 213, 1405, 1405, 1405, 213, 1141, 1140, 1139, 213, 213, - 213, 1405, 1405, 1142, 213, 213, 1405, 1405, 213, 213, - - 213, 213, 213, 1405, 213, 213, 1143, 1144, 213, 1405, - 1405, 213, 213, 1141, 213, 1405, 1405, 1405, 213, 213, - 1405, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, - 1405, 1405, 1405, 213, 1143, 1144, 213, 1405, 213, 213, - 213, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, - 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, - 213, 213, 213, 1145, 213, 213, 213, 213, 1405, 1405, - 213, 213, 213, 1405, 213, 1405, 213, 1405, 1405, 213, - 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, - 213, 1145, 1405, 213, 1405, 213, 1405, 213, 213, 213, - - 213, 213, 213, 213, 213, 1146, 1147, 213, 1148, 213, - 213, 1149, 213, 213, 1405, 1405, 213, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 213, 213, 213, 1150, 213, - 213, 213, 213, 1146, 1147, 213, 1148, 213, 213, 1149, - 213, 213, 1405, 213, 213, 213, 1405, 1405, 1405, 1405, - 213, 1405, 1151, 1405, 213, 213, 1150, 213, 213, 213, - 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, - 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 213, - 1151, 213, 1405, 213, 213, 213, 213, 213, 213, 213, - 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, - - 213, 213, 213, 213, 213, 213, 1152, 213, 1153, 213, - 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1154, - 1405, 1405, 1405, 1405, 1405, 1405, 213, 1405, 1405, 213, - 213, 213, 213, 1405, 1152, 1405, 1153, 213, 213, 1405, - 1405, 213, 213, 213, 213, 213, 1405, 1154, 1405, 1405, - 213, 1155, 1405, 1156, 213, 213, 1405, 213, 213, 213, - 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 1405, 213, - 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1155, - 1405, 1156, 213, 213, 213, 213, 213, 213, 213, 213, - 1157, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, - - 1405, 213, 1405, 1158, 1405, 213, 213, 213, 1405, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 1157, 1405, - 1159, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, - 1405, 1158, 213, 213, 213, 213, 213, 213, 1405, 213, - 1405, 213, 213, 213, 1160, 213, 213, 1405, 1159, 213, - 213, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1161, - 213, 1405, 1405, 1405, 213, 213, 213, 1405, 1405, 213, - 213, 213, 1160, 213, 213, 213, 1173, 213, 213, 213, - 213, 213, 1163, 213, 213, 213, 213, 1161, 1162, 1405, - 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, - - 1405, 1164, 213, 213, 1173, 213, 1405, 213, 213, 213, - 1163, 213, 1165, 213, 213, 213, 1162, 1405, 213, 213, - 213, 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1164, - 213, 1405, 1405, 213, 1166, 213, 213, 1167, 213, 213, - 1165, 213, 213, 213, 1405, 213, 213, 213, 213, 213, - 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, - 1405, 213, 1166, 213, 1405, 1167, 213, 1168, 213, 213, - 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, - 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, - 1405, 1405, 1169, 1405, 213, 1168, 213, 213, 213, 1405, - - 213, 1405, 1405, 213, 213, 213, 213, 1170, 1405, 213, - 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, - 1169, 1405, 213, 213, 1405, 213, 213, 1405, 1171, 213, - 1172, 213, 213, 213, 213, 1170, 1405, 1405, 213, 213, - 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, - 1405, 213, 1405, 213, 213, 213, 1171, 213, 1172, 1174, - 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, - 213, 1405, 213, 1405, 1405, 213, 1175, 213, 1405, 1176, - 213, 213, 213, 213, 1405, 1405, 1405, 1174, 213, 1405, - 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1177, - - 1405, 1405, 213, 213, 1175, 1405, 1405, 1176, 213, 213, - 213, 1178, 213, 1405, 1405, 1405, 213, 213, 213, 1405, - 213, 213, 213, 1405, 213, 213, 213, 1177, 1405, 1405, - 213, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 1178, - 213, 1405, 1405, 1179, 213, 213, 1405, 213, 1405, 213, - 213, 1405, 213, 213, 213, 1180, 213, 1181, 213, 213, - 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, - 1405, 1179, 1405, 1405, 1405, 213, 213, 213, 213, 1405, - 213, 213, 213, 1180, 213, 1181, 213, 1182, 213, 213, - 213, 213, 213, 1405, 213, 213, 213, 1405, 1183, 1405, - - 1405, 1184, 1405, 1405, 213, 213, 213, 1405, 213, 213, - 213, 213, 213, 1405, 213, 1182, 213, 1405, 1405, 213, - 213, 213, 1405, 213, 213, 213, 1183, 1405, 1405, 1184, - 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, - 213, 1405, 213, 213, 213, 1405, 1405, 213, 1405, 213, - 1232, 213, 213, 213, 213, 213, 1405, 1233, 213, 213, - 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, - 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 1232, 213, - 1405, 213, 213, 213, 213, 1233, 213, 213, 213, 1234, - 213, 213, 213, 1235, 213, 213, 213, 213, 213, 213, - - 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, - 1405, 1237, 213, 213, 213, 213, 213, 1234, 1405, 213, - 213, 1235, 213, 1405, 213, 213, 213, 213, 213, 1405, - 213, 213, 213, 213, 213, 1236, 1405, 1405, 213, 1237, - 213, 213, 1405, 1238, 213, 213, 1405, 1405, 213, 1405, - 213, 1405, 213, 1405, 213, 213, 213, 213, 213, 213, - 1405, 213, 1405, 1236, 213, 1405, 213, 1405, 213, 213, - 1405, 1238, 213, 213, 213, 1405, 1405, 1241, 213, 213, - 1239, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, - 1240, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, - - 213, 213, 213, 1405, 1405, 1241, 1405, 213, 1239, 1405, - 1405, 1405, 213, 1242, 213, 213, 213, 213, 1240, 213, - 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, - 213, 1405, 213, 1405, 213, 213, 1243, 1244, 1405, 213, - 213, 1242, 1405, 213, 213, 1405, 1405, 213, 213, 213, - 1405, 1405, 1405, 213, 213, 1405, 213, 1405, 213, 213, - 213, 1405, 213, 213, 1243, 1244, 1405, 213, 213, 213, - 1405, 213, 213, 1405, 1245, 213, 213, 213, 1405, 1405, - 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, - 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, - - 1246, 1405, 1245, 1405, 213, 213, 1405, 1405, 1405, 213, - 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, - 1405, 1405, 213, 213, 213, 1405, 213, 213, 1246, 213, - 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, 1248, - 1405, 213, 1247, 213, 213, 213, 213, 1405, 1405, 213, - 213, 1405, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 1405, 213, 1405, 213, 213, 213, 1248, 1405, 213, - 1247, 213, 213, 213, 213, 1405, 213, 213, 213, 1249, - 213, 1405, 213, 213, 213, 1405, 1250, 1405, 213, 1405, - 213, 213, 213, 1251, 213, 1405, 1405, 1405, 213, 213, - - 1405, 213, 213, 213, 213, 1405, 213, 1249, 1405, 1405, - 213, 213, 1405, 1405, 1250, 213, 213, 213, 213, 213, - 213, 1251, 213, 213, 1405, 1405, 213, 213, 213, 1405, - 213, 213, 1405, 1405, 1405, 213, 1405, 213, 1405, 1405, - 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, - 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, - 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, - 213, 1405, 213, 213, 1405, 213, 1405, 213, 213, 213, - 213, 1405, 213, 1252, 213, 1405, 1405, 213, 213, 213, - 213, 1405, 213, 1253, 213, 213, 213, 213, 1405, 1405, - - 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 1405, - 1254, 1252, 213, 213, 213, 1405, 213, 213, 213, 213, - 213, 1253, 1405, 213, 213, 213, 213, 1405, 213, 213, - 213, 213, 1405, 1405, 213, 1255, 213, 1405, 1254, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 1405, - 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, - 1405, 1405, 213, 1255, 213, 1405, 1405, 213, 213, 1405, - 1256, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, - 1405, 213, 213, 213, 1405, 213, 213, 213, 1257, 1405, - 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 1256, 213, - - 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, - 213, 213, 1405, 213, 213, 213, 1257, 1405, 213, 1405, - 213, 1405, 1259, 1405, 213, 213, 213, 213, 213, 213, - 1405, 213, 1258, 213, 213, 1405, 213, 1260, 213, 213, - 1405, 1405, 1405, 213, 1405, 1405, 213, 1261, 1405, 1405, - 1259, 213, 213, 213, 213, 1405, 213, 213, 213, 213, - 1258, 213, 213, 1405, 213, 1260, 213, 213, 213, 1405, - 213, 213, 1263, 1405, 1405, 1261, 1405, 213, 1262, 213, - 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 1405, 1264, 1265, 213, 213, 213, 1405, 213, 213, - - 1263, 213, 213, 213, 213, 213, 1262, 1405, 213, 213, - 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, - 1264, 1265, 213, 1266, 1405, 1405, 1405, 213, 213, 213, - 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, - 1267, 213, 213, 1405, 213, 213, 213, 213, 213, 213, - 1268, 1266, 1405, 1405, 213, 213, 213, 1405, 1405, 213, - 213, 213, 213, 213, 213, 1405, 1405, 1405, 1267, 213, - 1405, 1405, 1405, 213, 213, 213, 213, 213, 1268, 1269, - 1405, 213, 213, 213, 1405, 1270, 213, 213, 213, 1405, - 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1271, - - 213, 1405, 213, 213, 1405, 213, 1405, 1269, 213, 213, - 213, 1405, 213, 1270, 213, 1405, 1405, 213, 1405, 213, - 1405, 213, 213, 213, 213, 1405, 213, 1271, 213, 1405, - 1272, 213, 1405, 213, 1405, 213, 213, 213, 213, 213, - 213, 213, 213, 1273, 1274, 213, 213, 213, 1405, 1405, - 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1272, 213, - 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, - 213, 1273, 1274, 213, 213, 213, 1405, 1405, 213, 213, - 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, - 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, - - 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 213, 1405, 213, 1276, 213, 213, 1275, 213, - 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, - 213, 213, 213, 1276, 213, 213, 1275, 213, 1405, 213, - 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, - 213, 1405, 213, 1405, 1405, 213, 1302, 213, 1405, 213, - 213, 1405, 1303, 1279, 213, 1405, 213, 1405, 1405, 213, - 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, - - 213, 1405, 1405, 213, 1302, 213, 1405, 1405, 213, 213, - 213, 1405, 1405, 213, 213, 213, 1304, 1405, 213, 213, - 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, - 213, 1305, 1405, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 1405, 213, 1304, 213, 1405, 213, 213, 1405, - 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 1305, - 213, 1306, 213, 213, 213, 213, 213, 213, 213, 1405, - 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, 1405, - 213, 213, 1405, 213, 213, 1307, 1405, 213, 213, 1306, - 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, - - 213, 213, 213, 1308, 213, 213, 213, 213, 213, 213, - 213, 213, 1405, 1307, 213, 213, 213, 1405, 213, 213, - 213, 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, - 213, 1308, 1405, 213, 213, 213, 1405, 1405, 213, 213, - 1405, 1405, 213, 213, 213, 1309, 1405, 1405, 213, 213, - 213, 1405, 213, 1405, 213, 213, 1405, 1405, 213, 213, - 213, 1405, 213, 1405, 213, 1310, 1405, 213, 1405, 1405, - 1405, 213, 213, 1309, 213, 1405, 213, 1311, 213, 213, - 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, - 213, 1405, 213, 1310, 213, 213, 213, 1405, 1405, 1405, - - 213, 213, 213, 1405, 213, 1311, 213, 213, 213, 213, - 213, 1405, 213, 1405, 213, 213, 1405, 213, 1405, 213, - 213, 213, 213, 1405, 213, 1312, 213, 1405, 1405, 213, - 1405, 213, 1405, 1405, 213, 1313, 213, 1405, 213, 213, - 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, - 1314, 1405, 1405, 1312, 213, 213, 1405, 1405, 1405, 213, - 213, 1405, 213, 1313, 1315, 1405, 1405, 213, 213, 213, - 1405, 1405, 213, 213, 213, 213, 1405, 213, 1314, 213, - 1405, 213, 213, 213, 1405, 1316, 213, 213, 213, 1405, - 213, 213, 1315, 1405, 213, 1405, 213, 213, 1405, 1405, - - 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, - 213, 1405, 1405, 1316, 213, 213, 1405, 1405, 213, 213, - 213, 1405, 213, 1405, 213, 213, 1317, 1405, 1405, 213, - 213, 1405, 1318, 213, 213, 213, 1405, 213, 1405, 213, - 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, 213, - 213, 1405, 213, 213, 1317, 1405, 1405, 213, 213, 1405, - 1318, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, - 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, - 213, 213, 1319, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 1405, 213, 213, 1405, 1405, 1320, 213, 213, - - 1405, 1405, 213, 213, 213, 1405, 213, 1321, 213, 213, - 1319, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, - 1405, 213, 213, 1405, 1405, 1320, 213, 213, 1405, 1323, - 213, 213, 213, 213, 213, 1321, 213, 213, 1322, 213, - 1405, 213, 213, 1324, 213, 1405, 213, 213, 213, 213, - 1405, 1405, 1405, 213, 213, 1405, 1405, 1323, 213, 1405, - 213, 213, 1405, 213, 213, 213, 1322, 213, 1405, 213, - 213, 1324, 213, 213, 213, 213, 213, 213, 213, 213, - 1405, 213, 213, 213, 213, 1346, 1405, 1340, 1405, 213, - 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, - - 1405, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, - 213, 213, 213, 1346, 213, 1340, 1405, 213, 213, 213, - 213, 1405, 213, 213, 213, 1342, 1405, 213, 213, 213, - 213, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, - 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, - 213, 1405, 213, 1342, 213, 1405, 213, 213, 213, 1405, - 213, 213, 213, 1405, 213, 213, 1343, 213, 213, 213, - 213, 1405, 213, 1405, 213, 213, 1405, 213, 213, 213, - 1344, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, - 1405, 1405, 213, 213, 1343, 1405, 213, 213, 213, 213, - - 213, 1405, 213, 213, 213, 213, 1405, 213, 1344, 213, - 213, 213, 213, 213, 1347, 213, 1405, 213, 1345, 213, - 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, - 1348, 213, 213, 213, 213, 213, 1405, 213, 213, 213, - 213, 1405, 1347, 213, 1405, 213, 1345, 213, 213, 213, - 213, 1405, 1405, 213, 213, 213, 213, 1405, 1348, 213, - 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, - 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, - 213, 213, 1405, 213, 213, 213, 1350, 1405, 213, 213, - 1349, 1405, 1405, 213, 213, 213, 213, 1405, 213, 213, - - 1351, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 1405, 213, 1405, 213, 1350, 1405, 213, 1405, 1349, 1405, - 1405, 213, 1405, 213, 213, 1352, 213, 1363, 1351, 213, - 213, 213, 1405, 213, 213, 1405, 213, 213, 1405, 213, - 1361, 1354, 1405, 1405, 213, 1405, 213, 213, 1405, 213, - 1405, 1405, 213, 1352, 213, 1363, 213, 1405, 213, 213, - 1405, 213, 213, 213, 213, 213, 213, 213, 1364, 1405, - 213, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, - 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, - 213, 213, 1405, 213, 213, 213, 1364, 1405, 213, 213, - - 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 1365, 213, 1405, - 1405, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, - 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, - 213, 213, 1405, 1405, 213, 1365, 213, 1405, 1405, 213, - 213, 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, - 213, 1405, 1405, 213, 1405, 213, 1366, 213, 1405, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, - 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, - 213, 213, 1405, 1405, 1366, 1405, 213, 213, 213, 213, - - 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, - 1405, 1405, 1405, 213, 1405, 1374, 213, 213, 213, 213, - 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 213, 1405, - 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 1405, - 1405, 213, 213, 1374, 213, 1405, 1405, 1405, 213, 1405, - 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, - 213, 1405, 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, - 213, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 92, 1405, 1405, 92, 92, 92, 92, 92, 92, - 92, 98, 98, 1405, 98, 106, 106, 106, 192, 1405, - - 192, 192, 192, 192, 192, 192, 192, 194, 194, 194, - 1405, 194, 194, 194, 194, 194, 194, 196, 1405, 196, - 196, 196, 196, 196, 196, 196, 196, 199, 1405, 199, - 199, 199, 199, 199, 199, 199, 199, 213, 1405, 213, - 213, 213, 213, 213, 213, 213, 213, 299, 1405, 299, - 299, 299, 299, 299, 299, 299, 299, 96, 1405, 96, - 304, 1405, 304, 307, 1405, 307, 575, 1405, 575, 577, - 1405, 577, 7, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405 - } ; - -static const flex_int16_t yy_chk[9253] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, - 10, 10, 16, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 16, 18, 19, 19, 19, 21, 21, - 23, 1402, 24, 1401, 23, 1400, 31, 32, 1399, 24, - 23, 1397, 18, 51, 51, 1395, 24, 44, 44, 24, - - 23, 1393, 24, 1391, 26, 25, 26, 1389, 23, 25, - 24, 26, 23, 25, 31, 32, 26, 24, 23, 25, - 18, 22, 25, 22, 24, 44, 44, 24, 23, 22, - 24, 22, 26, 25, 26, 22, 22, 25, 1387, 26, - 28, 25, 45, 1385, 26, 58, 28, 25, 1383, 22, - 25, 22, 29, 52, 52, 1381, 58, 22, 37, 22, - 29, 63, 63, 22, 22, 27, 29, 33, 28, 37, - 45, 33, 1379, 27, 28, 37, 27, 33, 96, 27, - 29, 97, 27, 30, 107, 27, 37, 1377, 29, 30, - 30, 30, 1375, 27, 29, 33, 30, 37, 34, 33, - - 35, 27, 34, 37, 27, 33, 96, 27, 34, 97, - 27, 30, 107, 27, 35, 90, 90, 30, 30, 30, - 35, 35, 1371, 36, 30, 1367, 34, 1360, 35, 39, - 34, 36, 43, 39, 108, 36, 34, 39, 36, 36, - 43, 111, 35, 39, 1353, 42, 1339, 42, 35, 35, - 42, 36, 61, 61, 61, 99, 99, 39, 98, 36, - 43, 39, 108, 36, 1325, 39, 36, 36, 43, 111, - 1301, 39, 40, 42, 40, 42, 98, 40, 42, 112, - 40, 114, 40, 115, 40, 40, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 1277, 118, 109, 1231, - - 40, 1185, 40, 1110, 98, 40, 109, 112, 40, 114, - 40, 115, 40, 40, 41, 1035, 121, 70, 41, 70, - 125, 41, 41, 70, 70, 118, 109, 110, 41, 70, - 110, 41, 197, 197, 109, 303, 303, 305, 305, 1193, - 1193, 936, 41, 120, 121, 70, 41, 70, 125, 41, - 41, 70, 70, 120, 126, 110, 41, 70, 110, 41, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 120, 127, 128, 128, 837, 113, 113, 60, 1326, - 1326, 120, 126, 705, 573, 438, 302, 299, 208, 202, - 113, 199, 119, 119, 119, 71, 119, 192, 129, 71, - - 127, 128, 128, 71, 113, 113, 60, 64, 64, 71, - 64, 64, 64, 64, 64, 64, 64, 64, 113, 71, - 119, 119, 119, 71, 119, 117, 129, 71, 64, 64, - 64, 71, 117, 122, 64, 73, 64, 71, 122, 73, - 131, 132, 64, 133, 64, 73, 134, 71, 64, 64, - 101, 135, 134, 117, 95, 73, 136, 92, 64, 89, - 117, 122, 64, 73, 64, 88, 122, 73, 131, 132, - 64, 133, 64, 73, 134, 137, 64, 64, 74, 135, - 134, 62, 74, 73, 136, 64, 65, 65, 74, 65, - 65, 65, 65, 65, 65, 65, 65, 56, 74, 138, - - 54, 75, 140, 137, 53, 75, 74, 65, 65, 65, - 74, 75, 141, 143, 65, 76, 74, 144, 65, 76, - 49, 75, 146, 147, 65, 76, 74, 138, 80, 75, - 140, 148, 80, 75, 65, 76, 47, 65, 80, 75, - 141, 143, 65, 76, 20, 144, 65, 76, 80, 75, - 146, 147, 65, 76, 14, 139, 80, 11, 139, 148, - 80, 7, 65, 76, 65, 66, 80, 81, 4, 66, - 149, 81, 66, 66, 3, 81, 80, 152, 150, 66, - 150, 81, 66, 139, 0, 66, 139, 153, 85, 66, - 0, 81, 85, 66, 0, 81, 85, 66, 149, 81, - - 66, 66, 85, 81, 0, 152, 150, 66, 150, 81, - 66, 155, 85, 66, 0, 153, 85, 66, 67, 81, - 85, 84, 67, 84, 85, 84, 67, 154, 84, 157, - 85, 156, 67, 84, 156, 67, 0, 154, 158, 155, - 85, 0, 67, 0, 159, 0, 67, 0, 161, 84, - 67, 84, 0, 84, 67, 154, 84, 157, 0, 156, - 67, 84, 156, 67, 86, 154, 158, 86, 86, 87, - 67, 68, 159, 87, 86, 68, 161, 162, 68, 87, - 68, 68, 124, 124, 86, 68, 124, 163, 164, 87, - 68, 68, 86, 0, 165, 86, 86, 87, 0, 68, - - 0, 87, 86, 68, 0, 162, 68, 87, 68, 68, - 124, 124, 86, 68, 124, 163, 164, 87, 68, 68, - 69, 123, 165, 123, 167, 169, 123, 69, 69, 0, - 171, 69, 123, 0, 69, 174, 175, 69, 166, 123, - 69, 0, 166, 176, 130, 177, 130, 0, 69, 123, - 130, 123, 167, 169, 123, 69, 69, 130, 171, 69, - 123, 130, 69, 174, 175, 69, 166, 123, 69, 72, - 166, 176, 130, 177, 130, 72, 72, 72, 130, 151, - 178, 151, 72, 145, 180, 130, 0, 72, 0, 130, - 0, 0, 151, 145, 0, 0, 0, 72, 145, 145, - - 0, 168, 0, 72, 72, 72, 168, 151, 178, 151, - 72, 145, 180, 170, 168, 72, 77, 179, 173, 168, - 151, 145, 172, 77, 170, 181, 145, 145, 179, 168, - 77, 172, 173, 77, 168, 182, 77, 77, 0, 172, - 0, 170, 168, 0, 77, 179, 173, 168, 183, 185, - 172, 77, 170, 181, 186, 0, 179, 188, 77, 172, - 173, 77, 184, 182, 77, 77, 78, 172, 183, 184, - 188, 78, 184, 78, 189, 187, 183, 185, 190, 78, - 78, 187, 186, 78, 191, 188, 78, 78, 0, 0, - 184, 0, 0, 0, 78, 0, 183, 184, 188, 78, - - 184, 78, 189, 187, 304, 0, 190, 78, 78, 187, - 0, 78, 191, 0, 78, 78, 79, 224, 213, 224, - 214, 214, 213, 79, 224, 214, 310, 79, 213, 224, - 79, 214, 304, 79, 312, 313, 79, 0, 213, 0, - 315, 214, 0, 0, 79, 224, 213, 224, 214, 214, - 213, 79, 224, 214, 310, 79, 213, 224, 79, 214, - 317, 79, 312, 313, 79, 82, 213, 82, 315, 214, - 82, 82, 0, 82, 216, 82, 216, 82, 82, 0, - 222, 216, 216, 0, 222, 318, 216, 82, 317, 0, - 222, 0, 0, 82, 0, 82, 0, 0, 82, 82, - - 222, 82, 216, 82, 216, 82, 82, 215, 222, 216, - 216, 215, 222, 318, 216, 82, 83, 215, 222, 218, - 83, 218, 215, 83, 83, 218, 218, 215, 222, 319, - 83, 218, 320, 83, 321, 215, 322, 324, 325, 215, - 83, 0, 0, 0, 83, 215, 0, 218, 83, 218, - 215, 83, 83, 218, 218, 215, 326, 319, 83, 218, - 320, 83, 321, 0, 322, 324, 325, 0, 83, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 0, - 327, 328, 0, 0, 326, 329, 203, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 330, 232, 234, - - 232, 234, 331, 332, 0, 232, 234, 232, 327, 328, - 232, 234, 333, 329, 203, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 330, 232, 234, 232, 234, - 331, 332, 204, 232, 234, 232, 0, 0, 232, 234, - 333, 0, 0, 0, 334, 238, 239, 238, 239, 335, - 336, 0, 238, 239, 338, 339, 340, 238, 239, 0, - 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 334, 238, 239, 238, 239, 335, 336, 205, - 238, 239, 338, 339, 340, 238, 239, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 0, 342, 0, - - 0, 343, 0, 0, 0, 0, 0, 205, 206, 206, - 0, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 217, 219, 221, 217, 323, 342, 323, 221, 343, - 221, 219, 217, 219, 217, 221, 344, 223, 219, 217, - 221, 223, 323, 219, 217, 0, 0, 223, 345, 217, - 219, 221, 217, 323, 0, 323, 221, 223, 221, 219, - 217, 219, 217, 221, 344, 223, 219, 217, 221, 223, - 323, 219, 217, 220, 220, 223, 345, 225, 347, 220, - 348, 220, 337, 349, 350, 223, 220, 220, 225, 0, - 225, 220, 351, 0, 0, 225, 352, 337, 0, 0, - - 225, 220, 220, 0, 0, 225, 347, 220, 348, 220, - 337, 349, 350, 0, 220, 220, 225, 227, 225, 220, - 351, 227, 228, 225, 352, 337, 228, 227, 225, 226, - 226, 226, 228, 226, 0, 228, 226, 227, 353, 0, - 354, 226, 228, 355, 0, 227, 356, 358, 359, 227, - 228, 360, 229, 0, 228, 227, 229, 226, 226, 226, - 228, 226, 229, 228, 226, 227, 353, 229, 354, 226, - 228, 355, 229, 0, 356, 358, 359, 233, 0, 360, - 229, 233, 361, 236, 229, 0, 0, 233, 362, 0, - 229, 0, 236, 363, 236, 229, 0, 233, 240, 236, - - 229, 230, 240, 230, 236, 233, 230, 364, 240, 233, - 361, 236, 230, 242, 230, 233, 362, 242, 240, 230, - 236, 363, 236, 242, 230, 233, 240, 236, 0, 230, - 240, 230, 236, 242, 230, 364, 240, 0, 365, 366, - 230, 242, 230, 367, 368, 242, 240, 230, 357, 369, - 370, 242, 230, 231, 372, 231, 357, 373, 375, 231, - 231, 242, 241, 231, 241, 231, 365, 366, 241, 241, - 376, 367, 368, 0, 241, 0, 357, 369, 370, 371, - 0, 231, 372, 231, 357, 373, 375, 231, 231, 371, - 241, 231, 241, 231, 235, 235, 241, 241, 376, 243, - - 377, 243, 241, 235, 244, 235, 243, 371, 244, 378, - 235, 243, 380, 381, 244, 235, 0, 371, 0, 382, - 379, 0, 235, 235, 244, 384, 385, 243, 377, 243, - 379, 235, 244, 235, 243, 387, 244, 378, 235, 243, - 380, 381, 244, 235, 237, 245, 237, 382, 379, 245, - 237, 0, 244, 384, 385, 245, 237, 237, 379, 388, - 0, 237, 0, 387, 389, 245, 237, 0, 247, 246, - 247, 246, 237, 245, 237, 247, 246, 245, 237, 246, - 247, 246, 0, 245, 237, 237, 390, 388, 249, 237, - 249, 0, 389, 245, 237, 249, 247, 246, 247, 246, - - 249, 250, 0, 247, 246, 250, 391, 246, 247, 246, - 248, 250, 248, 253, 390, 253, 249, 248, 249, 248, - 253, 250, 248, 249, 392, 253, 251, 393, 249, 250, - 251, 0, 0, 250, 391, 395, 251, 251, 248, 250, - 248, 253, 0, 253, 0, 248, 251, 248, 253, 250, - 248, 0, 392, 253, 251, 393, 254, 0, 251, 394, - 254, 0, 0, 395, 251, 251, 254, 0, 0, 255, - 260, 397, 260, 255, 251, 252, 254, 260, 394, 255, - 398, 399, 260, 252, 254, 252, 400, 394, 254, 255, - 252, 252, 256, 256, 254, 252, 256, 255, 260, 397, - - 260, 255, 256, 252, 254, 260, 394, 255, 398, 399, - 260, 252, 256, 252, 400, 0, 396, 255, 252, 252, - 256, 256, 401, 252, 256, 259, 402, 259, 261, 396, - 256, 259, 259, 0, 403, 404, 261, 259, 261, 405, - 256, 257, 406, 261, 396, 257, 407, 257, 261, 257, - 401, 257, 408, 259, 402, 259, 261, 396, 0, 259, - 259, 257, 403, 404, 261, 259, 261, 405, 410, 257, - 406, 261, 411, 257, 407, 257, 261, 257, 412, 257, - 408, 413, 414, 415, 416, 0, 262, 417, 262, 257, - 258, 418, 258, 262, 262, 264, 410, 264, 262, 419, - - 411, 258, 264, 258, 420, 422, 412, 264, 258, 413, - 414, 415, 416, 258, 262, 417, 262, 0, 258, 418, - 258, 262, 262, 264, 0, 264, 262, 419, 423, 258, - 264, 258, 420, 422, 265, 264, 258, 423, 0, 0, - 424, 258, 263, 0, 263, 265, 0, 265, 0, 263, - 263, 0, 265, 263, 263, 0, 423, 265, 266, 425, - 426, 425, 265, 0, 266, 423, 266, 267, 424, 267, - 263, 266, 263, 265, 267, 265, 266, 263, 263, 267, - 265, 263, 263, 268, 427, 265, 266, 425, 426, 425, - 0, 268, 266, 268, 266, 267, 428, 267, 268, 266, - - 429, 430, 267, 268, 266, 270, 269, 267, 269, 270, - 431, 268, 427, 269, 269, 270, 432, 0, 269, 268, - 0, 268, 0, 0, 428, 270, 268, 0, 429, 430, - 0, 268, 434, 270, 269, 271, 269, 270, 431, 271, - 435, 269, 269, 270, 432, 271, 269, 433, 271, 578, - 272, 433, 273, 270, 272, 271, 273, 579, 272, 274, - 434, 274, 273, 271, 272, 580, 274, 271, 435, 581, - 582, 274, 273, 271, 272, 433, 271, 578, 272, 433, - 273, 583, 272, 271, 273, 579, 272, 274, 0, 274, - 273, 584, 272, 580, 274, 0, 0, 581, 582, 274, - - 273, 0, 272, 275, 585, 276, 0, 586, 275, 583, - 276, 0, 276, 277, 275, 277, 275, 276, 588, 584, - 277, 275, 276, 278, 277, 277, 275, 278, 591, 278, - 592, 275, 585, 276, 278, 586, 275, 593, 276, 278, - 276, 277, 275, 277, 275, 276, 588, 0, 277, 275, - 276, 278, 277, 277, 275, 278, 591, 278, 592, 594, - 596, 0, 278, 0, 597, 593, 280, 278, 279, 598, - 280, 281, 599, 601, 280, 281, 602, 279, 0, 279, - 280, 281, 0, 0, 279, 279, 0, 594, 596, 279, - 280, 281, 597, 0, 280, 603, 279, 598, 280, 281, - - 599, 601, 280, 281, 602, 279, 282, 279, 280, 281, - 282, 283, 279, 279, 282, 283, 604, 279, 280, 281, - 282, 283, 285, 603, 283, 285, 605, 0, 0, 285, - 282, 283, 284, 0, 282, 285, 284, 0, 282, 283, - 284, 606, 282, 283, 604, 285, 284, 607, 282, 283, - 285, 287, 283, 285, 605, 287, 284, 285, 282, 283, - 284, 287, 608, 285, 284, 286, 286, 286, 284, 606, - 0, 287, 286, 285, 284, 607, 0, 286, 288, 287, - 609, 289, 288, 287, 284, 289, 288, 612, 288, 287, - 608, 289, 289, 286, 286, 286, 0, 613, 288, 287, - - 286, 289, 614, 615, 290, 286, 288, 616, 609, 289, - 288, 290, 617, 289, 288, 612, 288, 618, 290, 289, - 289, 290, 292, 292, 290, 613, 288, 292, 0, 289, - 614, 615, 290, 292, 619, 616, 621, 293, 0, 290, - 617, 293, 622, 292, 623, 618, 290, 293, 0, 290, - 292, 292, 290, 291, 0, 292, 291, 293, 0, 0, - 291, 292, 619, 291, 621, 293, 291, 624, 0, 293, - 622, 292, 623, 627, 0, 293, 291, 628, 0, 0, - 294, 291, 294, 630, 291, 293, 294, 294, 291, 295, - 0, 291, 294, 295, 291, 624, 296, 0, 0, 295, - - 296, 627, 295, 297, 291, 628, 296, 297, 294, 295, - 294, 630, 632, 297, 294, 294, 296, 295, 297, 633, - 294, 295, 445, 297, 296, 298, 445, 295, 296, 298, - 295, 297, 445, 298, 296, 297, 449, 295, 449, 298, - 632, 297, 445, 449, 296, 634, 297, 633, 449, 298, - 445, 297, 635, 298, 445, 0, 0, 298, 0, 0, - 445, 298, 0, 0, 449, 0, 449, 298, 0, 0, - 445, 449, 0, 634, 636, 637, 449, 298, 439, 439, - 635, 439, 439, 439, 439, 439, 439, 439, 439, 439, - 439, 440, 440, 440, 440, 440, 440, 440, 440, 440, - - 440, 640, 636, 637, 644, 646, 647, 649, 440, 442, - 442, 442, 442, 442, 442, 442, 442, 442, 442, 443, - 443, 443, 443, 443, 443, 443, 443, 443, 443, 640, - 651, 0, 644, 646, 647, 649, 440, 441, 441, 652, - 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, - 446, 447, 448, 0, 446, 447, 448, 450, 651, 450, - 446, 447, 448, 451, 450, 653, 0, 652, 0, 450, - 446, 447, 448, 0, 451, 0, 451, 0, 446, 447, - 448, 451, 446, 447, 448, 450, 451, 450, 446, 447, - 448, 451, 450, 653, 452, 0, 452, 450, 446, 447, - - 448, 452, 451, 453, 451, 638, 452, 453, 454, 451, - 0, 0, 454, 453, 451, 0, 638, 655, 454, 656, - 0, 0, 452, 453, 452, 457, 657, 457, 454, 452, - 0, 453, 457, 638, 452, 453, 454, 457, 456, 455, - 454, 453, 456, 455, 638, 655, 454, 656, 456, 455, - 0, 453, 658, 457, 657, 457, 454, 455, 456, 455, - 457, 458, 0, 458, 660, 457, 456, 455, 458, 661, - 456, 455, 0, 458, 0, 0, 456, 455, 650, 650, - 658, 663, 0, 0, 664, 455, 456, 455, 665, 458, - 460, 458, 660, 666, 460, 461, 458, 661, 668, 461, - - 460, 458, 459, 460, 459, 461, 650, 650, 459, 663, - 460, 461, 664, 0, 459, 461, 665, 0, 460, 459, - 0, 666, 460, 461, 459, 669, 668, 461, 460, 670, - 459, 460, 459, 461, 671, 0, 459, 672, 460, 461, - 462, 463, 459, 461, 462, 463, 0, 459, 462, 0, - 462, 463, 459, 669, 464, 674, 463, 670, 464, 0, - 462, 463, 671, 465, 464, 672, 0, 465, 462, 463, - 675, 465, 462, 463, 464, 676, 462, 465, 462, 463, - 677, 0, 464, 674, 463, 0, 464, 465, 462, 463, - 680, 465, 464, 681, 466, 465, 466, 682, 675, 465, - - 468, 466, 464, 676, 468, 465, 466, 467, 677, 467, - 468, 683, 684, 467, 467, 465, 0, 0, 680, 467, - 468, 681, 466, 0, 466, 682, 687, 0, 468, 466, - 688, 0, 468, 690, 466, 467, 691, 467, 468, 683, - 684, 467, 467, 469, 470, 469, 470, 467, 468, 471, - 469, 470, 692, 471, 687, 469, 470, 0, 688, 471, - 693, 690, 472, 694, 691, 695, 472, 0, 0, 471, - 472, 469, 470, 469, 470, 696, 472, 471, 469, 470, - 692, 471, 0, 469, 470, 473, 472, 471, 693, 473, - 472, 694, 475, 695, 472, 473, 475, 471, 472, 697, - - 473, 0, 475, 696, 472, 473, 477, 0, 0, 474, - 477, 474, 475, 473, 472, 474, 477, 473, 698, 0, - 475, 474, 478, 473, 475, 478, 477, 697, 473, 478, - 475, 474, 476, 473, 477, 478, 476, 474, 477, 474, - 475, 700, 476, 474, 477, 478, 698, 476, 702, 474, - 478, 479, 476, 478, 477, 479, 704, 478, 0, 474, - 476, 479, 479, 478, 476, 840, 842, 844, 480, 700, - 476, 479, 480, 478, 0, 476, 702, 481, 480, 479, - 476, 481, 482, 479, 704, 845, 482, 481, 480, 479, - 479, 846, 482, 840, 842, 844, 480, 481, 847, 479, - - 480, 848, 482, 483, 0, 481, 480, 483, 484, 481, - 482, 483, 484, 845, 482, 481, 480, 483, 484, 846, - 482, 849, 850, 851, 852, 481, 847, 483, 484, 848, - 482, 483, 485, 0, 485, 483, 484, 854, 485, 483, - 484, 486, 855, 486, 485, 483, 484, 856, 486, 849, - 850, 851, 852, 486, 485, 483, 484, 0, 0, 857, - 485, 487, 485, 487, 858, 854, 485, 0, 487, 486, - 855, 486, 485, 487, 859, 856, 486, 0, 488, 861, - 488, 486, 485, 862, 488, 488, 489, 857, 489, 487, - 488, 487, 858, 489, 863, 490, 487, 864, 489, 490, - - 0, 487, 859, 0, 865, 490, 488, 861, 488, 866, - 867, 862, 488, 488, 489, 490, 489, 0, 488, 868, - 491, 489, 863, 490, 491, 864, 489, 490, 491, 492, - 0, 492, 865, 490, 491, 869, 492, 866, 867, 870, - 871, 492, 0, 490, 491, 493, 874, 868, 491, 493, - 494, 0, 491, 493, 494, 493, 491, 492, 494, 492, - 494, 0, 491, 869, 492, 493, 875, 870, 871, 492, - 494, 876, 491, 493, 874, 877, 0, 493, 494, 496, - 878, 493, 494, 493, 0, 495, 494, 495, 494, 496, - 0, 496, 495, 493, 875, 0, 496, 495, 494, 876, - - 0, 496, 497, 877, 497, 879, 882, 496, 878, 497, - 885, 497, 498, 495, 497, 495, 498, 496, 498, 496, - 495, 0, 886, 498, 496, 495, 0, 0, 498, 496, - 497, 888, 497, 879, 882, 0, 891, 497, 885, 497, - 498, 894, 497, 499, 498, 500, 498, 499, 501, 500, - 886, 498, 501, 499, 887, 500, 498, 887, 501, 888, - 500, 501, 895, 499, 891, 500, 0, 0, 501, 894, - 0, 499, 0, 500, 896, 499, 501, 500, 897, 0, - 501, 499, 887, 500, 898, 887, 501, 0, 500, 501, - 895, 499, 0, 500, 502, 503, 501, 504, 502, 503, - - 502, 504, 896, 899, 502, 503, 897, 504, 902, 0, - 0, 903, 898, 0, 502, 503, 0, 504, 904, 0, - 505, 905, 502, 503, 505, 504, 502, 503, 502, 504, - 505, 899, 502, 503, 506, 504, 902, 507, 506, 903, - 505, 507, 502, 503, 506, 504, 904, 507, 505, 905, - 906, 508, 505, 0, 506, 508, 908, 507, 505, 909, - 910, 508, 506, 0, 912, 507, 506, 508, 505, 507, - 0, 508, 506, 913, 509, 507, 509, 0, 906, 508, - 914, 509, 506, 508, 908, 507, 509, 909, 910, 508, - 512, 510, 912, 510, 512, 508, 915, 917, 510, 508, - - 512, 913, 509, 510, 509, 511, 918, 511, 914, 509, - 512, 919, 511, 511, 509, 920, 921, 511, 512, 510, - 922, 510, 512, 0, 915, 917, 510, 923, 512, 0, - 924, 510, 513, 511, 918, 511, 513, 0, 512, 919, - 511, 511, 513, 920, 921, 511, 514, 514, 922, 925, - 927, 514, 513, 0, 928, 923, 929, 514, 924, 931, - 513, 516, 932, 516, 513, 516, 933, 514, 0, 1036, - 513, 516, 0, 0, 514, 514, 0, 925, 927, 514, - 513, 516, 928, 0, 929, 514, 0, 931, 1038, 516, - 932, 516, 0, 516, 933, 514, 515, 1036, 518, 516, - - 515, 517, 518, 517, 515, 517, 515, 0, 518, 516, - 515, 517, 0, 0, 518, 519, 1038, 0, 518, 519, - 515, 517, 0, 0, 515, 519, 518, 0, 515, 517, - 518, 517, 515, 517, 515, 519, 518, 1040, 515, 517, - 520, 521, 518, 519, 520, 521, 518, 519, 515, 517, - 520, 521, 1041, 519, 522, 520, 1042, 521, 522, 1043, - 520, 521, 1045, 519, 522, 1040, 0, 523, 520, 521, - 0, 523, 520, 521, 522, 523, 0, 0, 520, 521, - 1041, 523, 522, 520, 1042, 521, 522, 1043, 520, 521, - 1045, 523, 522, 0, 524, 523, 524, 1047, 525, 523, - - 525, 524, 522, 523, 525, 525, 524, 1048, 1049, 523, - 525, 526, 0, 526, 1050, 0, 0, 527, 526, 523, - 1051, 527, 524, 526, 524, 1047, 525, 527, 525, 524, - 1053, 1055, 525, 525, 524, 1048, 1049, 527, 525, 526, - 528, 526, 1050, 529, 528, 527, 526, 529, 1051, 527, - 528, 526, 1057, 529, 1060, 527, 529, 1062, 1053, 1055, - 528, 0, 1063, 529, 0, 527, 1064, 531, 528, 531, - 1065, 529, 528, 1072, 531, 529, 0, 0, 528, 531, - 1057, 529, 1060, 0, 529, 1062, 1073, 0, 528, 536, - 1063, 529, 530, 536, 1064, 531, 530, 531, 1065, 536, - - 530, 1072, 531, 533, 533, 533, 530, 531, 1074, 536, - 533, 530, 0, 1077, 1073, 533, 530, 536, 1079, 0, - 530, 536, 0, 1081, 530, 1083, 0, 536, 530, 1084, - 0, 533, 533, 533, 530, 534, 1074, 536, 533, 530, - 534, 1077, 534, 533, 530, 532, 1079, 534, 535, 0, - 535, 1081, 534, 1083, 532, 535, 532, 1084, 532, 1085, - 535, 532, 1086, 534, 0, 1087, 532, 1088, 534, 1090, - 534, 1091, 1092, 532, 0, 534, 535, 537, 535, 0, - 534, 537, 532, 535, 532, 537, 532, 1085, 535, 532, - 1086, 537, 538, 1087, 532, 1088, 538, 1090, 1093, 1091, - - 1092, 537, 538, 0, 0, 537, 1095, 538, 1097, 537, - 1099, 539, 538, 537, 539, 539, 540, 1100, 540, 537, - 538, 539, 1101, 540, 538, 541, 1093, 541, 540, 537, - 538, 539, 541, 0, 1095, 538, 1097, 541, 1099, 539, - 538, 1102, 539, 539, 540, 1100, 540, 0, 542, 539, - 1101, 540, 542, 541, 0, 541, 540, 543, 542, 539, - 541, 543, 544, 0, 0, 541, 544, 543, 542, 1102, - 0, 545, 544, 0, 0, 545, 542, 543, 0, 0, - 542, 545, 544, 0, 0, 543, 542, 1103, 546, 543, - 544, 545, 546, 0, 544, 543, 542, 0, 546, 545, - - 544, 546, 548, 545, 1108, 543, 548, 547, 546, 545, - 544, 547, 548, 548, 1109, 1103, 546, 547, 1190, 545, - 546, 549, 548, 549, 0, 547, 546, 547, 549, 546, - 548, 0, 1108, 549, 548, 547, 546, 0, 0, 547, - 548, 548, 1109, 0, 0, 547, 1190, 0, 0, 549, - 548, 549, 550, 547, 550, 547, 549, 0, 1194, 550, - 550, 549, 0, 551, 550, 551, 552, 0, 552, 1195, - 551, 551, 553, 552, 553, 551, 553, 1198, 552, 553, - 550, 1199, 550, 555, 553, 555, 1194, 550, 550, 0, - 555, 551, 550, 551, 552, 555, 552, 1195, 551, 551, - - 553, 552, 553, 551, 553, 1198, 552, 553, 554, 1199, - 554, 555, 553, 555, 0, 554, 554, 556, 555, 0, - 554, 556, 557, 555, 0, 1200, 557, 556, 558, 0, - 558, 0, 557, 0, 1204, 558, 554, 556, 554, 0, - 558, 1207, 557, 554, 554, 556, 1208, 560, 554, 556, - 557, 560, 559, 1200, 557, 556, 558, 560, 558, 559, - 557, 559, 1204, 558, 0, 556, 559, 560, 558, 1207, - 557, 559, 561, 562, 1208, 560, 561, 562, 1211, 560, - 559, 0, 561, 562, 561, 560, 1212, 559, 1213, 559, - 0, 1214, 561, 562, 559, 560, 564, 1217, 564, 559, - - 561, 562, 1218, 564, 561, 562, 1211, 1219, 564, 563, - 561, 562, 561, 563, 1212, 1222, 1213, 563, 566, 1214, - 561, 562, 1224, 563, 564, 1217, 564, 566, 712, 566, - 1218, 564, 712, 563, 566, 1219, 564, 563, 712, 566, - 565, 563, 565, 1222, 1225, 563, 566, 565, 712, 565, - 1224, 563, 565, 0, 0, 566, 712, 566, 0, 0, - 712, 563, 566, 0, 0, 1226, 712, 566, 565, 1227, - 565, 567, 1225, 567, 1228, 565, 712, 565, 567, 568, - 565, 568, 567, 567, 1278, 1281, 568, 568, 569, 1285, - 569, 568, 570, 1226, 569, 569, 570, 1227, 570, 567, - - 569, 567, 1228, 570, 1286, 0, 567, 568, 570, 568, - 567, 567, 1278, 1281, 568, 568, 569, 1285, 569, 568, - 570, 0, 569, 569, 570, 1289, 570, 571, 569, 571, - 1290, 570, 1286, 571, 571, 1291, 570, 1292, 1296, 571, - 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, - 0, 0, 0, 1289, 0, 571, 0, 571, 1290, 0, - 0, 571, 571, 1291, 0, 1292, 1296, 571, 575, 575, - 575, 575, 575, 575, 575, 575, 575, 575, 576, 576, - 576, 576, 576, 576, 576, 576, 576, 576, 577, 577, - 577, 577, 577, 577, 577, 577, 577, 577, 706, 706, - - 706, 706, 706, 706, 706, 706, 706, 706, 707, 707, - 707, 707, 707, 707, 707, 707, 707, 707, 708, 708, - 708, 708, 708, 708, 708, 708, 708, 708, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 709, 710, 1297, - 710, 711, 713, 711, 710, 710, 713, 711, 711, 1298, - 710, 0, 713, 711, 1279, 1279, 0, 1300, 0, 1327, - 1328, 0, 713, 0, 0, 0, 710, 1297, 710, 711, - 713, 711, 710, 710, 713, 711, 711, 1298, 710, 714, - 713, 711, 0, 714, 715, 1300, 715, 1327, 1328, 714, - 713, 715, 714, 716, 1279, 1331, 715, 716, 717, 714, - - 717, 1334, 0, 716, 0, 717, 0, 714, 0, 1337, - 717, 714, 715, 716, 715, 1303, 1303, 714, 1341, 715, - 714, 716, 1279, 1331, 715, 716, 717, 714, 717, 1334, - 718, 716, 719, 717, 718, 720, 719, 1337, 717, 720, - 718, 716, 719, 720, 1354, 1354, 1341, 0, 0, 720, - 718, 1355, 719, 1359, 0, 1303, 1362, 0, 718, 720, - 719, 1368, 718, 720, 719, 721, 0, 720, 718, 721, - 719, 720, 722, 1361, 1361, 721, 722, 720, 718, 1355, - 719, 1359, 722, 1303, 1362, 721, 724, 720, 1354, 1368, - 724, 723, 722, 721, 724, 723, 724, 721, 0, 723, - - 722, 1372, 0, 721, 722, 723, 724, 0, 0, 0, - 722, 0, 1376, 721, 724, 723, 1354, 1361, 724, 723, - 722, 725, 724, 723, 724, 725, 726, 723, 727, 1372, - 726, 725, 727, 723, 724, 729, 726, 729, 727, 726, - 1376, 725, 729, 723, 0, 1361, 726, 729, 727, 725, - 0, 1378, 1380, 725, 726, 0, 727, 1382, 726, 725, - 727, 1384, 1386, 729, 726, 729, 727, 726, 728, 725, - 729, 1388, 728, 1390, 726, 729, 727, 730, 728, 1378, - 1380, 730, 1392, 728, 0, 1382, 0, 730, 728, 1384, - 1386, 0, 1394, 0, 0, 0, 728, 730, 731, 1388, - - 728, 1390, 731, 0, 0, 730, 728, 0, 731, 730, - 1392, 728, 733, 731, 733, 730, 728, 732, 731, 733, - 1394, 732, 0, 0, 733, 730, 731, 732, 0, 0, - 731, 734, 734, 734, 0, 0, 731, 732, 734, 0, - 733, 731, 733, 734, 0, 732, 731, 733, 0, 732, - 0, 0, 733, 0, 0, 732, 736, 0, 736, 734, - 734, 734, 737, 736, 736, 732, 734, 735, 736, 735, - 0, 734, 0, 737, 735, 737, 735, 0, 0, 735, - 737, 738, 0, 738, 736, 737, 736, 738, 738, 739, - 737, 736, 736, 738, 0, 735, 736, 735, 739, 0, - - 739, 737, 735, 737, 735, 739, 0, 735, 737, 738, - 739, 738, 0, 737, 740, 738, 738, 739, 740, 0, - 741, 738, 741, 742, 740, 742, 739, 741, 739, 743, - 742, 743, 741, 739, 740, 742, 743, 0, 739, 0, - 0, 743, 740, 0, 0, 0, 740, 0, 741, 0, - 741, 742, 740, 742, 0, 741, 0, 743, 742, 743, - 741, 0, 740, 742, 743, 744, 0, 0, 0, 743, - 745, 0, 745, 744, 745, 744, 0, 745, 0, 746, - 744, 746, 745, 746, 0, 744, 746, 747, 0, 747, - 0, 746, 0, 744, 747, 0, 747, 0, 745, 747, - - 745, 744, 745, 744, 0, 745, 0, 746, 744, 746, - 745, 746, 0, 744, 746, 747, 0, 747, 748, 746, - 748, 749, 747, 0, 747, 748, 748, 747, 0, 750, - 748, 751, 749, 0, 749, 751, 0, 0, 0, 749, - 750, 751, 750, 0, 749, 0, 748, 750, 748, 749, - 0, 751, 750, 748, 748, 0, 0, 750, 748, 751, - 749, 752, 749, 751, 0, 752, 0, 749, 750, 751, - 750, 752, 749, 0, 0, 750, 0, 0, 0, 751, - 750, 752, 753, 0, 754, 0, 753, 0, 754, 752, - 0, 755, 753, 752, 754, 755, 0, 753, 0, 752, - - 0, 755, 753, 0, 754, 0, 0, 0, 0, 752, - 753, 755, 754, 756, 753, 0, 754, 756, 0, 755, - 753, 756, 754, 755, 757, 753, 0, 756, 757, 755, - 753, 0, 754, 0, 757, 0, 0, 756, 758, 755, - 0, 756, 758, 759, 757, 756, 0, 759, 758, 756, - 0, 759, 757, 0, 0, 756, 757, 759, 758, 0, - 0, 0, 757, 0, 0, 756, 758, 759, 0, 0, - 758, 759, 757, 760, 0, 759, 758, 760, 761, 759, - 0, 0, 761, 760, 760, 759, 758, 762, 761, 762, - 763, 0, 763, 760, 762, 759, 0, 763, 761, 762, - - 0, 760, 763, 0, 0, 760, 761, 764, 0, 764, - 761, 760, 760, 0, 764, 762, 761, 762, 763, 764, - 763, 760, 762, 0, 765, 763, 761, 762, 765, 0, - 763, 0, 0, 0, 765, 764, 767, 764, 767, 0, - 0, 766, 764, 767, 765, 766, 0, 764, 767, 0, - 0, 766, 765, 768, 766, 768, 765, 0, 0, 768, - 768, 766, 765, 0, 767, 768, 767, 0, 769, 766, - 769, 767, 765, 766, 769, 769, 767, 0, 0, 766, - 769, 768, 766, 768, 0, 0, 0, 768, 768, 766, - 779, 0, 0, 768, 779, 0, 769, 0, 769, 771, - - 779, 771, 769, 769, 0, 772, 771, 772, 769, 770, - 779, 771, 772, 0, 770, 0, 770, 772, 779, 0, - 770, 770, 779, 0, 0, 0, 770, 771, 779, 771, - 0, 0, 0, 772, 771, 772, 0, 770, 779, 771, - 772, 0, 770, 0, 770, 772, 0, 0, 770, 770, - 773, 774, 773, 774, 770, 0, 0, 773, 774, 775, - 0, 775, 773, 774, 0, 776, 775, 776, 0, 0, - 0, 775, 776, 776, 0, 0, 0, 776, 773, 774, - 773, 774, 0, 0, 0, 773, 774, 775, 0, 775, - 773, 774, 0, 776, 775, 776, 777, 0, 777, 775, - - 776, 776, 778, 777, 778, 776, 0, 780, 777, 778, - 0, 780, 0, 782, 778, 782, 0, 780, 781, 0, - 782, 782, 781, 0, 777, 782, 777, 780, 781, 0, - 778, 777, 778, 0, 0, 780, 777, 778, 781, 780, - 0, 782, 778, 782, 0, 780, 781, 0, 782, 782, - 781, 0, 0, 782, 783, 780, 781, 784, 783, 784, - 783, 0, 0, 784, 784, 783, 781, 0, 0, 784, - 783, 0, 0, 0, 785, 0, 0, 0, 785, 786, - 0, 0, 783, 786, 785, 784, 783, 784, 783, 786, - 0, 784, 784, 783, 785, 0, 0, 784, 783, 786, - - 788, 0, 785, 787, 788, 787, 785, 786, 0, 787, - 788, 786, 785, 0, 0, 787, 0, 786, 0, 0, - 788, 0, 785, 0, 0, 787, 789, 786, 788, 0, - 789, 787, 788, 787, 0, 0, 789, 787, 788, 789, - 0, 791, 0, 787, 0, 791, 789, 0, 788, 0, - 0, 791, 790, 787, 789, 0, 790, 0, 789, 0, - 0, 791, 790, 0, 789, 790, 793, 789, 0, 791, - 793, 0, 790, 791, 789, 0, 793, 792, 0, 791, - 790, 792, 0, 0, 790, 792, 793, 792, 0, 791, - 790, 794, 795, 790, 793, 794, 795, 792, 793, 0, - - 790, 794, 795, 0, 793, 792, 0, 0, 0, 792, - 0, 794, 795, 792, 793, 792, 0, 0, 796, 794, - 795, 0, 796, 794, 795, 792, 796, 797, 0, 794, - 795, 797, 796, 798, 0, 797, 0, 798, 0, 794, - 795, 797, 796, 798, 0, 0, 796, 0, 799, 0, - 796, 797, 799, 798, 796, 797, 0, 0, 799, 797, - 796, 798, 800, 797, 0, 798, 800, 0, 799, 797, - 796, 798, 800, 0, 0, 800, 799, 0, 0, 797, - 799, 798, 800, 0, 0, 801, 799, 803, 802, 801, - 800, 803, 802, 801, 800, 801, 799, 803, 802, 0, - - 800, 802, 803, 800, 0, 801, 0, 803, 802, 0, - 800, 804, 0, 801, 804, 803, 802, 801, 804, 803, - 802, 801, 0, 801, 804, 803, 802, 805, 0, 802, - 803, 805, 0, 801, 804, 803, 802, 805, 0, 804, - 806, 0, 804, 0, 806, 0, 804, 805, 806, 807, - 806, 807, 804, 809, 0, 805, 807, 809, 0, 805, - 806, 807, 804, 809, 0, 805, 0, 0, 806, 0, - 0, 808, 806, 809, 0, 805, 806, 807, 806, 807, - 808, 809, 808, 0, 807, 809, 810, 808, 806, 807, - 810, 809, 808, 811, 0, 0, 810, 811, 0, 808, - - 812, 809, 812, 811, 0, 0, 810, 812, 808, 0, - 808, 0, 812, 811, 810, 808, 0, 0, 810, 813, - 808, 811, 814, 813, 810, 811, 814, 0, 812, 813, - 812, 811, 814, 815, 810, 812, 0, 815, 0, 813, - 812, 811, 814, 815, 0, 0, 0, 813, 816, 0, - 814, 813, 816, 815, 814, 0, 0, 813, 816, 817, - 814, 815, 818, 817, 0, 815, 818, 813, 816, 817, - 814, 815, 818, 0, 0, 0, 816, 0, 0, 817, - 816, 815, 818, 0, 0, 0, 816, 817, 0, 0, - 818, 817, 0, 0, 818, 0, 816, 817, 0, 819, - - 818, 819, 820, 0, 820, 0, 819, 817, 0, 820, - 818, 819, 822, 821, 820, 821, 0, 0, 0, 0, - 821, 822, 0, 822, 0, 821, 0, 819, 822, 819, - 820, 0, 820, 822, 819, 0, 0, 820, 0, 819, - 822, 821, 820, 821, 0, 823, 0, 823, 821, 822, - 0, 822, 823, 821, 823, 0, 822, 823, 824, 0, - 824, 822, 825, 0, 825, 824, 826, 0, 0, 825, - 824, 825, 0, 823, 825, 823, 0, 826, 0, 826, - 823, 0, 823, 0, 826, 823, 824, 0, 824, 826, - 825, 0, 825, 824, 826, 0, 0, 825, 824, 825, - - 0, 827, 825, 827, 0, 826, 0, 826, 827, 827, - 829, 828, 826, 827, 829, 0, 828, 826, 828, 0, - 829, 0, 0, 828, 0, 0, 0, 0, 828, 827, - 829, 827, 0, 0, 0, 0, 827, 827, 829, 828, - 0, 827, 829, 0, 828, 0, 828, 0, 829, 830, - 831, 828, 830, 830, 831, 0, 828, 0, 829, 830, - 831, 0, 0, 832, 833, 0, 0, 832, 833, 830, - 831, 0, 0, 832, 833, 0, 0, 830, 831, 832, - 830, 830, 831, 832, 833, 0, 0, 830, 831, 834, - 835, 832, 833, 834, 835, 832, 833, 830, 831, 834, - - 835, 832, 833, 0, 0, 0, 0, 832, 0, 834, - 835, 832, 833, 836, 0, 836, 0, 834, 835, 0, - 836, 834, 835, 0, 937, 836, 937, 834, 835, 0, - 0, 937, 938, 939, 938, 939, 937, 834, 835, 938, - 939, 836, 0, 836, 938, 939, 941, 939, 836, 0, - 941, 0, 937, 836, 937, 0, 941, 0, 0, 937, - 938, 939, 938, 939, 937, 0, 941, 938, 939, 940, - 0, 940, 938, 939, 941, 939, 940, 0, 941, 0, - 0, 940, 942, 943, 941, 944, 942, 943, 0, 944, - 0, 0, 942, 943, 941, 944, 0, 940, 0, 940, - - 944, 0, 942, 943, 940, 944, 0, 0, 945, 940, - 942, 943, 945, 944, 942, 943, 945, 944, 0, 0, - 942, 943, 945, 944, 946, 946, 0, 0, 944, 946, - 942, 943, 945, 944, 0, 946, 945, 947, 0, 947, - 945, 0, 0, 947, 945, 946, 0, 0, 0, 947, - 945, 0, 946, 946, 948, 0, 948, 946, 0, 947, - 945, 948, 949, 946, 949, 947, 948, 947, 950, 949, - 949, 947, 950, 946, 949, 951, 0, 947, 950, 951, - 0, 0, 948, 0, 948, 951, 0, 947, 950, 948, - 949, 0, 949, 0, 948, 951, 950, 949, 949, 0, - - 950, 952, 949, 951, 0, 952, 950, 951, 953, 0, - 953, 952, 0, 951, 954, 953, 950, 0, 954, 0, - 953, 952, 0, 951, 954, 0, 0, 955, 0, 952, - 0, 955, 0, 952, 954, 0, 953, 955, 953, 952, - 0, 0, 954, 953, 0, 0, 954, 955, 953, 952, - 956, 0, 954, 0, 956, 955, 958, 0, 956, 955, - 958, 957, 954, 957, 956, 955, 958, 959, 957, 0, - 0, 959, 0, 957, 956, 955, 958, 959, 956, 0, - 0, 0, 956, 0, 958, 0, 956, 959, 958, 957, - 0, 957, 956, 960, 958, 959, 957, 960, 0, 959, - - 0, 957, 956, 960, 958, 959, 963, 961, 0, 0, - 963, 961, 962, 960, 962, 959, 963, 961, 0, 962, - 0, 960, 961, 0, 962, 960, 963, 961, 0, 0, - 0, 960, 0, 964, 963, 961, 0, 964, 963, 961, - 962, 960, 962, 964, 963, 961, 0, 962, 0, 0, - 961, 0, 962, 964, 963, 961, 965, 0, 966, 967, - 965, 964, 966, 967, 0, 964, 965, 0, 966, 967, - 968, 964, 968, 966, 967, 0, 965, 968, 966, 967, - 0, 964, 968, 0, 965, 0, 966, 967, 965, 969, - 966, 967, 0, 969, 965, 0, 966, 967, 968, 969, - - 968, 966, 967, 0, 965, 968, 966, 967, 0, 969, - 968, 0, 970, 0, 970, 971, 972, 969, 970, 971, - 972, 969, 0, 0, 970, 971, 972, 969, 0, 0, - 0, 0, 0, 0, 970, 971, 972, 969, 0, 0, - 970, 973, 970, 971, 972, 973, 970, 971, 972, 0, - 0, 973, 970, 971, 972, 0, 974, 0, 974, 973, - 974, 973, 970, 971, 972, 976, 974, 976, 0, 973, - 975, 0, 976, 973, 975, 0, 974, 976, 0, 973, - 975, 0, 0, 0, 974, 975, 974, 973, 974, 973, - 975, 0, 0, 976, 974, 976, 0, 0, 975, 977, - - 976, 977, 975, 0, 974, 976, 977, 978, 975, 0, - 0, 977, 978, 975, 978, 0, 0, 0, 975, 978, - 0, 979, 0, 979, 978, 0, 0, 977, 979, 977, - 0, 0, 0, 979, 977, 978, 980, 0, 980, 977, - 978, 0, 978, 980, 0, 0, 0, 978, 980, 979, - 0, 979, 978, 0, 0, 981, 979, 981, 982, 0, - 982, 979, 981, 981, 980, 982, 980, 981, 0, 0, - 982, 980, 983, 0, 983, 0, 980, 0, 0, 983, - 0, 0, 0, 981, 983, 981, 982, 0, 982, 0, - 981, 981, 0, 982, 0, 981, 0, 984, 982, 984, - - 983, 986, 983, 986, 984, 984, 985, 983, 986, 984, - 985, 986, 983, 986, 0, 0, 985, 0, 0, 0, - 0, 0, 0, 0, 0, 984, 985, 984, 987, 986, - 987, 986, 984, 984, 985, 987, 986, 984, 985, 986, - 987, 986, 0, 988, 985, 988, 0, 0, 0, 0, - 988, 0, 990, 0, 985, 988, 987, 989, 987, 989, - 990, 0, 990, 987, 989, 0, 0, 990, 987, 989, - 0, 988, 990, 988, 991, 0, 991, 992, 988, 992, - 990, 991, 0, 988, 992, 989, 991, 989, 990, 992, - 990, 0, 989, 0, 0, 990, 0, 989, 0, 0, - - 990, 994, 991, 994, 991, 992, 993, 992, 994, 991, - 993, 0, 992, 994, 991, 0, 993, 992, 0, 995, - 0, 0, 0, 0, 0, 0, 993, 0, 0, 994, - 995, 994, 995, 0, 993, 0, 994, 995, 993, 0, - 0, 994, 995, 996, 993, 996, 0, 995, 0, 0, - 996, 996, 0, 997, 993, 996, 0, 997, 995, 997, - 995, 0, 0, 0, 997, 995, 0, 0, 0, 997, - 995, 996, 0, 996, 0, 0, 0, 0, 996, 996, - 0, 997, 998, 996, 998, 997, 999, 997, 999, 998, - 998, 0, 997, 999, 998, 0, 0, 997, 999, 1000, - - 0, 1000, 0, 1001, 0, 1002, 1000, 1001, 0, 1002, - 998, 1000, 998, 1001, 999, 1002, 999, 998, 998, 0, - 1002, 999, 998, 1001, 0, 1002, 999, 1000, 0, 1000, - 0, 1001, 1006, 1002, 1000, 1001, 1006, 1002, 0, 1000, - 0, 1001, 1006, 1002, 1003, 1003, 1004, 0, 1002, 1003, - 1004, 1001, 1006, 1002, 0, 1003, 1004, 0, 0, 1004, - 1006, 0, 0, 0, 1006, 1003, 1004, 0, 0, 1019, - 1006, 1019, 1003, 1003, 1004, 1005, 1019, 1003, 1004, 1005, - 1006, 1019, 1007, 1003, 1004, 1005, 1007, 1004, 1005, 0, - 0, 0, 1007, 1003, 1004, 1005, 0, 1019, 0, 1019, - - 0, 1008, 1007, 1005, 1019, 1008, 0, 1005, 1009, 1019, - 1007, 1008, 1009, 1005, 1007, 1010, 1005, 0, 1009, 1010, - 1007, 1008, 0, 1005, 0, 1010, 0, 0, 1009, 1008, - 1007, 0, 0, 1008, 1011, 1010, 1009, 1012, 1011, 1008, - 1009, 1012, 1011, 1010, 0, 1012, 1009, 1010, 1011, 1008, - 0, 1012, 0, 1010, 0, 0, 1009, 0, 1011, 0, - 0, 1012, 1011, 1010, 0, 1012, 1011, 1013, 1013, 1012, - 1011, 0, 1013, 1012, 0, 0, 1011, 1014, 1013, 1012, - 0, 1014, 0, 0, 0, 0, 1011, 1014, 1013, 1012, - 0, 0, 1014, 0, 1015, 1013, 1013, 1014, 1015, 0, - - 1013, 0, 0, 1016, 1015, 1014, 1013, 1016, 0, 1014, - 0, 0, 0, 1016, 1015, 1014, 1013, 0, 0, 0, - 1014, 0, 1015, 1016, 0, 1014, 1015, 0, 1017, 1017, - 1018, 1016, 1015, 1017, 1018, 1016, 0, 0, 1018, 1017, - 0, 1016, 1015, 0, 1018, 0, 0, 0, 0, 1017, - 0, 1016, 0, 1020, 1018, 1020, 1017, 1017, 1018, 1020, - 1020, 1017, 1018, 0, 0, 1020, 1018, 1017, 1021, 0, - 1021, 0, 1018, 0, 0, 1021, 1021, 1017, 0, 1022, - 1021, 1020, 1018, 1020, 0, 0, 0, 1020, 1020, 0, - 1022, 0, 1022, 1020, 0, 0, 1021, 1022, 1021, 1023, - - 0, 0, 1022, 1021, 1021, 0, 0, 1022, 1021, 1024, - 1023, 1024, 1023, 0, 0, 0, 1024, 1023, 1022, 0, - 1022, 1024, 1023, 0, 1025, 1022, 1025, 1023, 0, 0, - 1022, 1025, 0, 0, 0, 0, 1025, 1024, 1023, 1024, - 1023, 0, 0, 1026, 1024, 1023, 0, 1026, 0, 1024, - 1023, 0, 1025, 1026, 1025, 1027, 1027, 1028, 1029, 1025, - 1027, 1028, 1029, 1026, 1025, 0, 1027, 1028, 1029, 0, - 0, 1026, 0, 0, 0, 1026, 1027, 1028, 1029, 0, - 1030, 1026, 1030, 1027, 1027, 1028, 1029, 1030, 1027, 1028, - 1029, 1026, 1030, 0, 1027, 1028, 1029, 0, 1031, 0, - - 0, 1032, 0, 0, 1027, 1028, 1029, 0, 1030, 1031, - 1030, 1031, 1032, 0, 1032, 1030, 1031, 0, 0, 1032, - 1030, 1031, 0, 1033, 1032, 1033, 1031, 0, 0, 1032, - 1033, 1034, 0, 1034, 0, 1033, 0, 1031, 1034, 1031, - 1032, 0, 1032, 1034, 1031, 0, 0, 1032, 0, 1031, - 1111, 1033, 1032, 1033, 1111, 1113, 0, 1113, 1033, 1034, - 1111, 1034, 1113, 1033, 1112, 0, 1034, 1113, 1112, 0, - 1111, 1034, 0, 0, 1112, 0, 0, 0, 1111, 1114, - 0, 1114, 1111, 1113, 1112, 1113, 1114, 1115, 1111, 1115, - 1113, 1114, 1112, 1116, 1115, 1113, 1112, 1116, 1111, 1115, - - 0, 0, 1112, 1116, 1118, 0, 1118, 1114, 0, 1114, - 0, 1118, 1112, 1116, 1114, 1115, 1118, 1115, 0, 1114, - 1117, 1116, 1115, 0, 1117, 1116, 1119, 1115, 1119, 0, - 1117, 1116, 1118, 1119, 1118, 1117, 0, 0, 1119, 1118, - 1117, 1116, 0, 1120, 1118, 1120, 0, 0, 1117, 0, - 1120, 0, 1117, 0, 1119, 1120, 1119, 1121, 1117, 1121, - 0, 1119, 0, 1117, 1121, 0, 1119, 0, 1117, 1121, - 0, 1120, 1122, 1120, 1122, 0, 0, 1124, 1120, 1122, - 1122, 0, 0, 1120, 1122, 1121, 1124, 1121, 1124, 1123, - 1123, 1123, 1121, 1124, 0, 0, 1123, 1121, 1124, 0, - - 1122, 1123, 1122, 0, 0, 1124, 0, 1122, 1122, 0, - 0, 0, 1122, 1125, 1124, 1125, 1124, 1123, 1123, 1123, - 1125, 1124, 0, 0, 1123, 1125, 1124, 0, 1126, 1123, - 1126, 0, 1127, 0, 1127, 1126, 1126, 1128, 0, 1127, - 1126, 1125, 0, 1125, 1127, 0, 0, 1128, 1125, 1128, - 0, 0, 0, 1125, 1128, 0, 1126, 0, 1126, 1128, - 1127, 0, 1127, 1126, 1126, 1128, 0, 1127, 1126, 1129, - 0, 1129, 1127, 0, 1130, 1128, 1129, 1128, 0, 0, - 0, 1129, 1128, 1130, 1131, 1130, 1131, 1128, 0, 0, - 1130, 1131, 0, 0, 0, 1130, 1131, 1129, 1132, 1129, - - 1132, 0, 1130, 0, 1129, 1132, 0, 0, 0, 1129, - 1132, 1130, 1131, 1130, 1131, 1133, 0, 1133, 1130, 1131, - 0, 0, 1133, 1130, 1131, 0, 1132, 1133, 1132, 1134, - 0, 1134, 0, 1132, 0, 0, 1134, 1137, 1132, 1137, - 0, 1134, 1135, 1133, 1137, 1133, 1135, 0, 0, 1137, - 1133, 0, 1135, 0, 0, 1133, 1136, 1134, 0, 1134, - 1136, 0, 1135, 0, 1134, 1137, 1136, 1137, 0, 1134, - 1135, 1138, 1137, 1138, 1135, 0, 1136, 1137, 1138, 1138, - 1135, 0, 1139, 1138, 1136, 0, 1139, 0, 1136, 0, - 1135, 1140, 1139, 1140, 1136, 0, 0, 0, 1140, 1138, - - 0, 1138, 1139, 1140, 1136, 0, 1138, 1138, 0, 0, - 1139, 1138, 0, 0, 1139, 1141, 1142, 1141, 1142, 1140, - 1139, 1140, 1141, 1142, 0, 0, 1140, 1141, 1142, 0, - 1139, 1140, 0, 0, 0, 1143, 0, 1143, 0, 0, - 0, 0, 1143, 1141, 1142, 1141, 1142, 1143, 0, 0, - 1141, 1142, 1144, 0, 1144, 1141, 1142, 0, 0, 1144, - 1145, 0, 1145, 1143, 1144, 1143, 1146, 1145, 1146, 0, - 1143, 0, 1145, 1146, 0, 1143, 0, 1147, 1146, 1147, - 1144, 0, 1144, 1147, 1147, 0, 0, 1144, 1145, 1147, - 1145, 0, 1144, 1148, 1146, 1145, 1146, 1148, 0, 0, - - 1145, 1146, 0, 1148, 0, 1147, 1146, 1147, 0, 0, - 1149, 1147, 1147, 1148, 1149, 0, 1150, 1147, 1149, 1151, - 1150, 1148, 0, 1151, 1149, 1148, 1150, 0, 1152, 1151, - 1152, 1148, 0, 0, 1149, 1152, 1150, 0, 1149, 1151, - 1152, 1148, 1149, 1153, 1150, 1153, 1149, 1151, 1150, 0, - 1153, 1151, 1149, 0, 1150, 1153, 1152, 1151, 1152, 0, - 0, 0, 1149, 1152, 1150, 0, 0, 1151, 1152, 0, - 1154, 1153, 1154, 1153, 1155, 0, 1155, 1154, 1153, 0, - 0, 1155, 1154, 1153, 0, 1157, 1155, 1157, 1156, 0, - 0, 0, 1157, 0, 0, 0, 0, 1157, 1154, 1156, - - 1154, 1156, 1155, 0, 1155, 1154, 1156, 0, 0, 1155, - 1154, 1156, 0, 1157, 1155, 1157, 1156, 0, 1159, 0, - 1157, 0, 1159, 0, 1158, 1157, 1158, 1156, 1159, 1156, - 0, 1158, 1158, 1160, 1156, 0, 1158, 1160, 1159, 1156, - 0, 0, 0, 1160, 0, 0, 1159, 1161, 0, 0, - 1159, 1161, 1158, 1160, 1158, 0, 1159, 1161, 1162, 1158, - 1158, 1160, 1162, 0, 1158, 1160, 1159, 1161, 1162, 0, - 1163, 1160, 1163, 0, 0, 1161, 0, 1163, 1162, 1161, - 0, 1160, 1163, 0, 0, 1161, 1162, 1164, 0, 1164, - 1162, 0, 1165, 1166, 1164, 1161, 1162, 0, 1163, 1164, - - 1163, 1165, 1166, 1165, 1166, 1163, 1162, 0, 1165, 1166, - 1163, 0, 0, 1165, 1166, 1164, 1167, 1164, 1167, 0, - 1165, 1166, 1164, 1167, 0, 0, 0, 1164, 1167, 1165, - 1166, 1165, 1166, 1168, 0, 1168, 1165, 1166, 0, 0, - 1168, 1165, 1166, 0, 1167, 1168, 1167, 1169, 1170, 1169, - 1170, 1167, 0, 0, 1169, 1170, 1167, 0, 0, 1169, - 1170, 1168, 1171, 1168, 1171, 0, 0, 0, 1168, 1171, - 0, 0, 0, 1168, 1171, 1169, 1170, 1169, 1170, 1172, - 0, 1172, 1169, 1170, 0, 1174, 1172, 1169, 1170, 0, - 1171, 1172, 1171, 1173, 0, 1173, 1174, 1171, 1174, 1175, - - 1173, 0, 1171, 1174, 0, 1173, 0, 1172, 1174, 1172, - 1175, 0, 1175, 1174, 1172, 0, 0, 1175, 0, 1172, - 0, 1173, 1175, 1173, 1174, 0, 1174, 1175, 1173, 0, - 1176, 1174, 0, 1173, 0, 1177, 1174, 1177, 1175, 1176, - 1175, 1176, 1177, 1177, 1178, 1175, 1176, 1177, 0, 0, - 1175, 1176, 1178, 0, 1178, 0, 0, 0, 1176, 1178, - 0, 0, 0, 1177, 1178, 1177, 1179, 1176, 1179, 1176, - 1177, 1177, 1178, 1179, 1176, 1177, 0, 0, 1179, 1176, - 1178, 1180, 1178, 1180, 0, 0, 0, 1178, 1180, 0, - 0, 0, 1178, 1180, 1179, 1181, 1179, 1181, 1182, 0, - - 1182, 1179, 1181, 0, 0, 1182, 1179, 1181, 0, 1180, - 1182, 1180, 1183, 0, 1183, 1184, 1180, 1184, 1183, 1183, - 0, 1180, 1184, 1181, 1183, 1181, 1182, 1184, 1182, 1232, - 1181, 1232, 1233, 1182, 1233, 1181, 1232, 0, 1182, 1233, - 1183, 1232, 1183, 1184, 1233, 1184, 1183, 1183, 0, 1234, - 1184, 1234, 1183, 0, 0, 1184, 1234, 1232, 0, 1232, - 1233, 1234, 1233, 1235, 1232, 1235, 0, 1233, 0, 1232, - 1235, 0, 1233, 0, 0, 1235, 1236, 1234, 0, 1234, - 1236, 0, 1239, 1239, 1234, 0, 1236, 0, 0, 1234, - 1237, 1235, 0, 1235, 1237, 1238, 1236, 0, 1235, 1238, - - 1237, 0, 0, 1235, 1236, 1238, 0, 0, 1236, 1239, - 1237, 0, 0, 1239, 1236, 1238, 1240, 0, 1237, 1239, - 1240, 0, 1237, 1238, 1236, 0, 1240, 1238, 1237, 1239, - 1242, 1241, 0, 1238, 1242, 1241, 1240, 1239, 1237, 1241, - 1242, 1239, 0, 1238, 1240, 1241, 0, 1239, 1240, 0, - 1242, 0, 0, 0, 1240, 1241, 1243, 1239, 1242, 1241, - 1243, 1244, 1242, 1241, 1240, 1244, 1243, 1241, 1242, 0, - 1245, 1244, 0, 1241, 1245, 0, 1243, 0, 1242, 0, - 1245, 1244, 0, 1241, 1243, 1245, 0, 1247, 1243, 1244, - 1245, 1247, 0, 1244, 1243, 0, 1248, 1247, 1245, 1244, - - 1248, 1246, 1245, 1246, 1243, 1246, 1248, 1247, 1245, 1244, - 1249, 1246, 0, 1245, 1249, 1247, 1248, 0, 1245, 1247, - 1249, 1246, 0, 0, 1248, 1247, 0, 0, 1248, 1246, - 1249, 1246, 0, 1246, 1248, 1247, 0, 0, 1249, 1246, - 0, 0, 1249, 1250, 1248, 1250, 0, 0, 1249, 1246, - 1250, 0, 1251, 0, 1251, 1250, 0, 0, 1249, 1251, - 1252, 0, 1252, 0, 1251, 1253, 0, 1252, 0, 0, - 0, 1250, 1252, 1250, 1253, 0, 1253, 1254, 1250, 1254, - 1251, 1253, 1251, 1250, 1254, 0, 1253, 1251, 1252, 1254, - 1252, 0, 1251, 1253, 1255, 1252, 1255, 0, 0, 0, - - 1252, 1255, 1253, 0, 1253, 1254, 1255, 1254, 1256, 1253, - 1256, 0, 1254, 0, 1253, 1256, 0, 1254, 0, 1257, - 1256, 1257, 1255, 0, 1255, 1257, 1257, 0, 0, 1255, - 0, 1257, 0, 0, 1255, 1258, 1256, 0, 1256, 1258, - 1259, 0, 0, 1256, 1259, 1258, 0, 1257, 1256, 1257, - 1259, 0, 0, 1257, 1257, 1258, 0, 0, 0, 1257, - 1259, 0, 1260, 1258, 1260, 0, 0, 1258, 1259, 1260, - 0, 0, 1259, 1258, 1260, 1261, 0, 1261, 1259, 1262, - 0, 1262, 1261, 1258, 0, 1263, 1262, 1261, 1259, 0, - 1260, 1262, 1260, 0, 1263, 0, 1263, 1260, 0, 0, - - 0, 1263, 1260, 1261, 0, 1261, 1263, 1262, 0, 1262, - 1261, 0, 0, 1263, 1262, 1261, 0, 0, 1264, 1262, - 1264, 0, 1263, 0, 1263, 1264, 1264, 0, 0, 1263, - 1264, 0, 1265, 1265, 1263, 1265, 0, 1266, 0, 1266, - 1265, 0, 0, 0, 1266, 1265, 1264, 0, 1264, 1266, - 1267, 0, 1267, 1264, 1264, 0, 0, 1267, 1264, 0, - 1265, 1265, 1267, 1265, 0, 1266, 0, 1266, 1265, 0, - 0, 0, 1266, 1265, 1268, 0, 1268, 1266, 1267, 0, - 1267, 1268, 1268, 0, 0, 1267, 1268, 1269, 0, 1269, - 1267, 1270, 0, 1270, 1269, 0, 0, 1270, 1270, 1269, - - 0, 0, 1268, 1270, 1268, 0, 1271, 1271, 1271, 1268, - 1268, 0, 0, 1271, 1268, 1269, 0, 1269, 1271, 1270, - 0, 1270, 1269, 0, 0, 1270, 1270, 1269, 0, 1273, - 1272, 1270, 1272, 1273, 1271, 1271, 1271, 1272, 1272, 1273, - 0, 1271, 1272, 1274, 1275, 0, 1271, 1274, 1275, 1273, - 0, 0, 0, 1274, 1275, 0, 0, 1273, 1272, 0, - 1272, 1273, 0, 1274, 1275, 1272, 1272, 1273, 0, 1276, - 1272, 1274, 1275, 1276, 1302, 1274, 1275, 1273, 1302, 1276, - 0, 1274, 1275, 1314, 1302, 1314, 0, 1302, 0, 1276, - 1314, 1274, 1275, 0, 1302, 1314, 0, 1276, 0, 1304, - - 0, 1276, 1302, 1304, 0, 0, 1302, 1276, 0, 1304, - 1305, 1314, 1302, 1314, 1305, 1302, 0, 1276, 1314, 1304, - 1305, 0, 1302, 1314, 1306, 1305, 0, 1304, 1306, 1307, - 1305, 1304, 0, 1307, 1306, 0, 0, 1304, 1305, 1307, - 0, 0, 1305, 0, 1306, 0, 0, 1304, 1305, 1307, - 1308, 0, 1306, 1305, 1308, 0, 1306, 1307, 1305, 0, - 1308, 1307, 1306, 0, 1309, 1310, 1309, 1307, 1309, 1310, - 1308, 0, 1306, 0, 1309, 1310, 0, 1307, 1308, 1311, - 1310, 0, 1308, 1311, 1309, 1310, 0, 0, 1308, 1311, - 0, 0, 1309, 1310, 1309, 0, 1309, 1310, 1308, 1311, - - 1312, 0, 1309, 1310, 1312, 1313, 0, 1311, 1310, 1313, - 1312, 1311, 1309, 1310, 1315, 1313, 0, 1311, 1313, 1315, - 1312, 1315, 0, 0, 0, 1313, 1315, 1311, 1312, 0, - 1316, 1315, 1312, 1313, 1316, 1317, 0, 1313, 1312, 1317, - 1316, 0, 1315, 1313, 0, 1317, 1313, 1315, 1312, 1315, - 1316, 0, 0, 1313, 1315, 1317, 1318, 0, 1316, 1315, - 1318, 1319, 1316, 1317, 0, 1319, 1318, 1317, 1316, 0, - 1320, 1319, 0, 1317, 1320, 1321, 1318, 0, 1316, 1321, - 1320, 1319, 0, 1317, 1318, 1321, 1321, 0, 1318, 1319, - 1320, 0, 0, 1319, 1318, 1321, 1322, 0, 1320, 1319, - - 1322, 1323, 1320, 1321, 1318, 1323, 1322, 1321, 1320, 1319, - 0, 1323, 0, 1321, 1321, 0, 1322, 0, 1320, 0, - 0, 1323, 0, 1321, 1322, 1324, 1324, 1342, 1322, 1323, - 1324, 1342, 0, 1323, 1322, 0, 1324, 1342, 0, 1323, - 1340, 1340, 0, 0, 1322, 0, 1324, 1342, 0, 1323, - 0, 0, 1343, 1324, 1324, 1342, 1343, 0, 1324, 1342, - 0, 1345, 1343, 1345, 1324, 1342, 1344, 1340, 1345, 0, - 1344, 1340, 1343, 1345, 1324, 1342, 1344, 1340, 0, 0, - 1343, 1346, 0, 1346, 1343, 0, 1344, 1340, 1346, 1345, - 1343, 1345, 0, 1346, 1344, 1340, 1345, 0, 1344, 1340, - - 1343, 1345, 0, 0, 1344, 1340, 1347, 0, 1347, 1346, - 1348, 1346, 1348, 1347, 1344, 1340, 1346, 1348, 1347, 0, - 0, 1346, 1348, 1349, 0, 1349, 0, 0, 0, 0, - 1349, 0, 0, 0, 1347, 1349, 1347, 1350, 1348, 1350, - 1348, 1347, 0, 0, 1350, 1348, 1347, 0, 0, 1350, - 1348, 1349, 0, 1349, 0, 0, 1351, 0, 1349, 0, - 1351, 0, 0, 1349, 0, 1350, 1351, 1350, 0, 1352, - 1363, 1364, 1350, 1352, 1363, 1364, 1351, 1350, 0, 1352, - 1363, 1364, 0, 0, 1351, 0, 0, 0, 1351, 1352, - 1363, 1364, 0, 0, 1351, 0, 1365, 1352, 1363, 1364, - - 1365, 1352, 1363, 1364, 1351, 0, 1365, 1352, 1363, 1364, - 0, 0, 0, 1366, 0, 1366, 1365, 1352, 1363, 1364, - 1366, 0, 0, 0, 1365, 1366, 0, 0, 1365, 0, - 1374, 0, 1374, 0, 1365, 0, 0, 1374, 0, 0, - 0, 1366, 1374, 1366, 1365, 0, 0, 0, 1366, 0, - 0, 0, 0, 1366, 0, 0, 0, 0, 1374, 0, - 1374, 0, 0, 0, 0, 1374, 0, 0, 0, 0, - 1374, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, - 1406, 1407, 0, 0, 1407, 1407, 1407, 1407, 1407, 1407, - 1407, 1408, 1408, 0, 1408, 1409, 1409, 1409, 1410, 0, - - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1411, 1411, 1411, - 0, 1411, 1411, 1411, 1411, 1411, 1411, 1412, 0, 1412, - 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1413, 0, 1413, - 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1414, 0, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1415, 0, 1415, - 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1416, 0, 1416, - 1417, 0, 1417, 1418, 0, 1418, 1419, 0, 1419, 1420, - 0, 1420, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405 - } ; +struct yy_trans_info { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; +}; +static const flex_int16_t yy_accept[1406] = { + 0, 0, 0, 194, 194, 2, 2, 198, 196, 4, 4, 196, 196, 183, 183, 192, 183, 183, 188, 183, 183, + 183, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 196, 183, 194, 195, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 4, 175, 0, 179, 1, 0, 185, 184, 188, 0, 181, + + 177, 176, 173, 178, 182, 191, 191, 191, 191, 191, 191, 12, 191, 191, 191, 19, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 74, + 191, 191, 77, 86, 191, 191, 191, 191, 191, 191, 191, 191, 191, 105, 191, 191, 110, 113, 114, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 151, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 0, 180, 194, 193, 2, 2, 2, 2, 2, + + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 189, 0, 0, 184, 0, 0, 186, 174, 5, 191, 7, 191, 191, 10, 191, 13, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 34, 191, 191, 191, 191, 191, 191, 191, 45, 191, + 191, 191, 191, 50, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 61, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 81, 191, 191, 89, 191, 191, 191, 191, 191, 191, 191, 191, 101, 191, + 191, 106, 191, 191, 191, 111, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + + 191, 191, 191, 191, 191, 191, 191, 191, 137, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 152, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 185, 0, 184, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 20, 191, 22, 23, 24, 191, 191, 191, 29, 191, 191, 191, 32, 35, + + 191, 191, 191, 191, 191, 41, 191, 191, 191, 47, 48, 191, 191, 191, 191, 191, 191, 191, 191, 58, 191, + 191, 191, 191, 64, 65, 191, 191, 69, 191, 71, 72, 191, 191, 191, 191, 191, 191, 85, 191, 88, 90, + 91, 191, 93, 191, 191, 96, 191, 191, 191, 191, 191, 108, 191, 191, 191, 191, 117, 191, 191, 120, 191, + 191, 191, 191, 125, 191, 191, 191, 191, 191, 131, 191, 191, 191, 191, 139, 140, 191, 191, 191, 191, 191, + 147, 148, 149, 191, 154, 191, 191, 191, 191, 191, 191, 191, 191, 191, 164, 191, + + 166, 191, 168, 169, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 6, 8, 191, 11, 191, + 15, 191, 191, 191, 191, 191, 191, 191, 191, 191, 31, 191, 191, 191, 191, 191, 191, 40, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 57, 59, 191, 191, 191, 191, 67, 191, 73, 75, 191, 78, 79, + 191, 191, 191, 191, 92, 94, 191, 97, 98, 191, 102, 191, 191, 191, 191, 115, + + 116, 191, 191, 191, 191, 191, 124, 191, 191, 191, 129, 191, 191, 191, 191, 138, 191, 191, 191, 144, 191, + 191, 191, 191, 191, 157, 191, 191, 191, 161, 191, 191, 191, 167, 170, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 191, 14, 191, 17, 191, 191, 191, + 25, 27, 191, 30, 191, 191, 191, 191, 191, 39, 191, 43, 191, 46, 191, 51, 52, 191, 54, 191, 191, + 191, 191, 63, 66, 68, 70, 76, 80, 191, 191, 191, 87, 95, 99, 103, 191, 107, 191, 112, 191, 191, + 191, 191, 191, 191, 127, 191, 191, 132, 134, 136, 191, 142, 191, 145, 191, 191, + + 191, 191, 191, 158, 159, 160, 162, 191, 191, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 9, 16, 18, 21, 191, 26, 28, 191, 191, 191, 37, 38, 191, 191, 191, + + 53, 55, 56, 191, 62, 82, 191, 191, 100, 104, 191, 191, 191, 191, 122, 123, 191, 191, 191, 133, 135, + 191, 143, 191, 191, 191, 191, 191, 163, 165, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 191, 0, 33, 191, 42, 44, 49, + 191, 191, 84, 109, 191, 191, 191, 191, 128, 130, 141, 191, 191, 191, 155, 191, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 191, 0, 191, 60, 83, 191, 119, 121, 191, 146, 150, 191, 156, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 36, 118, 126, 191, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 171, 153, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 172, 2, 2, 0, 2, + + 0, 2, 187, 2, 0}; + +static const YY_CHAR yy_ec[256] = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 4, 5, 1, 1, 6, 7, 8, 6, 6, 6, 9, 6, 10, 11, 6, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 6, 6, 22, 23, 24, 6, 1, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 6, 1, 6, 6, 51, 52, 53, 54, 55, 56, + + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 6, 79, 6, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + +static const YY_CHAR yy_meta[80] = {0, 1, 1, 2, 1, 3, 1, 1, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 8, 8, + 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 8, + 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 1}; + +static const flex_int16_t yy_base[1421] = { + 0, 0, 0, 667, 661, 79, 0, 662, 9173, 157, 159, 635, 0, 9173, 648, 9173, 153, + 152, 164, 154, 622, 156, 194, 152, 158, 181, 169, 241, 205, 228, 254, 148, 159, 239, + 270, 276, 294, 234, 0, 305, 346, 390, 308, 308, 166, 214, 0, 558, 0, 613, 0, + 192, 252, 582, 596, 0, 591, 0, 236, 375, 450, 331, 559, 239, 507, 586, 641, 694, + 743, 796, 382, 471, 840, 507, 550, 573, 587, 892, 942, 992, 600, 643, 1039, 1092, 686, + 664, 736, 741, 514, 481, 314, 9173, 553, 9173, 9173, 541, 250, 253, 348, 347, 9173, + + 527, 9173, 9173, 9173, 9173, 0, 257, 291, 363, 403, 300, 353, 447, 351, 345, 0, 490, + 373, 457, 415, 375, 490, 797, 741, 376, 416, 430, 447, 472, 818, 505, 506, 505, 511, + 513, 521, 537, 561, 613, 565, 568, 0, 581, 578, 856, 585, 591, 583, 641, 644, 855, + 636, 650, 700, 668, 688, 694, 714, 715, 0, 721, 734, 759, 747, 770, 810, 787, 877, + 795, 878, 799, 896, 894, 803, 812, 802, 821, 855, 881, 856, 889, 896, 924, 937, 922, + 922, 940, 929, 946, 935, 960, 446, 9173, 0, 9173, 0, 431, 0, 487, 0, + + 0, 476, 1158, 1204, 1251, 1300, 0, 465, 0, 0, 0, 0, 990, 993, 1079, 1039, 1297, + 1084, 1296, 1344, 1293, 1052, 1309, 982, 1353, 1394, 1389, 1394, 1424, 1477, 1518, 1163, 1449, 1164, + 1568, 1457, 1618, 1210, 1211, 1470, 1527, 1485, 1564, 1576, 1617, 1634, 1633, 1675, 1653, 1673, 1698, + 1748, 1678, 1728, 1741, 1764, 1813, 1866, 1790, 1735, 1801, 1851, 1907, 1860, 1910, 1929, 1932, 1956, + 1971, 1977, 2007, 2026, 2024, 2024, 2079, 2075, 2078, 2092, 2142, 2142, 2143, 2182, 2183, 2208, 2197, + 2230, 2223, 2250, 2253, 2280, 2328, 2295, 2309, 2345, 2361, 2368, 2375, 2401, 436, 0, + + 9173, 473, 427, 976, 429, 1176, 1276, 9173, 0, 998, 0, 1006, 1000, 0, 1016, 0, 1022, + 1053, 1083, 1100, 1099, 1101, 1299, 1096, 1094, 1120, 1137, 1133, 1161, 1155, 1161, 1175, 1170, 1209, + 1217, 1226, 1354, 1228, 1227, 1213, 0, 1273, 1262, 1308, 1310, 0, 1354, 1352, 1357, 1342, 1357, + 1355, 1396, 1412, 1419, 1411, 1520, 1411, 1413, 1426, 1438, 1457, 1461, 1464, 1497, 1505, 1505, 1516, + 1521, 1522, 1551, 1510, 1520, 0, 1515, 1542, 1568, 1582, 1596, 1582, 1583, 1575, 0, 1582, 1582, + 0, 1611, 1624, 1623, 1644, 1678, 1696, 1686, 1735, 1698, 1790, 1735, 1750, 1746, 1758, + + 1798, 1783, 1803, 1800, 1797, 1814, 1808, 1824, 0, 1827, 1826, 1839, 1846, 1839, 1840, 1849, 1848, + 1848, 1862, 1876, 0, 1868, 1900, 1902, 1921, 1922, 1960, 1959, 1956, 1975, 1964, 1973, 2010, 2001, + 1999, 9173, 0, 472, 2470, 2480, 2529, 2498, 2508, 0, 2394, 2522, 2523, 2524, 2401, 2522, 2539, + 2559, 2575, 2580, 2611, 2610, 2590, 2626, 2676, 2662, 2667, 2712, 2713, 2726, 2739, 2759, 2772, 2772, + 2808, 2809, 2821, 2838, 2857, 2883, 2864, 2904, 2878, 2897, 2923, 2940, 2949, 2954, 2979, 2980, 3006, + 3006, 3026, 3043, 3051, 3067, 3096, 3094, 3117, 3122, 3150, 3154, 3167, 3181, 3215, 3217, + + 3220, 3266, 3267, 3269, 3292, 3306, 3309, 3323, 3339, 3356, 3370, 3362, 3404, 3419, 3472, 3433, 3473, + 3470, 3487, 3512, 3513, 3526, 3543, 3559, 3563, 3576, 3589, 3612, 3615, 3668, 3632, 3719, 3668, 3705, + 3713, 3661, 3753, 3764, 3783, 3781, 3790, 3820, 3829, 3834, 3843, 3860, 3879, 3874, 3886, 3917, 3928, + 3931, 3937, 3973, 3948, 3989, 3994, 3993, 4024, 4019, 4044, 4045, 4085, 4061, 4105, 4092, 4136, 4144, + 4153, 4161, 4192, 0, 470, 4229, 4257, 4267, 4277, 2008, 2016, 2017, 2021, 2029, 2044, 2063, 2067, + 2079, 0, 2094, 0, 0, 2104, 2094, 2105, 2118, 0, 2117, 2122, 2141, 2129, 0, + + 2138, 2140, 2151, 2173, 2202, 2200, 2221, 2230, 2245, 0, 0, 2260, 2258, 2263, 2259, 2264, 2288, + 2293, 2306, 0, 2293, 2304, 2312, 2343, 0, 0, 2349, 2338, 0, 2346, 0, 2370, 2391, 2404, + 2405, 2433, 2434, 2575, 0, 2466, 0, 0, 0, 2461, 0, 2470, 2478, 0, 2479, 2636, 2499, + 2498, 2533, 0, 2591, 2591, 2585, 2611, 0, 2628, 2637, 0, 2653, 2660, 2664, 2665, 0, 2657, + 2689, 2688, 2691, 2712, 0, 2719, 2733, 2749, 2752, 0, 0, 2755, 2765, 2765, 2783, 2774, 0, + 0, 2784, 2788, 0, 2807, 2792, 2815, 2816, 2839, 2822, 2845, 2871, 2887, 0, 2897, + + 0, 2920, 0, 2914, 469, 4287, 4297, 4307, 4317, 4303, 4306, 4100, 4314, 4351, 4349, 4365, 4363, + 4402, 4404, 4411, 4437, 4444, 4467, 4458, 4493, 4498, 4500, 4540, 4500, 4549, 4570, 4589, 4577, 4596, + 4632, 4621, 4638, 4646, 4663, 4686, 4685, 4688, 4694, 4738, 4735, 4744, 4752, 4783, 4797, 4805, 4803, + 4833, 4854, 4856, 4863, 4889, 4896, 4910, 4919, 4945, 4950, 4952, 4955, 4972, 4996, 5013, 5001, 5018, + 5033, 5079, 5064, 5070, 5115, 5116, 5124, 5130, 5161, 5167, 5062, 5179, 5190, 5178, 5223, 5222, 5246, + 5251, 5277, 5272, 5298, 5324, 5313, 5349, 5338, 5363, 5364, 5394, 5403, 5405, 5420, 5434, + + 5457, 5460, 5459, 5486, 5499, 5512, 5514, 5545, 5525, 5558, 5565, 5565, 5591, 5594, 5605, 5620, 5631, + 5634, 5664, 5667, 5678, 5686, 5710, 5723, 5727, 5742, 5766, 5781, 5782, 5821, 5822, 5835, 5836, 5861, + 5862, 5878, 461, 0, 0, 2916, 0, 2938, 0, 2939, 2942, 2967, 2971, 2975, 2984, 2979, 2985, + 2996, 0, 3000, 3010, 3009, 3035, 3029, 3046, 0, 3047, 3040, 3057, 3069, 3072, 3081, 3067, 3076, + 3093, 3107, 3114, 0, 0, 3100, 3136, 3128, 3140, 3138, 3175, 0, 0, 3163, 0, 0, 3167, + 3194, 3212, 3196, 0, 0, 3209, 0, 0, 3213, 3220, 3250, 3235, 3253, 3260, 0, + + 0, 3280, 3268, 3291, 3280, 3309, 0, 3328, 3331, 3328, 0, 3340, 3349, 3353, 3353, 0, 3365, + 3379, 3387, 3373, 3375, 3377, 3403, 3406, 3412, 0, 3422, 3427, 3428, 0, 3417, 3438, 3442, 0, + 0, 427, 5889, 5897, 5898, 5934, 5918, 5954, 5955, 5957, 5984, 5997, 6011, 6019, 6027, 6040, 6047, + 6073, 6073, 6086, 6099, 6126, 6126, 6128, 6139, 6165, 6179, 6177, 6178, 6205, 6228, 6230, 6231, 6235, + 6261, 6286, 6287, 6288, 6313, 6328, 6342, 6330, 6364, 6377, 6386, 6401, 6420, 6423, 6437, 6462, 6478, + 6466, 6493, 6508, 6522, 6525, 6539, 6542, 6578, 6566, 6595, 6608, 6622, 6647, 6651, 6664, + + 6675, 6677, 6717, 6718, 6747, 6704, 6754, 6773, 6780, 6787, 6810, 6813, 6840, 6849, 6866, 6875, 6901, + 6906, 6734, 6918, 6933, 6955, 6975, 6974, 6989, 7015, 7028, 7029, 7030, 7045, 7074, 7077, 7088, 7096, + 397, 3441, 0, 3451, 0, 3500, 3524, 3513, 3517, 0, 3527, 0, 3554, 3571, 3582, 3579, 3577, + 0, 3605, 0, 3605, 0, 3615, 0, 0, 3626, 0, 3620, 3619, 3634, 3633, 0, 0, 0, + 0, 0, 0, 3632, 3658, 3684, 0, 0, 3671, 0, 3683, 0, 3699, 0, 3682, 3697, 3727, + 3734, 3717, 3730, 0, 3743, 3745, 3730, 3756, 0, 3769, 0, 3773, 0, 3786, 3793, + + 3796, 3798, 3860, 0, 0, 0, 0, 3863, 3879, 385, 7122, 7136, 7120, 7144, 7152, 7165, 7192, + 7169, 7191, 7208, 7222, 7237, 7254, 7251, 7278, 7293, 7297, 7312, 7334, 7348, 7349, 7363, 7380, 7394, + 7414, 7428, 7402, 7436, 7454, 7456, 7480, 7481, 7500, 7517, 7525, 7531, 7542, 7565, 7586, 7588, 7591, + 7593, 7608, 7635, 7639, 7664, 7650, 7689, 7690, 7705, 7719, 7730, 7735, 7752, 7766, 7767, 7781, 7798, + 7812, 7813, 7827, 7844, 7858, 7861, 7875, 7904, 7900, 7917, 7931, 7946, 7960, 7963, 7977, 7980, 388, + 0, 0, 0, 0, 3890, 0, 0, 438, 3930, 3945, 0, 0, 3949, 3938, 3995, + + 0, 0, 0, 3997, 0, 0, 4015, 4011, 0, 0, 4037, 4058, 4050, 4054, 0, 0, 4071, + 4059, 4073, 0, 0, 4072, 0, 4081, 4108, 4122, 4141, 4146, 0, 0, 386, 7994, 7997, 8014, + 8028, 8048, 8062, 8067, 8081, 8088, 8107, 8102, 8128, 8133, 8142, 8173, 8159, 8168, 8182, 8208, 8217, + 8225, 8239, 8242, 8259, 8273, 8284, 8307, 8312, 8327, 8340, 8344, 8359, 8383, 8398, 8402, 8415, 8439, + 8452, 8456, 8471, 8495, 8501, 8515, 8516, 8541, 385, 4143, 4353, 0, 4142, 0, 0, 0, 4159, + 4161, 0, 0, 4184, 4193, 4205, 4209, 0, 0, 0, 4190, 4300, 4317, 0, 4330, + + 359, 8546, 4414, 8571, 8582, 8596, 8601, 8622, 8636, 8637, 8651, 8672, 8677, 8548, 8684, 8702, 8707, + 8728, 8733, 8742, 8747, 8768, 8773, 8798, 350, 478, 4321, 4332, 0, 0, 4353, 0, 0, 4359, + 0, 0, 4371, 0, 332, 8839, 4380, 8799, 8824, 8838, 8826, 8846, 8871, 8875, 8888, 8902, 8928, + 8941, 327, 4443, 4405, 0, 0, 0, 4416, 310, 4472, 4410, 8942, 8943, 8968, 8978, 306, 4437, + 9173, 0, 303, 4477, 0, 8995, 276, 4471, 271, 4510, 257, 4504, 240, 4509, 230, 4529, 225, + 4530, 220, 4534, 189, 4536, 187, 4552, 185, 4562, 176, 9173, 172, 0, 177, 174, + + 164, 162, 9173, 0, 9173, 9071, 9081, 9086, 9089, 9098, 9107, 9117, 9127, 9137, 9147, 9151, 9154, + 9159, 9162, 9165}; + +static const flex_int16_t yy_def[1421] = { + 0, 1405, 1, 1406, 1406, 1405, 5, 1405, 1405, 1405, 1405, 1405, 1407, 1405, 1405, 1405, 1405, + 1405, 1408, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1410, 1405, 1411, 1405, 1412, + 1412, 1405, 1412, 1413, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1414, 1414, 65, 65, + 65, 66, 68, 65, 68, 65, 65, 65, 65, 66, 66, 66, 65, 65, 65, 65, 68, + 65, 65, 65, 1415, 1412, 1405, 1405, 1407, 1405, 1405, 1405, 1416, 1417, 1408, 1418, 1405, + + 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1410, 1405, 1411, 1405, 1412, 1412, 1412, 1413, 1412, + + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 65, 65, 65, 68, 68, + 68, 68, 68, 68, 65, 65, 68, 68, 68, 65, 65, 65, 68, 68, 68, 65, 68, + 68, 68, 65, 68, 68, 65, 68, 65, 68, 65, 65, 68, 68, 68, 68, 65, 65, + 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 65, 65, + 68, 65, 65, 65, 66, 65, 65, 65, 68, 65, 65, 65, 65, 1415, 1412, + + 1405, 1405, 1419, 1417, 1420, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1405, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 65, 65, 65, 65, 68, 68, 68, + 68, 65, 65, 65, 65, 68, 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, + 68, 68, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 68, 68, 68, 68, 65, 65, 68, 65, 65, 68, 68, 68, 68, 65, 65, + + 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 68, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, + 68, 65, 65, 65, 65, 68, 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, + 68, 68, 68, 68, 65, 65, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, + 68, 68, 68, 1412, 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1412, 1412, 1412, 1412, 1412, 68, 68, 65, 65, 65, 68, 65, 68, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 65, 65, 65, 68, 68, + 68, 68, 68, 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, 65, 65, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 68, 68, 68, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + + 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, 65, 68, 65, 65, 65, 65, 65, + 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 65, 65, + 65, 68, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1412, 68, 68, 68, 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, + 65, 68, 65, 65, 65, 68, 65, 65, 65, 65, 68, 65, 65, 65, 65, 65, 68, + 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, + 68, 68, 68, 68, 68, 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, + + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, + 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, 65, 65, 68, 68, 68, 65, 65, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 65, 65, 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, + 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 1405, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, 68, 68, 68, + 68, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, + 68, 68, 68, 68, 68, 68, 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 65, 65, 65, 65, 1405, 1409, 1405, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + + 1412, 65, 1412, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 1405, 1409, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1412, 65, 1412, 65, 65, 65, 68, 68, 68, 68, 68, 68, 65, + 65, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1412, 1412, 1412, 65, 65, 65, 68, 1405, 1405, + 1405, 1409, 1412, 1412, 1412, 68, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, + 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1412, + + 1405, 1412, 1405, 1412, 0, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405}; + +static const flex_int16_t yy_nxt[9253] = { + 0, 8, 9, 10, 11, 12, 13, 14, 15, 13, 16, 17, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 38, 45, 38, 38, 46, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 38, 45, 38, 47, 50, 51, 52, 53, 54, 55, 56, 57, 55, 58, + 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 80, 87, 80, 80, 88, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 80, 87, 80, 89, 90, 90, 90, 90, 94, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 95, 97, 100, 101, 102, 104, 105, 113, 1404, 117, 1403, 114, 1402, 147, 148, 1401, 118, + 115, 1400, 99, 197, 90, 1399, 119, 189, 190, 120, + + 116, 1397, 121, 1395, 127, 122, 128, 1393, 113, 123, 117, 129, 114, 124, 147, 148, 130, 118, + 115, 125, 99, 107, 126, 108, 119, 189, 190, 120, 116, 109, 121, 110, 127, 122, 128, 111, + 112, 123, 1391, 129, 137, 124, 191, 1389, 130, 201, 138, 125, 1387, 107, 126, 108, 139, 90, + 90, 1385, 202, 109, 164, 110, 140, 211, 212, 111, 112, 131, 141, 149, 137, 165, 191, 150, + 1383, 132, 138, 166, 133, 151, 303, 134, 139, 305, 135, 142, 309, 136, 164, 1381, 140, 143, + 144, 145, 1379, 131, 141, 149, 146, 165, 152, 150, + + 155, 132, 153, 166, 133, 151, 303, 134, 154, 305, 135, 142, 309, 136, 156, 90, 90, 143, + 144, 145, 157, 158, 1377, 159, 146, 1375, 152, 1371, 155, 167, 153, 160, 187, 168, 310, 161, + 154, 169, 162, 163, 188, 315, 156, 170, 1367, 184, 1360, 185, 157, 158, 186, 159, 207, 208, + 209, 306, 306, 167, 97, 160, 187, 168, 310, 161, 1353, 169, 162, 163, 188, 315, 1339, 170, + 171, 184, 172, 185, 99, 173, 186, 316, 174, 320, 175, 321, 176, 177, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 1325, 324, 311, 1301, + + 171, 1277, 172, 1231, 99, 173, 312, 316, 174, 320, 175, 321, 176, 177, 178, 1185, 331, 244, + 179, 213, 342, 180, 181, 245, 213, 324, 311, 313, 182, 213, 314, 183, 197, 90, 312, 574, + 574, 576, 576, 1279, 1279, 1110, 178, 329, 331, 244, 179, 213, 342, 180, 181, 245, 213, 330, + 343, 313, 182, 213, 314, 183, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 329, + 344, 345, 346, 1035, 317, 318, 206, 1354, 1354, 330, 343, 936, 837, 705, 573, 572, 444, 438, + 319, 437, 325, 326, 327, 246, 328, 436, 347, 213, + + 344, 345, 346, 247, 317, 318, 206, 196, 196, 248, 196, 196, 196, 196, 196, 196, 196, 196, + 319, 213, 325, 326, 327, 246, 328, 322, 347, 213, 196, 196, 196, 247, 323, 332, 214, 213, + 215, 248, 333, 213, 353, 354, 216, 355, 217, 254, 356, 213, 218, 219, 308, 358, 357, 322, + 302, 213, 359, 301, 196, 300, 323, 332, 214, 213, 215, 196, 333, 213, 353, 354, 216, 355, + 217, 254, 356, 360, 218, 219, 255, 358, 357, 210, 213, 213, 359, 196, 196, 196, 213, 196, + 196, 196, 196, 196, 196, 196, 196, 200, 213, 361, + + 196, 256, 364, 360, 198, 257, 255, 196, 196, 196, 213, 258, 365, 366, 220, 259, 213, 367, + 221, 260, 195, 213, 372, 373, 222, 261, 213, 361, 213, 256, 364, 374, 213, 257, 223, 213, + 193, 196, 213, 258, 365, 366, 220, 259, 103, 367, 221, 260, 213, 213, 372, 373, 222, 261, + 93, 362, 213, 91, 363, 374, 213, 1405, 223, 213, 196, 224, 213, 274, 49, 213, 375, 275, + 225, 213, 49, 276, 213, 381, 376, 226, 377, 277, 227, 362, 1405, 228, 363, 382, 294, 213, + 1405, 213, 213, 224, 1405, 274, 295, 213, 375, 275, + + 225, 213, 213, 276, 1405, 381, 376, 226, 377, 277, 227, 385, 213, 228, 1405, 382, 294, 213, + 229, 213, 213, 213, 230, 291, 295, 292, 231, 383, 293, 388, 213, 386, 232, 213, 387, 233, + 1405, 384, 389, 385, 213, 1405, 213, 1405, 390, 1405, 229, 1405, 391, 213, 230, 291, 1405, 292, + 231, 383, 293, 388, 1405, 386, 232, 213, 387, 233, 213, 384, 389, 296, 297, 298, 213, 213, + 390, 213, 213, 213, 391, 392, 234, 213, 235, 213, 339, 340, 213, 236, 341, 393, 394, 213, + 237, 213, 213, 1405, 395, 296, 297, 298, 1405, 213, + + 1405, 213, 213, 213, 1405, 392, 234, 213, 235, 213, 339, 340, 213, 236, 341, 393, 394, 213, + 237, 213, 238, 334, 395, 335, 398, 403, 336, 213, 239, 1405, 406, 240, 337, 1405, 241, 412, + 413, 242, 396, 338, 243, 1405, 397, 414, 348, 415, 349, 1405, 238, 334, 350, 335, 398, 403, + 336, 213, 239, 351, 406, 240, 337, 352, 241, 412, 413, 242, 396, 338, 243, 249, 397, 414, + 348, 415, 349, 250, 251, 252, 350, 378, 416, 379, 253, 368, 419, 351, 1405, 213, 1405, 352, + 1405, 1405, 380, 369, 1405, 1405, 1405, 249, 370, 371, + + 1405, 399, 1405, 250, 251, 252, 400, 378, 416, 379, 253, 368, 419, 404, 401, 213, 262, 417, + 410, 402, 380, 369, 407, 213, 405, 420, 370, 371, 418, 399, 263, 408, 411, 213, 400, 421, + 264, 265, 1405, 409, 1405, 404, 401, 1405, 262, 417, 410, 402, 422, 427, 407, 213, 405, 420, + 428, 1405, 418, 431, 263, 408, 411, 213, 424, 421, 264, 265, 213, 409, 423, 425, 432, 266, + 426, 213, 433, 429, 422, 427, 434, 267, 213, 430, 428, 268, 435, 431, 269, 270, 1405, 1405, + 424, 1405, 1405, 1405, 213, 1405, 423, 425, 432, 266, + + 426, 213, 433, 429, 305, 1405, 434, 267, 213, 430, 1405, 268, 435, 1405, 269, 270, 271, 458, + 213, 213, 445, 213, 213, 213, 459, 213, 578, 272, 213, 213, 213, 213, 305, 273, 579, 580, + 213, 1405, 213, 1405, 581, 213, 1405, 1405, 271, 458, 213, 213, 445, 213, 213, 213, 459, 213, + 578, 272, 213, 213, 213, 213, 582, 273, 579, 580, 213, 278, 213, 279, 581, 213, 280, 213, + 1405, 281, 447, 282, 213, 283, 284, 1405, 213, 213, 448, 1405, 213, 583, 213, 213, 582, 1405, + 457, 1405, 1405, 278, 1405, 279, 1405, 1405, 280, 213, + + 213, 281, 447, 282, 213, 283, 284, 213, 213, 213, 448, 213, 213, 583, 213, 213, 285, 213, + 457, 213, 286, 213, 446, 287, 288, 451, 213, 213, 213, 584, 289, 213, 585, 290, 586, 213, + 587, 591, 592, 213, 213, 1405, 1405, 1405, 285, 213, 1405, 213, 286, 213, 446, 287, 288, 451, + 213, 213, 593, 584, 289, 213, 585, 290, 586, 1405, 587, 591, 592, 1405, 213, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 1405, 594, 595, 1405, 1405, 593, 596, 439, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 597, 213, 213, + + 213, 213, 598, 599, 1405, 213, 480, 478, 594, 595, 213, 213, 600, 596, 439, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 597, 213, 213, 213, 213, 598, 599, 441, 213, 480, 478, + 1405, 1405, 213, 213, 600, 1405, 1405, 1405, 601, 489, 490, 213, 213, 602, 603, 1405, 213, 213, + 606, 607, 608, 213, 213, 1405, 441, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 601, 489, 490, 213, 213, 602, 603, 206, 213, 213, 606, 607, 608, 213, 213, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 1405, 609, 1405, + + 1405, 610, 1405, 1405, 1405, 1405, 1405, 206, 442, 442, 1405, 443, 443, 443, 443, 443, 443, 443, + 443, 443, 443, 449, 452, 456, 450, 588, 609, 589, 213, 610, 213, 213, 213, 213, 213, 213, + 611, 213, 213, 213, 213, 213, 590, 213, 213, 1405, 1405, 213, 612, 449, 452, 456, 450, 588, + 1405, 589, 213, 213, 213, 213, 213, 213, 213, 213, 611, 213, 213, 213, 213, 213, 590, 213, + 213, 453, 454, 213, 612, 460, 613, 213, 614, 213, 604, 615, 616, 213, 213, 455, 213, 1405, + 213, 213, 617, 1405, 1405, 213, 618, 605, 1405, 1405, + + 213, 453, 454, 1405, 1405, 460, 613, 213, 614, 213, 604, 615, 616, 1405, 213, 455, 213, 465, + 213, 213, 617, 213, 213, 213, 618, 605, 213, 466, 213, 461, 462, 463, 213, 464, 1405, 467, + 213, 213, 619, 1405, 620, 213, 213, 621, 1405, 465, 622, 625, 626, 213, 213, 627, 213, 1405, + 213, 466, 213, 461, 462, 463, 213, 464, 213, 467, 213, 213, 619, 468, 620, 213, 213, 621, + 469, 1405, 622, 625, 626, 213, 1405, 627, 213, 213, 628, 483, 213, 1405, 1405, 479, 629, 1405, + 213, 1405, 213, 630, 213, 468, 1405, 213, 213, 213, + + 469, 470, 213, 471, 213, 213, 472, 631, 491, 213, 628, 483, 473, 213, 213, 479, 629, 213, + 213, 474, 213, 630, 213, 494, 213, 213, 213, 213, 1405, 470, 213, 471, 213, 213, 472, 631, + 491, 1405, 632, 633, 473, 213, 213, 634, 635, 213, 213, 474, 623, 636, 637, 494, 213, 213, + 640, 213, 624, 641, 642, 475, 476, 213, 492, 477, 213, 213, 632, 633, 493, 213, 643, 634, + 635, 1405, 213, 1405, 623, 636, 637, 638, 1405, 213, 640, 213, 624, 641, 642, 475, 476, 639, + 492, 477, 213, 213, 481, 482, 493, 213, 643, 495, + + 644, 213, 213, 213, 213, 213, 213, 638, 213, 645, 213, 213, 648, 649, 496, 213, 1405, 639, + 1405, 650, 646, 1405, 481, 482, 213, 651, 652, 495, 644, 213, 647, 213, 213, 213, 213, 653, + 213, 645, 213, 213, 648, 649, 496, 213, 484, 213, 485, 650, 646, 213, 486, 1405, 213, 651, + 652, 497, 213, 487, 647, 654, 1405, 488, 1405, 653, 655, 213, 213, 1405, 213, 213, 500, 213, + 484, 213, 485, 213, 498, 213, 486, 499, 213, 213, 1405, 497, 213, 487, 656, 654, 213, 488, + 213, 1405, 655, 213, 213, 213, 213, 213, 500, 213, + + 213, 213, 1405, 213, 498, 502, 657, 499, 213, 213, 213, 213, 213, 213, 656, 508, 213, 213, + 213, 501, 213, 213, 213, 213, 658, 213, 213, 659, 213, 213, 213, 1405, 1405, 502, 657, 662, + 213, 503, 213, 213, 213, 213, 1405, 508, 1405, 213, 213, 501, 213, 213, 213, 1405, 658, 213, + 213, 659, 213, 1405, 213, 660, 509, 1405, 1405, 662, 213, 503, 213, 1405, 1405, 213, 213, 665, + 518, 213, 213, 504, 213, 213, 661, 213, 666, 667, 213, 213, 213, 505, 668, 660, 509, 510, + 506, 507, 213, 511, 213, 213, 213, 213, 213, 665, + + 518, 213, 213, 504, 213, 213, 661, 213, 666, 667, 213, 213, 213, 505, 668, 1405, 663, 510, + 506, 507, 213, 511, 669, 213, 213, 213, 670, 213, 519, 664, 213, 517, 213, 1405, 671, 672, + 213, 213, 520, 673, 213, 213, 674, 213, 663, 213, 675, 512, 213, 513, 669, 213, 676, 213, + 670, 213, 519, 664, 1405, 517, 213, 213, 671, 672, 213, 213, 520, 673, 677, 213, 674, 213, + 678, 213, 675, 512, 213, 513, 679, 213, 676, 680, 681, 682, 683, 1405, 213, 684, 213, 213, + 514, 685, 515, 213, 521, 524, 677, 213, 213, 686, + + 678, 213, 213, 516, 687, 688, 679, 213, 213, 680, 681, 682, 683, 213, 213, 684, 213, 1405, + 514, 685, 515, 213, 521, 524, 1405, 213, 213, 686, 689, 213, 213, 516, 687, 688, 525, 213, + 213, 690, 1405, 1405, 691, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, 522, 1405, 213, 523, + 213, 1405, 689, 213, 526, 692, 694, 693, 525, 1405, 213, 690, 213, 213, 691, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 522, 213, 213, 523, 213, 527, 695, 213, 526, 692, 694, 693, + 1405, 213, 213, 213, 213, 213, 696, 213, 213, 213, + + 697, 698, 213, 213, 213, 529, 213, 213, 213, 213, 699, 527, 695, 213, 528, 213, 700, 1405, + 213, 213, 1405, 213, 1405, 1405, 696, 213, 213, 1405, 697, 698, 1405, 213, 703, 529, 213, 213, + 213, 213, 699, 213, 704, 213, 528, 213, 700, 213, 213, 701, 530, 838, 531, 702, 532, 213, + 213, 213, 533, 839, 213, 213, 703, 534, 213, 213, 213, 840, 213, 213, 704, 841, 842, 213, + 213, 213, 213, 701, 530, 838, 531, 702, 532, 843, 213, 213, 533, 839, 213, 213, 1405, 534, + 213, 844, 213, 840, 213, 1405, 1405, 841, 842, 213, + + 213, 1405, 213, 535, 845, 539, 1405, 846, 536, 843, 213, 1405, 213, 540, 213, 213, 537, 213, + 847, 844, 213, 538, 213, 542, 541, 213, 213, 213, 848, 213, 849, 535, 845, 539, 213, 846, + 536, 850, 213, 213, 213, 540, 213, 213, 537, 213, 847, 1405, 213, 538, 213, 542, 541, 213, + 213, 213, 848, 213, 849, 851, 852, 1405, 213, 1405, 853, 850, 546, 213, 543, 854, 213, 213, + 855, 856, 213, 548, 857, 544, 1405, 213, 547, 213, 1405, 1405, 213, 545, 1405, 851, 852, 213, + 213, 213, 853, 1405, 546, 858, 543, 854, 213, 213, + + 855, 856, 213, 548, 857, 544, 549, 213, 547, 213, 213, 213, 213, 545, 213, 213, 859, 213, + 213, 213, 213, 213, 552, 858, 550, 213, 860, 1405, 1405, 213, 213, 213, 551, 1405, 549, 213, + 213, 1405, 213, 213, 213, 861, 213, 213, 859, 213, 213, 862, 213, 213, 552, 555, 550, 213, + 860, 213, 213, 213, 213, 213, 551, 213, 863, 213, 213, 213, 553, 213, 213, 861, 1405, 213, + 213, 213, 213, 862, 1405, 554, 213, 555, 864, 213, 213, 213, 213, 213, 556, 865, 213, 213, + 863, 213, 557, 213, 553, 213, 1405, 866, 213, 213, + + 213, 213, 867, 868, 558, 554, 213, 869, 864, 213, 213, 213, 870, 213, 556, 865, 213, 871, + 213, 213, 557, 213, 563, 213, 559, 866, 213, 213, 1405, 213, 867, 868, 558, 213, 872, 869, + 873, 213, 1405, 213, 870, 564, 874, 213, 875, 871, 213, 213, 1405, 213, 563, 213, 559, 560, + 1405, 213, 213, 213, 1405, 1405, 561, 213, 872, 562, 873, 213, 213, 876, 1405, 564, 874, 213, + 875, 877, 1405, 213, 213, 878, 1405, 1405, 565, 560, 213, 879, 213, 213, 566, 213, 561, 567, + 1405, 562, 213, 213, 213, 876, 569, 1405, 1405, 213, + + 213, 877, 568, 213, 213, 878, 213, 213, 565, 213, 213, 879, 880, 213, 566, 213, 213, 567, + 570, 881, 213, 213, 213, 213, 569, 571, 213, 213, 213, 213, 568, 213, 213, 213, 213, 213, + 712, 213, 213, 213, 880, 213, 213, 213, 213, 882, 570, 881, 213, 213, 213, 213, 883, 571, + 213, 1405, 1405, 213, 1405, 1405, 213, 213, 1405, 1405, 712, 1405, 213, 213, 1405, 1405, 213, 213, + 1405, 882, 884, 885, 213, 213, 706, 706, 883, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 707, 440, 440, 440, 440, 440, 440, 440, 440, 440, + + 440, 888, 884, 885, 889, 890, 891, 892, 441, 443, 443, 443, 443, 443, 443, 443, 443, 443, + 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 888, 895, 1405, 889, 890, 891, 892, + 441, 708, 708, 896, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 710, 213, 711, 1405, + 213, 213, 213, 213, 895, 213, 213, 213, 213, 713, 213, 897, 1405, 896, 1405, 213, 213, 213, + 213, 1405, 213, 1405, 213, 1405, 710, 213, 711, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 713, 213, 897, 213, 1405, 213, 213, 213, 213, + + 213, 213, 213, 213, 213, 886, 213, 213, 213, 213, 1405, 1405, 715, 714, 213, 1405, 887, 898, + 213, 899, 1405, 1405, 213, 213, 213, 718, 900, 213, 213, 213, 1405, 213, 213, 886, 213, 213, + 213, 213, 213, 213, 715, 714, 717, 213, 887, 898, 213, 899, 213, 213, 1405, 213, 901, 718, + 900, 213, 213, 716, 213, 213, 213, 719, 1405, 213, 902, 213, 213, 213, 213, 903, 717, 213, + 1405, 213, 1405, 1405, 213, 213, 893, 894, 901, 904, 1405, 1405, 905, 716, 213, 213, 906, 719, + 213, 213, 902, 907, 213, 213, 213, 903, 908, 213, + + 213, 213, 720, 723, 721, 213, 893, 894, 213, 904, 213, 724, 905, 1405, 213, 213, 906, 1405, + 213, 722, 1405, 907, 213, 213, 213, 909, 908, 213, 213, 910, 720, 723, 721, 213, 911, 1405, + 213, 912, 213, 724, 213, 213, 213, 213, 213, 213, 1405, 722, 725, 1405, 213, 213, 213, 909, + 213, 913, 726, 910, 213, 1405, 213, 213, 911, 728, 213, 912, 1405, 213, 213, 213, 914, 213, + 213, 213, 727, 915, 725, 213, 213, 213, 916, 1405, 213, 913, 726, 1405, 213, 213, 213, 213, + 917, 728, 213, 918, 213, 213, 213, 919, 914, 213, + + 731, 729, 727, 915, 213, 213, 213, 213, 916, 213, 213, 920, 921, 730, 213, 213, 1405, 1405, + 917, 213, 213, 918, 213, 1405, 213, 919, 922, 1405, 731, 729, 923, 1405, 213, 924, 213, 213, + 925, 213, 213, 920, 921, 730, 213, 213, 733, 213, 213, 213, 213, 213, 732, 213, 926, 734, + 922, 213, 213, 1405, 923, 213, 927, 924, 735, 928, 925, 929, 213, 1405, 1405, 213, 213, 213, + 733, 213, 213, 930, 213, 213, 732, 213, 926, 734, 1405, 213, 213, 736, 213, 213, 927, 213, + 735, 928, 739, 929, 213, 213, 213, 213, 213, 931, + + 737, 1405, 213, 930, 213, 213, 213, 1405, 1405, 738, 213, 213, 213, 736, 213, 213, 213, 213, + 932, 1405, 739, 213, 741, 213, 213, 213, 213, 931, 737, 213, 213, 213, 213, 213, 213, 213, + 213, 738, 213, 213, 213, 933, 213, 213, 213, 213, 932, 740, 934, 213, 741, 213, 213, 213, + 213, 213, 935, 213, 1405, 213, 213, 213, 742, 213, 213, 1036, 1037, 1038, 743, 933, 213, 213, + 213, 213, 1405, 740, 934, 213, 213, 213, 213, 213, 213, 213, 935, 1039, 213, 744, 213, 213, + 742, 1040, 213, 1036, 1037, 1038, 743, 213, 1041, 213, + + 213, 1042, 213, 745, 1405, 213, 213, 213, 746, 213, 213, 213, 213, 1039, 213, 744, 213, 213, + 213, 1040, 213, 1043, 1044, 1045, 1046, 213, 1041, 213, 213, 1042, 213, 745, 747, 1405, 213, 213, + 746, 1047, 213, 213, 213, 213, 1048, 213, 213, 213, 213, 1049, 748, 1043, 1044, 1045, 1046, 213, + 213, 213, 213, 1405, 1405, 1050, 747, 749, 213, 213, 1051, 1047, 213, 1405, 213, 213, 1048, 213, + 213, 213, 1052, 1049, 748, 1405, 213, 1053, 213, 213, 213, 1054, 750, 213, 213, 1050, 213, 749, + 213, 213, 1051, 751, 1055, 752, 213, 1056, 213, 213, + + 1405, 213, 1052, 1405, 1057, 213, 213, 1053, 213, 1058, 1059, 1054, 750, 213, 213, 213, 213, 1405, + 213, 1060, 753, 751, 1055, 752, 213, 1056, 213, 213, 213, 754, 1405, 213, 1057, 213, 213, 1061, + 213, 1058, 1059, 1062, 1063, 213, 1405, 213, 213, 755, 1064, 1060, 753, 213, 213, 1405, 213, 756, + 213, 213, 213, 754, 757, 213, 213, 1405, 213, 1061, 213, 213, 1065, 1062, 1063, 213, 213, 1066, + 213, 755, 1064, 1067, 1405, 213, 213, 759, 1068, 756, 213, 213, 1405, 758, 757, 213, 213, 213, + 1405, 213, 213, 213, 1065, 1405, 213, 213, 213, 1066, + + 1405, 213, 213, 1067, 213, 1069, 1070, 759, 1068, 213, 1071, 760, 761, 758, 213, 213, 213, 213, + 213, 213, 213, 1405, 1072, 213, 213, 213, 1405, 1405, 213, 213, 213, 1075, 213, 1069, 1070, 1405, + 1076, 213, 1071, 760, 761, 1077, 213, 213, 213, 213, 213, 762, 213, 213, 1072, 213, 213, 213, + 1073, 213, 213, 1074, 213, 1075, 763, 764, 1078, 213, 1076, 213, 1405, 1405, 213, 1077, 1405, 213, + 1405, 213, 1079, 762, 213, 213, 1080, 1405, 213, 213, 1073, 213, 1081, 1074, 213, 1405, 763, 764, + 1078, 213, 1405, 213, 213, 213, 213, 767, 213, 213, + + 765, 213, 1079, 1082, 213, 766, 1080, 213, 1083, 1405, 1405, 1084, 1081, 1405, 213, 213, 1405, 213, + 1085, 1405, 768, 1086, 213, 213, 213, 767, 213, 213, 765, 213, 213, 1082, 213, 766, 769, 213, + 1083, 770, 213, 1084, 213, 213, 213, 213, 213, 213, 1085, 771, 768, 1086, 1087, 213, 213, 1405, + 213, 213, 1088, 213, 213, 1089, 1090, 213, 769, 1405, 1091, 770, 213, 772, 213, 213, 1405, 213, + 213, 1092, 213, 771, 773, 1405, 1087, 213, 1093, 213, 213, 213, 1088, 213, 213, 1089, 1090, 213, + 775, 213, 1091, 213, 213, 772, 1094, 1095, 213, 213, + + 213, 1092, 213, 213, 773, 213, 1096, 213, 1093, 213, 213, 1097, 213, 774, 213, 1098, 1099, 213, + 775, 213, 1100, 213, 213, 1405, 1094, 1095, 213, 1101, 213, 1405, 1102, 213, 213, 213, 1096, 213, + 776, 1405, 213, 1097, 213, 774, 213, 1098, 1099, 213, 777, 213, 1100, 1103, 1104, 213, 213, 1405, + 1105, 1101, 1106, 213, 1102, 1107, 213, 213, 1108, 780, 776, 213, 1109, 213, 1405, 1186, 213, 213, + 1405, 1405, 777, 213, 1405, 1103, 1104, 213, 213, 213, 1105, 1405, 1106, 213, 1405, 1107, 1187, 213, + 1108, 780, 1405, 213, 1109, 213, 778, 1186, 213, 213, + + 213, 213, 213, 781, 213, 213, 779, 1405, 213, 213, 213, 213, 1405, 1405, 782, 213, 1187, 1405, + 213, 213, 213, 213, 1405, 1405, 778, 213, 213, 1405, 213, 213, 213, 781, 213, 213, 779, 213, + 213, 1188, 213, 213, 213, 213, 782, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1189, 213, + 213, 783, 1190, 784, 213, 1191, 213, 213, 1192, 213, 213, 1188, 1405, 785, 213, 213, 1405, 213, + 213, 213, 213, 213, 1405, 1405, 213, 213, 1189, 213, 213, 783, 1190, 784, 213, 1191, 213, 213, + 1192, 213, 213, 1405, 786, 785, 213, 1193, 213, 213, + + 213, 213, 213, 213, 787, 213, 213, 1194, 1195, 213, 213, 213, 1405, 213, 1196, 1405, 1405, 789, + 788, 213, 1197, 213, 786, 213, 213, 1193, 213, 213, 213, 213, 1198, 1199, 787, 213, 213, 1194, + 1195, 213, 213, 213, 790, 213, 1196, 213, 213, 789, 788, 213, 1197, 213, 213, 213, 1200, 213, + 1201, 213, 791, 1202, 1198, 1199, 213, 1405, 1203, 213, 1405, 213, 1204, 213, 790, 794, 1205, 213, + 213, 1206, 213, 213, 1405, 1405, 213, 213, 1200, 213, 1201, 1405, 791, 1202, 1207, 1405, 213, 800, + 1203, 213, 792, 213, 1204, 213, 213, 794, 1205, 213, + + 213, 1206, 213, 213, 797, 213, 213, 213, 1208, 213, 213, 793, 1405, 1209, 1207, 213, 213, 800, + 1210, 1405, 792, 213, 1405, 1211, 213, 1212, 1405, 213, 213, 1213, 1405, 213, 797, 213, 213, 798, + 1208, 213, 213, 793, 213, 1209, 213, 213, 213, 795, 1210, 213, 799, 1405, 213, 1211, 213, 1212, + 213, 213, 213, 1213, 796, 1214, 213, 213, 1215, 798, 1405, 1216, 213, 1217, 213, 1218, 213, 1219, + 1220, 795, 1405, 213, 799, 801, 213, 1405, 213, 213, 213, 213, 213, 213, 796, 1214, 213, 213, + 1215, 213, 213, 1216, 213, 1217, 213, 1218, 1221, 1219, + + 1220, 213, 213, 1405, 1405, 801, 1222, 802, 1223, 213, 1224, 213, 213, 213, 803, 213, 804, 1225, + 213, 213, 213, 213, 1226, 213, 213, 213, 1221, 213, 213, 213, 213, 213, 805, 1405, 1222, 802, + 1223, 213, 1224, 213, 213, 1227, 803, 213, 804, 1225, 213, 1405, 806, 213, 1226, 213, 213, 213, + 1405, 213, 213, 213, 213, 213, 805, 213, 808, 1405, 1405, 213, 213, 807, 213, 1227, 1405, 213, + 213, 1405, 1405, 213, 806, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 213, 1228, 213, 213, + 808, 213, 213, 1405, 213, 807, 213, 1405, 213, 213, + + 213, 809, 213, 213, 1229, 213, 213, 213, 213, 213, 213, 213, 213, 811, 1230, 1228, 213, 213, + 1278, 213, 213, 812, 213, 213, 1405, 810, 213, 213, 213, 809, 213, 1405, 1229, 213, 213, 213, + 213, 1405, 1405, 213, 213, 811, 1230, 1405, 1405, 213, 1278, 1405, 1405, 812, 213, 213, 213, 810, + 213, 213, 213, 1405, 1280, 213, 813, 213, 1405, 213, 213, 213, 815, 1405, 213, 1281, 213, 814, + 213, 213, 213, 213, 816, 1282, 213, 213, 213, 1283, 213, 213, 213, 818, 1280, 213, 813, 1405, + 213, 213, 213, 213, 815, 213, 213, 1281, 213, 814, + + 213, 213, 213, 213, 816, 1282, 213, 213, 213, 1283, 213, 213, 213, 818, 1405, 213, 817, 819, + 213, 1405, 213, 213, 213, 213, 1405, 1284, 213, 213, 213, 1405, 820, 1405, 213, 1405, 1285, 213, + 213, 213, 213, 1405, 213, 1286, 213, 213, 817, 819, 1287, 213, 213, 213, 213, 213, 821, 1284, + 213, 213, 213, 823, 820, 213, 213, 822, 1285, 213, 1405, 213, 213, 213, 213, 1286, 213, 213, + 213, 213, 1287, 213, 213, 213, 1288, 213, 821, 1405, 824, 826, 825, 823, 1289, 213, 1290, 822, + 1405, 1291, 213, 213, 213, 213, 213, 1292, 828, 213, + + 213, 213, 1293, 213, 213, 213, 1288, 1294, 213, 827, 824, 826, 825, 213, 1289, 1295, 1290, 213, + 830, 1291, 213, 213, 1296, 213, 213, 1292, 828, 213, 213, 213, 1293, 213, 213, 213, 213, 1294, + 213, 827, 213, 213, 213, 213, 213, 1295, 1297, 213, 830, 213, 939, 829, 1296, 213, 213, 1405, + 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1298, 213, 213, 213, 1299, 213, 213, + 1297, 213, 1300, 213, 939, 829, 213, 213, 213, 213, 831, 213, 1326, 1328, 213, 832, 213, 1329, + 833, 213, 835, 1298, 834, 213, 213, 1299, 213, 213, + + 213, 213, 1300, 213, 1330, 1405, 213, 213, 213, 213, 831, 213, 1326, 1328, 213, 832, 213, 1329, + 833, 213, 835, 1405, 834, 213, 213, 1331, 213, 213, 213, 213, 1332, 213, 1330, 836, 213, 1333, + 213, 1334, 1335, 213, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 1405, 1405, 1405, 1331, + 1405, 213, 1405, 213, 1332, 1405, 1405, 836, 213, 1333, 1405, 1334, 1335, 213, 575, 575, 575, 575, + 575, 575, 575, 575, 575, 575, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, 707, 707, + + 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 213, 1336, 213, 213, 213, 213, 937, 213, 213, 938, 213, 1337, 213, 1405, 213, 213, + 1279, 1279, 1405, 1338, 1405, 1355, 1356, 1405, 940, 1405, 1405, 1405, 213, 1336, 213, 213, 213, 213, + 937, 213, 213, 938, 213, 1337, 213, 213, 213, 213, 1405, 213, 213, 1338, 942, 1355, 1356, 213, + 940, 213, 941, 943, 1327, 1357, 213, 213, 213, 213, + + 944, 1358, 1405, 213, 1405, 213, 1405, 213, 1405, 1359, 213, 213, 213, 213, 942, 1303, 1279, 213, + 1362, 213, 941, 943, 1327, 1357, 213, 213, 213, 213, 944, 1358, 945, 213, 213, 213, 213, 946, + 213, 1359, 213, 213, 213, 213, 213, 213, 1354, 1354, 1362, 1405, 1405, 213, 213, 1369, 213, 1370, + 1405, 1341, 1373, 1405, 945, 213, 213, 1376, 213, 946, 213, 213, 1405, 213, 213, 213, 213, 213, + 213, 1361, 1354, 213, 213, 213, 213, 1369, 213, 1370, 213, 1341, 1373, 213, 213, 213, 1368, 1376, + 213, 947, 213, 213, 948, 213, 213, 213, 1405, 213, + + 213, 1378, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1380, 213, 213, 213, 1368, 1372, + 213, 947, 213, 213, 948, 213, 213, 949, 213, 213, 213, 1378, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 950, 1380, 213, 952, 213, 1405, 1372, 213, 213, 213, 213, 1405, 1382, 1384, 949, + 213, 1405, 213, 1386, 213, 213, 213, 1388, 1390, 213, 213, 213, 213, 950, 213, 213, 952, 1392, + 213, 1394, 213, 213, 213, 953, 213, 1382, 1384, 213, 1396, 951, 1405, 1386, 1405, 213, 213, 1388, + 1390, 1405, 1398, 1405, 1405, 1405, 213, 213, 213, 1392, + + 213, 1394, 213, 1405, 1405, 953, 213, 1405, 213, 213, 1396, 951, 955, 954, 213, 213, 213, 213, + 213, 213, 1398, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, 956, 213, 1405, 1405, + 213, 213, 213, 1405, 955, 954, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 1405, 213, 1405, + 1405, 213, 213, 1405, 213, 213, 956, 213, 959, 213, 958, 213, 213, 213, 213, 213, 1405, 213, + 1405, 213, 213, 213, 957, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 960, 213, 961, + 959, 213, 958, 213, 1405, 213, 213, 213, 213, 1405, + + 213, 213, 213, 213, 957, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 213, 960, 213, 961, + 962, 1405, 963, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 1405, 213, 1405, 1405, 213, 213, 1405, 1405, 1405, 962, 1405, 963, 1405, 213, 213, 213, 213, + 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 964, 1405, 1405, 1405, 213, 213, 1405, + 213, 213, 965, 213, 1405, 213, 1405, 213, 213, 213, 213, 966, 1405, 213, 213, 213, 1405, 213, + 1405, 213, 1405, 964, 213, 1405, 967, 1405, 213, 213, + + 213, 213, 965, 213, 1405, 213, 1405, 213, 213, 213, 213, 966, 1405, 213, 213, 213, 1405, 213, + 213, 213, 213, 969, 213, 1405, 967, 213, 968, 213, 1405, 970, 213, 971, 213, 1405, 213, 213, + 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 969, 1405, 213, 213, 213, + 968, 1405, 1405, 970, 213, 971, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 213, 213, + 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, + 1405, 213, 213, 213, 973, 974, 1405, 972, 1405, 213, + + 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, 975, 213, 1405, 213, 213, + 1405, 213, 213, 213, 973, 974, 213, 972, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, + 1405, 213, 213, 213, 1405, 975, 213, 976, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, + 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 976, + 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 977, 213, 213, 213, 213, 978, + 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, + + 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 977, 1405, 979, 213, 213, 978, + 213, 213, 213, 213, 213, 1405, 980, 213, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 213, 213, + 213, 213, 213, 1405, 1405, 213, 979, 213, 213, 213, 1405, 213, 982, 1405, 1405, 213, 980, 213, + 981, 213, 213, 1405, 1405, 983, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, + 213, 213, 984, 213, 982, 1405, 1405, 213, 213, 213, 981, 213, 1405, 1405, 1405, 983, 213, 213, + 990, 1405, 1405, 213, 213, 1405, 213, 1405, 213, 213, + + 213, 213, 984, 213, 1405, 987, 213, 213, 213, 985, 213, 213, 213, 1405, 213, 1405, 213, 213, + 990, 1405, 986, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 987, 213, 213, + 1405, 985, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 1405, 986, 213, 213, 213, 213, 213, + 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 1405, 213, + 213, 988, 1405, 1405, 1405, 213, 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, + + 213, 988, 989, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 213, + 991, 1405, 992, 993, 213, 1405, 213, 213, 213, 213, 213, 1405, 989, 213, 213, 1405, 1405, 213, + 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 991, 1405, 992, 993, 213, 1405, 1405, 213, + 994, 213, 213, 213, 213, 213, 213, 1405, 1405, 995, 213, 213, 213, 1405, 1405, 213, 213, 1405, + 1405, 1405, 213, 1405, 1405, 1405, 996, 213, 1405, 1405, 994, 213, 213, 213, 213, 213, 213, 213, + 1405, 995, 213, 213, 213, 1405, 1405, 213, 213, 213, + + 998, 1405, 213, 997, 213, 213, 996, 213, 1405, 213, 213, 213, 213, 1405, 1405, 213, 1405, 213, + 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, 998, 1405, 213, 997, 213, 213, 1405, 1405, + 213, 213, 213, 999, 1405, 213, 1405, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 213, 213, 213, + 213, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 1405, 213, 1000, 213, 999, 1405, 213, 1002, 1405, + 213, 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 1001, 213, 213, 1405, 213, + 213, 213, 1003, 1000, 213, 213, 213, 213, 1002, 1405, + + 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 1405, 213, 213, 1001, 213, 213, 1405, 1405, + 1004, 213, 1003, 1405, 213, 213, 213, 213, 213, 1005, 1405, 213, 213, 213, 213, 1006, 1405, 213, + 1405, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 1004, 1405, 213, 1405, 213, 213, 213, 213, + 213, 1005, 1405, 1405, 213, 213, 213, 1006, 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, + 213, 1405, 1405, 1007, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, + 213, 213, 213, 1008, 213, 213, 213, 213, 213, 1405, + + 213, 1009, 1010, 1007, 1405, 213, 1405, 213, 213, 1405, 213, 1011, 1405, 213, 213, 213, 213, 213, + 213, 213, 213, 1008, 1405, 213, 213, 213, 213, 213, 1405, 1009, 1010, 213, 1405, 213, 213, 213, + 213, 213, 1405, 1011, 213, 1405, 213, 1405, 213, 1405, 213, 213, 1012, 213, 213, 1013, 213, 1015, + 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 1405, 1405, 213, 1405, 1405, 1014, + 213, 213, 1405, 213, 1012, 213, 213, 1013, 213, 1015, 213, 1405, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1014, + + 1016, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 213, 1405, 1405, + 213, 1017, 213, 213, 213, 213, 213, 213, 1018, 1405, 1016, 213, 213, 213, 213, 1019, 213, 213, + 1405, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 1405, 1017, 213, 1405, 213, 213, 213, 213, + 1018, 1405, 1405, 213, 1020, 213, 213, 1019, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, + 213, 1405, 1405, 1405, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 1020, 213, 1405, 1405, + 213, 213, 1405, 1405, 213, 1405, 213, 213, 1405, 213, + + 213, 213, 213, 1405, 213, 1405, 1021, 213, 1405, 1022, 213, 213, 1023, 213, 213, 213, 1405, 1405, + 1405, 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 1021, 1405, + 1405, 1022, 1405, 213, 1023, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, + 1024, 1405, 213, 213, 213, 1405, 1025, 213, 213, 1405, 213, 213, 1027, 1405, 1405, 213, 213, 1026, + 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 1024, 1405, 213, 213, 213, 1405, 1025, 213, + 213, 1405, 213, 213, 1027, 1405, 1405, 213, 213, 1026, + + 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 1028, 1030, 1029, 213, 213, 213, 1405, 213, 213, + 213, 1405, 213, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 1405, + 213, 1028, 1030, 1029, 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, 213, 1031, 213, + 213, 1405, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, + 1405, 213, 213, 1405, 1405, 213, 213, 1032, 1031, 213, 213, 213, 213, 1405, 1405, 213, 213, 1033, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + + 213, 213, 213, 1405, 1405, 1405, 1405, 1032, 1405, 213, 213, 213, 213, 213, 1405, 213, 1405, 1033, + 213, 1405, 1034, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1112, 1111, 1034, 1405, 213, 1405, 213, 213, + 213, 1405, 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, + 213, 213, 1112, 1111, 213, 1405, 213, 1405, 1405, 213, 213, 1113, 213, 213, 213, 213, 1405, 213, + 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, + + 1114, 1405, 213, 213, 213, 213, 1405, 1405, 1115, 213, 213, 1113, 213, 213, 213, 213, 213, 213, + 1405, 1405, 213, 213, 213, 213, 1116, 213, 1405, 1405, 1114, 213, 213, 213, 213, 213, 1405, 213, + 1115, 1117, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, 1116, 213, + 213, 1405, 1118, 213, 1405, 213, 213, 213, 213, 213, 213, 1117, 213, 213, 213, 213, 1119, 213, + 213, 213, 213, 1121, 1405, 213, 1120, 213, 1405, 1405, 213, 1405, 1118, 213, 1405, 213, 213, 213, + 213, 1405, 213, 1405, 213, 213, 213, 213, 1119, 1405, + + 213, 213, 213, 1121, 1405, 213, 1120, 213, 213, 1405, 1122, 213, 1405, 213, 213, 213, 213, 1405, + 1123, 1405, 213, 213, 1405, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 213, 1405, 213, 213, 1405, + 213, 1124, 1122, 213, 1405, 1405, 213, 213, 1405, 1405, 1123, 213, 213, 213, 1125, 1405, 213, 1405, + 213, 213, 1127, 1405, 213, 213, 213, 1126, 213, 213, 213, 1124, 213, 213, 213, 1405, 1405, 213, + 1405, 213, 213, 213, 213, 213, 1125, 1405, 1405, 1405, 213, 1405, 1127, 1405, 213, 213, 213, 1126, + 1405, 213, 213, 213, 213, 213, 213, 1128, 1405, 213, + + 1405, 213, 213, 213, 213, 213, 1131, 213, 1405, 1405, 213, 213, 213, 213, 1130, 213, 213, 213, + 1405, 213, 1405, 213, 1129, 1405, 213, 1128, 213, 213, 1405, 1405, 1405, 213, 1405, 213, 1131, 213, + 1405, 1132, 213, 213, 213, 213, 1130, 213, 213, 213, 1405, 213, 1405, 1405, 1129, 1405, 213, 213, + 213, 213, 1133, 1405, 213, 213, 213, 213, 213, 213, 1405, 1132, 213, 1405, 213, 213, 213, 213, + 213, 1134, 1135, 1405, 213, 1136, 213, 213, 1405, 213, 213, 1405, 1133, 1405, 213, 213, 213, 213, + 213, 213, 1405, 1137, 213, 1405, 213, 213, 213, 213, + + 213, 1134, 1135, 1405, 213, 1136, 213, 213, 1405, 213, 213, 1405, 1138, 1405, 213, 213, 213, 213, + 213, 213, 213, 1137, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 1405, 1405, 1405, 213, 213, + 213, 213, 1405, 1405, 1138, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, + 213, 1405, 213, 1405, 1140, 1139, 213, 213, 213, 213, 213, 1142, 213, 213, 1405, 213, 213, 1405, + 213, 213, 213, 1405, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 1141, 1140, 1139, 213, 213, + 213, 1405, 1405, 1142, 213, 213, 1405, 1405, 213, 213, + + 213, 213, 213, 1405, 213, 213, 1143, 1144, 213, 1405, 1405, 213, 213, 1141, 213, 1405, 1405, 1405, + 213, 213, 1405, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, 1143, 1144, + 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, + 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1145, 213, 213, 213, 213, 1405, 1405, 213, 213, + 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, + 213, 1145, 1405, 213, 1405, 213, 1405, 213, 213, 213, + + 213, 213, 213, 213, 213, 1146, 1147, 213, 1148, 213, 213, 1149, 213, 213, 1405, 1405, 213, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 213, 213, 213, 1150, 213, 213, 213, 213, 1146, 1147, 213, + 1148, 213, 213, 1149, 213, 213, 1405, 213, 213, 213, 1405, 1405, 1405, 1405, 213, 1405, 1151, 1405, + 213, 213, 1150, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 213, 1405, 213, 213, 213, 213, 1151, 213, 1405, 213, 213, 213, 213, 213, 213, 213, + 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, + + 213, 213, 213, 213, 213, 213, 1152, 213, 1153, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, + 1405, 1154, 1405, 1405, 1405, 1405, 1405, 1405, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1152, 1405, + 1153, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, 1405, 1154, 1405, 1405, 213, 1155, 1405, 1156, + 213, 213, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, + 1405, 213, 1405, 1405, 1405, 1405, 213, 1155, 1405, 1156, 213, 213, 213, 213, 213, 213, 213, 213, + 1157, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, + + 1405, 213, 1405, 1158, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 1157, 1405, 1159, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 1158, 213, 213, 213, 213, + 213, 213, 1405, 213, 1405, 213, 213, 213, 1160, 213, 213, 1405, 1159, 213, 213, 213, 213, 213, + 1405, 213, 213, 1405, 1405, 1161, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, + 1160, 213, 213, 213, 1173, 213, 213, 213, 213, 213, 1163, 213, 213, 213, 213, 1161, 1162, 1405, + 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, + + 1405, 1164, 213, 213, 1173, 213, 1405, 213, 213, 213, 1163, 213, 1165, 213, 213, 213, 1162, 1405, + 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1164, 213, 1405, 1405, 213, 1166, 213, + 213, 1167, 213, 213, 1165, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, + 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 1166, 213, 1405, 1167, 213, 1168, 213, 213, 213, 1405, + 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, + 1405, 1405, 1169, 1405, 213, 1168, 213, 213, 213, 1405, + + 213, 1405, 1405, 213, 213, 213, 213, 1170, 1405, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, + 1405, 1405, 1169, 1405, 213, 213, 1405, 213, 213, 1405, 1171, 213, 1172, 213, 213, 213, 213, 1170, + 1405, 1405, 213, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, 213, 1405, 213, + 213, 213, 1171, 213, 1172, 1174, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, + 213, 1405, 1405, 213, 1175, 213, 1405, 1176, 213, 213, 213, 213, 1405, 1405, 1405, 1174, 213, 1405, + 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1177, + + 1405, 1405, 213, 213, 1175, 1405, 1405, 1176, 213, 213, 213, 1178, 213, 1405, 1405, 1405, 213, 213, + 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 1177, 1405, 1405, 213, 213, 1405, 1405, 1405, 1405, + 213, 213, 213, 1178, 213, 1405, 1405, 1179, 213, 213, 1405, 213, 1405, 213, 213, 1405, 213, 213, + 213, 1180, 213, 1181, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 1179, + 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1180, 213, 1181, 213, 1182, 213, 213, + 213, 213, 213, 1405, 213, 213, 213, 1405, 1183, 1405, + + 1405, 1184, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 1182, 213, 1405, + 1405, 213, 213, 213, 1405, 213, 213, 213, 1183, 1405, 1405, 1184, 213, 213, 1405, 213, 1405, 213, + 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 1405, 213, 1232, 213, 213, 213, + 213, 213, 1405, 1233, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, + 1405, 1405, 213, 1405, 1405, 1405, 1232, 213, 1405, 213, 213, 213, 213, 1233, 213, 213, 213, 1234, + 213, 213, 213, 1235, 213, 213, 213, 213, 213, 213, + + 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 1237, 213, 213, 213, 213, 213, 1234, + 1405, 213, 213, 1235, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1236, + 1405, 1405, 213, 1237, 213, 213, 1405, 1238, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 213, 1405, + 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 1236, 213, 1405, 213, 1405, 213, 213, 1405, 1238, + 213, 213, 213, 1405, 1405, 1241, 213, 213, 1239, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, + 1240, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, + + 213, 213, 213, 1405, 1405, 1241, 1405, 213, 1239, 1405, 1405, 1405, 213, 1242, 213, 213, 213, 213, + 1240, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, + 1243, 1244, 1405, 213, 213, 1242, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, + 213, 1405, 213, 1405, 213, 213, 213, 1405, 213, 213, 1243, 1244, 1405, 213, 213, 213, 1405, 213, + 213, 1405, 1245, 213, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, + 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, + + 1246, 1405, 1245, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, + 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 1246, 213, 1405, 213, 1405, 213, 1405, 1405, + 213, 213, 213, 1248, 1405, 213, 1247, 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 1405, + 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, 213, 213, 1248, 1405, 213, 1247, 213, + 213, 213, 213, 1405, 213, 213, 213, 1249, 213, 1405, 213, 213, 213, 1405, 1250, 1405, 213, 1405, + 213, 213, 213, 1251, 213, 1405, 1405, 1405, 213, 213, + + 1405, 213, 213, 213, 213, 1405, 213, 1249, 1405, 1405, 213, 213, 1405, 1405, 1250, 213, 213, 213, + 213, 213, 213, 1251, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, + 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, + 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, + 213, 213, 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 1252, 213, 1405, 1405, 213, 213, 213, + 213, 1405, 213, 1253, 213, 213, 213, 213, 1405, 1405, + + 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 1405, 1254, 1252, 213, 213, 213, 1405, 213, 213, + 213, 213, 213, 1253, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 1405, 213, 1255, + 213, 1405, 1254, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, + 213, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1255, 213, 1405, 1405, 213, 213, 1405, 1256, 213, + 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1257, 1405, + 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 1256, 213, + + 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1257, 1405, + 213, 1405, 213, 1405, 1259, 1405, 213, 213, 213, 213, 213, 213, 1405, 213, 1258, 213, 213, 1405, + 213, 1260, 213, 213, 1405, 1405, 1405, 213, 1405, 1405, 213, 1261, 1405, 1405, 1259, 213, 213, 213, + 213, 1405, 213, 213, 213, 213, 1258, 213, 213, 1405, 213, 1260, 213, 213, 213, 1405, 213, 213, + 1263, 1405, 1405, 1261, 1405, 213, 1262, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 1405, 1264, 1265, 213, 213, 213, 1405, 213, 213, + + 1263, 213, 213, 213, 213, 213, 1262, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, + 213, 1405, 1264, 1265, 213, 1266, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, + 213, 213, 1405, 1405, 1267, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 1268, 1266, 1405, 1405, + 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, 1405, 1267, 213, 1405, 1405, + 1405, 213, 213, 213, 213, 213, 1268, 1269, 1405, 213, 213, 213, 1405, 1270, 213, 213, 213, 1405, + 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1271, + + 213, 1405, 213, 213, 1405, 213, 1405, 1269, 213, 213, 213, 1405, 213, 1270, 213, 1405, 1405, 213, + 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 1271, 213, 1405, 1272, 213, 1405, 213, 1405, 213, + 213, 213, 213, 213, 213, 213, 213, 1273, 1274, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, + 213, 1405, 1405, 1405, 1272, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 1273, + 1274, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, + 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, + + 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 1276, 213, 213, + 1275, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 1405, 213, 213, 213, 213, 213, 1276, 213, 213, 1275, 213, 1405, 213, 213, 213, 213, 1405, + 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, + 213, 1405, 1405, 213, 1302, 213, 1405, 213, 213, 1405, 1303, 1279, 213, 1405, 213, 1405, 1405, 213, + 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, + + 213, 1405, 1405, 213, 1302, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1304, 1405, + 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1305, 1405, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 1405, 213, 1304, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 1405, + 213, 213, 213, 213, 213, 1305, 213, 1306, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, + 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 1405, 213, 213, 1307, 1405, 213, 213, 1306, + 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, + + 213, 213, 213, 1308, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 1307, 213, 213, 213, 1405, + 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1308, 1405, 213, 213, 213, + 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1309, 1405, 1405, 213, 213, 213, 1405, 213, 1405, + 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 1405, 213, 1310, 1405, 213, 1405, 1405, 1405, 213, + 213, 1309, 213, 1405, 213, 1311, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, + 213, 1405, 213, 1310, 213, 213, 213, 1405, 1405, 1405, + + 213, 213, 213, 1405, 213, 1311, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 213, + 1405, 213, 213, 213, 213, 1405, 213, 1312, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 1313, + 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1314, 1405, 1405, 1312, + 213, 213, 1405, 1405, 1405, 213, 213, 1405, 213, 1313, 1315, 1405, 1405, 213, 213, 213, 1405, 1405, + 213, 213, 213, 213, 1405, 213, 1314, 213, 1405, 213, 213, 213, 1405, 1316, 213, 213, 213, 1405, + 213, 213, 1315, 1405, 213, 1405, 213, 213, 1405, 1405, + + 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1316, 213, 213, 1405, 1405, + 213, 213, 213, 1405, 213, 1405, 213, 213, 1317, 1405, 1405, 213, 213, 1405, 1318, 213, 213, 213, + 1405, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, + 1317, 1405, 1405, 213, 213, 1405, 1318, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 1405, 1405, + 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1319, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 1405, 213, 213, 1405, 1405, 1320, 213, 213, + + 1405, 1405, 213, 213, 213, 1405, 213, 1321, 213, 213, 1319, 1405, 1405, 213, 213, 213, 1405, 213, + 213, 213, 1405, 213, 213, 1405, 1405, 1320, 213, 213, 1405, 1323, 213, 213, 213, 213, 213, 1321, + 213, 213, 1322, 213, 1405, 213, 213, 1324, 213, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, + 213, 1405, 1405, 1323, 213, 1405, 213, 213, 1405, 213, 213, 213, 1322, 213, 1405, 213, 213, 1324, + 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1346, 1405, 1340, 1405, 213, + 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, + + 1405, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 213, 213, 213, 1346, 213, 1340, 1405, 213, + 213, 213, 213, 1405, 213, 213, 213, 1342, 1405, 213, 213, 213, 213, 213, 1405, 213, 213, 1405, + 1405, 213, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1342, + 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1343, 213, 213, 213, 213, 1405, + 213, 1405, 213, 213, 1405, 213, 213, 213, 1344, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, + 1405, 1405, 213, 213, 1343, 1405, 213, 213, 213, 213, + + 213, 1405, 213, 213, 213, 213, 1405, 213, 1344, 213, 213, 213, 213, 213, 1347, 213, 1405, 213, + 1345, 213, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1348, 213, 213, 213, 213, 213, + 1405, 213, 213, 213, 213, 1405, 1347, 213, 1405, 213, 1345, 213, 213, 213, 213, 1405, 1405, 213, + 213, 213, 213, 1405, 1348, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, + 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1350, 1405, 213, 213, + 1349, 1405, 1405, 213, 213, 213, 213, 1405, 213, 213, + + 1351, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, 1350, 1405, 213, 1405, + 1349, 1405, 1405, 213, 1405, 213, 213, 1352, 213, 1363, 1351, 213, 213, 213, 1405, 213, 213, 1405, + 213, 213, 1405, 213, 1361, 1354, 1405, 1405, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 213, 1352, + 213, 1363, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1364, 1405, 213, 213, + 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, + 213, 213, 1405, 213, 213, 213, 1364, 1405, 213, 213, + + 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1365, + 213, 1405, 1405, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, + 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 1365, 213, 1405, 1405, 213, 213, 213, 1405, 213, + 1405, 1405, 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1366, 213, 1405, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, + 213, 213, 1405, 1405, 1366, 1405, 213, 213, 213, 213, + + 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1374, 213, 213, + 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 213, 1405, 213, 1405, + 1405, 213, 1405, 1405, 1405, 213, 213, 1374, 213, 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, + 1405, 1405, 1405, 1405, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 92, 1405, 1405, 92, 92, 92, 92, 92, 92, + 92, 98, 98, 1405, 98, 106, 106, 106, 192, 1405, + + 192, 192, 192, 192, 192, 192, 192, 194, 194, 194, 1405, 194, 194, 194, 194, 194, 194, 196, + 1405, 196, 196, 196, 196, 196, 196, 196, 196, 199, 1405, 199, 199, 199, 199, 199, 199, 199, + 199, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 299, 1405, 299, 299, 299, 299, 299, + 299, 299, 299, 96, 1405, 96, 304, 1405, 304, 307, 1405, 307, 575, 1405, 575, 577, 1405, 577, + 7, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}; + +static const flex_int16_t yy_chk[9253] = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 9, 9, 10, 10, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 16, 18, 19, 19, 19, 21, 21, 23, 1402, 24, 1401, 23, 1400, 31, 32, 1399, 24, + 23, 1397, 18, 51, 51, 1395, 24, 44, 44, 24, + + 23, 1393, 24, 1391, 26, 25, 26, 1389, 23, 25, 24, 26, 23, 25, 31, 32, 26, 24, + 23, 25, 18, 22, 25, 22, 24, 44, 44, 24, 23, 22, 24, 22, 26, 25, 26, 22, + 22, 25, 1387, 26, 28, 25, 45, 1385, 26, 58, 28, 25, 1383, 22, 25, 22, 29, 52, + 52, 1381, 58, 22, 37, 22, 29, 63, 63, 22, 22, 27, 29, 33, 28, 37, 45, 33, + 1379, 27, 28, 37, 27, 33, 96, 27, 29, 97, 27, 30, 107, 27, 37, 1377, 29, 30, + 30, 30, 1375, 27, 29, 33, 30, 37, 34, 33, + + 35, 27, 34, 37, 27, 33, 96, 27, 34, 97, 27, 30, 107, 27, 35, 90, 90, 30, + 30, 30, 35, 35, 1371, 36, 30, 1367, 34, 1360, 35, 39, 34, 36, 43, 39, 108, 36, + 34, 39, 36, 36, 43, 111, 35, 39, 1353, 42, 1339, 42, 35, 35, 42, 36, 61, 61, + 61, 99, 99, 39, 98, 36, 43, 39, 108, 36, 1325, 39, 36, 36, 43, 111, 1301, 39, + 40, 42, 40, 42, 98, 40, 42, 112, 40, 114, 40, 115, 40, 40, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 1277, 118, 109, 1231, + + 40, 1185, 40, 1110, 98, 40, 109, 112, 40, 114, 40, 115, 40, 40, 41, 1035, 121, 70, + 41, 70, 125, 41, 41, 70, 70, 118, 109, 110, 41, 70, 110, 41, 197, 197, 109, 303, + 303, 305, 305, 1193, 1193, 936, 41, 120, 121, 70, 41, 70, 125, 41, 41, 70, 70, 120, + 126, 110, 41, 70, 110, 41, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 120, + 127, 128, 128, 837, 113, 113, 60, 1326, 1326, 120, 126, 705, 573, 438, 302, 299, 208, 202, + 113, 199, 119, 119, 119, 71, 119, 192, 129, 71, + + 127, 128, 128, 71, 113, 113, 60, 64, 64, 71, 64, 64, 64, 64, 64, 64, 64, 64, + 113, 71, 119, 119, 119, 71, 119, 117, 129, 71, 64, 64, 64, 71, 117, 122, 64, 73, + 64, 71, 122, 73, 131, 132, 64, 133, 64, 73, 134, 71, 64, 64, 101, 135, 134, 117, + 95, 73, 136, 92, 64, 89, 117, 122, 64, 73, 64, 88, 122, 73, 131, 132, 64, 133, + 64, 73, 134, 137, 64, 64, 74, 135, 134, 62, 74, 73, 136, 64, 65, 65, 74, 65, + 65, 65, 65, 65, 65, 65, 65, 56, 74, 138, + + 54, 75, 140, 137, 53, 75, 74, 65, 65, 65, 74, 75, 141, 143, 65, 76, 74, 144, + 65, 76, 49, 75, 146, 147, 65, 76, 74, 138, 80, 75, 140, 148, 80, 75, 65, 76, + 47, 65, 80, 75, 141, 143, 65, 76, 20, 144, 65, 76, 80, 75, 146, 147, 65, 76, + 14, 139, 80, 11, 139, 148, 80, 7, 65, 76, 65, 66, 80, 81, 4, 66, 149, 81, + 66, 66, 3, 81, 80, 152, 150, 66, 150, 81, 66, 139, 0, 66, 139, 153, 85, 66, + 0, 81, 85, 66, 0, 81, 85, 66, 149, 81, + + 66, 66, 85, 81, 0, 152, 150, 66, 150, 81, 66, 155, 85, 66, 0, 153, 85, 66, + 67, 81, 85, 84, 67, 84, 85, 84, 67, 154, 84, 157, 85, 156, 67, 84, 156, 67, + 0, 154, 158, 155, 85, 0, 67, 0, 159, 0, 67, 0, 161, 84, 67, 84, 0, 84, + 67, 154, 84, 157, 0, 156, 67, 84, 156, 67, 86, 154, 158, 86, 86, 87, 67, 68, + 159, 87, 86, 68, 161, 162, 68, 87, 68, 68, 124, 124, 86, 68, 124, 163, 164, 87, + 68, 68, 86, 0, 165, 86, 86, 87, 0, 68, + + 0, 87, 86, 68, 0, 162, 68, 87, 68, 68, 124, 124, 86, 68, 124, 163, 164, 87, + 68, 68, 69, 123, 165, 123, 167, 169, 123, 69, 69, 0, 171, 69, 123, 0, 69, 174, + 175, 69, 166, 123, 69, 0, 166, 176, 130, 177, 130, 0, 69, 123, 130, 123, 167, 169, + 123, 69, 69, 130, 171, 69, 123, 130, 69, 174, 175, 69, 166, 123, 69, 72, 166, 176, + 130, 177, 130, 72, 72, 72, 130, 151, 178, 151, 72, 145, 180, 130, 0, 72, 0, 130, + 0, 0, 151, 145, 0, 0, 0, 72, 145, 145, + + 0, 168, 0, 72, 72, 72, 168, 151, 178, 151, 72, 145, 180, 170, 168, 72, 77, 179, + 173, 168, 151, 145, 172, 77, 170, 181, 145, 145, 179, 168, 77, 172, 173, 77, 168, 182, + 77, 77, 0, 172, 0, 170, 168, 0, 77, 179, 173, 168, 183, 185, 172, 77, 170, 181, + 186, 0, 179, 188, 77, 172, 173, 77, 184, 182, 77, 77, 78, 172, 183, 184, 188, 78, + 184, 78, 189, 187, 183, 185, 190, 78, 78, 187, 186, 78, 191, 188, 78, 78, 0, 0, + 184, 0, 0, 0, 78, 0, 183, 184, 188, 78, + + 184, 78, 189, 187, 304, 0, 190, 78, 78, 187, 0, 78, 191, 0, 78, 78, 79, 224, + 213, 224, 214, 214, 213, 79, 224, 214, 310, 79, 213, 224, 79, 214, 304, 79, 312, 313, + 79, 0, 213, 0, 315, 214, 0, 0, 79, 224, 213, 224, 214, 214, 213, 79, 224, 214, + 310, 79, 213, 224, 79, 214, 317, 79, 312, 313, 79, 82, 213, 82, 315, 214, 82, 82, + 0, 82, 216, 82, 216, 82, 82, 0, 222, 216, 216, 0, 222, 318, 216, 82, 317, 0, + 222, 0, 0, 82, 0, 82, 0, 0, 82, 82, + + 222, 82, 216, 82, 216, 82, 82, 215, 222, 216, 216, 215, 222, 318, 216, 82, 83, 215, + 222, 218, 83, 218, 215, 83, 83, 218, 218, 215, 222, 319, 83, 218, 320, 83, 321, 215, + 322, 324, 325, 215, 83, 0, 0, 0, 83, 215, 0, 218, 83, 218, 215, 83, 83, 218, + 218, 215, 326, 319, 83, 218, 320, 83, 321, 0, 322, 324, 325, 0, 83, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 0, 327, 328, 0, 0, 326, 329, 203, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 330, 232, 234, + + 232, 234, 331, 332, 0, 232, 234, 232, 327, 328, 232, 234, 333, 329, 203, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 330, 232, 234, 232, 234, 331, 332, 204, 232, 234, 232, + 0, 0, 232, 234, 333, 0, 0, 0, 334, 238, 239, 238, 239, 335, 336, 0, 238, 239, + 338, 339, 340, 238, 239, 0, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 334, 238, 239, 238, 239, 335, 336, 205, 238, 239, 338, 339, 340, 238, 239, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 0, 342, 0, + + 0, 343, 0, 0, 0, 0, 0, 205, 206, 206, 0, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 217, 219, 221, 217, 323, 342, 323, 221, 343, 221, 219, 217, 219, 217, 221, + 344, 223, 219, 217, 221, 223, 323, 219, 217, 0, 0, 223, 345, 217, 219, 221, 217, 323, + 0, 323, 221, 223, 221, 219, 217, 219, 217, 221, 344, 223, 219, 217, 221, 223, 323, 219, + 217, 220, 220, 223, 345, 225, 347, 220, 348, 220, 337, 349, 350, 223, 220, 220, 225, 0, + 225, 220, 351, 0, 0, 225, 352, 337, 0, 0, + + 225, 220, 220, 0, 0, 225, 347, 220, 348, 220, 337, 349, 350, 0, 220, 220, 225, 227, + 225, 220, 351, 227, 228, 225, 352, 337, 228, 227, 225, 226, 226, 226, 228, 226, 0, 228, + 226, 227, 353, 0, 354, 226, 228, 355, 0, 227, 356, 358, 359, 227, 228, 360, 229, 0, + 228, 227, 229, 226, 226, 226, 228, 226, 229, 228, 226, 227, 353, 229, 354, 226, 228, 355, + 229, 0, 356, 358, 359, 233, 0, 360, 229, 233, 361, 236, 229, 0, 0, 233, 362, 0, + 229, 0, 236, 363, 236, 229, 0, 233, 240, 236, + + 229, 230, 240, 230, 236, 233, 230, 364, 240, 233, 361, 236, 230, 242, 230, 233, 362, 242, + 240, 230, 236, 363, 236, 242, 230, 233, 240, 236, 0, 230, 240, 230, 236, 242, 230, 364, + 240, 0, 365, 366, 230, 242, 230, 367, 368, 242, 240, 230, 357, 369, 370, 242, 230, 231, + 372, 231, 357, 373, 375, 231, 231, 242, 241, 231, 241, 231, 365, 366, 241, 241, 376, 367, + 368, 0, 241, 0, 357, 369, 370, 371, 0, 231, 372, 231, 357, 373, 375, 231, 231, 371, + 241, 231, 241, 231, 235, 235, 241, 241, 376, 243, + + 377, 243, 241, 235, 244, 235, 243, 371, 244, 378, 235, 243, 380, 381, 244, 235, 0, 371, + 0, 382, 379, 0, 235, 235, 244, 384, 385, 243, 377, 243, 379, 235, 244, 235, 243, 387, + 244, 378, 235, 243, 380, 381, 244, 235, 237, 245, 237, 382, 379, 245, 237, 0, 244, 384, + 385, 245, 237, 237, 379, 388, 0, 237, 0, 387, 389, 245, 237, 0, 247, 246, 247, 246, + 237, 245, 237, 247, 246, 245, 237, 246, 247, 246, 0, 245, 237, 237, 390, 388, 249, 237, + 249, 0, 389, 245, 237, 249, 247, 246, 247, 246, + + 249, 250, 0, 247, 246, 250, 391, 246, 247, 246, 248, 250, 248, 253, 390, 253, 249, 248, + 249, 248, 253, 250, 248, 249, 392, 253, 251, 393, 249, 250, 251, 0, 0, 250, 391, 395, + 251, 251, 248, 250, 248, 253, 0, 253, 0, 248, 251, 248, 253, 250, 248, 0, 392, 253, + 251, 393, 254, 0, 251, 394, 254, 0, 0, 395, 251, 251, 254, 0, 0, 255, 260, 397, + 260, 255, 251, 252, 254, 260, 394, 255, 398, 399, 260, 252, 254, 252, 400, 394, 254, 255, + 252, 252, 256, 256, 254, 252, 256, 255, 260, 397, + + 260, 255, 256, 252, 254, 260, 394, 255, 398, 399, 260, 252, 256, 252, 400, 0, 396, 255, + 252, 252, 256, 256, 401, 252, 256, 259, 402, 259, 261, 396, 256, 259, 259, 0, 403, 404, + 261, 259, 261, 405, 256, 257, 406, 261, 396, 257, 407, 257, 261, 257, 401, 257, 408, 259, + 402, 259, 261, 396, 0, 259, 259, 257, 403, 404, 261, 259, 261, 405, 410, 257, 406, 261, + 411, 257, 407, 257, 261, 257, 412, 257, 408, 413, 414, 415, 416, 0, 262, 417, 262, 257, + 258, 418, 258, 262, 262, 264, 410, 264, 262, 419, + + 411, 258, 264, 258, 420, 422, 412, 264, 258, 413, 414, 415, 416, 258, 262, 417, 262, 0, + 258, 418, 258, 262, 262, 264, 0, 264, 262, 419, 423, 258, 264, 258, 420, 422, 265, 264, + 258, 423, 0, 0, 424, 258, 263, 0, 263, 265, 0, 265, 0, 263, 263, 0, 265, 263, + 263, 0, 423, 265, 266, 425, 426, 425, 265, 0, 266, 423, 266, 267, 424, 267, 263, 266, + 263, 265, 267, 265, 266, 263, 263, 267, 265, 263, 263, 268, 427, 265, 266, 425, 426, 425, + 0, 268, 266, 268, 266, 267, 428, 267, 268, 266, + + 429, 430, 267, 268, 266, 270, 269, 267, 269, 270, 431, 268, 427, 269, 269, 270, 432, 0, + 269, 268, 0, 268, 0, 0, 428, 270, 268, 0, 429, 430, 0, 268, 434, 270, 269, 271, + 269, 270, 431, 271, 435, 269, 269, 270, 432, 271, 269, 433, 271, 578, 272, 433, 273, 270, + 272, 271, 273, 579, 272, 274, 434, 274, 273, 271, 272, 580, 274, 271, 435, 581, 582, 274, + 273, 271, 272, 433, 271, 578, 272, 433, 273, 583, 272, 271, 273, 579, 272, 274, 0, 274, + 273, 584, 272, 580, 274, 0, 0, 581, 582, 274, + + 273, 0, 272, 275, 585, 276, 0, 586, 275, 583, 276, 0, 276, 277, 275, 277, 275, 276, + 588, 584, 277, 275, 276, 278, 277, 277, 275, 278, 591, 278, 592, 275, 585, 276, 278, 586, + 275, 593, 276, 278, 276, 277, 275, 277, 275, 276, 588, 0, 277, 275, 276, 278, 277, 277, + 275, 278, 591, 278, 592, 594, 596, 0, 278, 0, 597, 593, 280, 278, 279, 598, 280, 281, + 599, 601, 280, 281, 602, 279, 0, 279, 280, 281, 0, 0, 279, 279, 0, 594, 596, 279, + 280, 281, 597, 0, 280, 603, 279, 598, 280, 281, + + 599, 601, 280, 281, 602, 279, 282, 279, 280, 281, 282, 283, 279, 279, 282, 283, 604, 279, + 280, 281, 282, 283, 285, 603, 283, 285, 605, 0, 0, 285, 282, 283, 284, 0, 282, 285, + 284, 0, 282, 283, 284, 606, 282, 283, 604, 285, 284, 607, 282, 283, 285, 287, 283, 285, + 605, 287, 284, 285, 282, 283, 284, 287, 608, 285, 284, 286, 286, 286, 284, 606, 0, 287, + 286, 285, 284, 607, 0, 286, 288, 287, 609, 289, 288, 287, 284, 289, 288, 612, 288, 287, + 608, 289, 289, 286, 286, 286, 0, 613, 288, 287, + + 286, 289, 614, 615, 290, 286, 288, 616, 609, 289, 288, 290, 617, 289, 288, 612, 288, 618, + 290, 289, 289, 290, 292, 292, 290, 613, 288, 292, 0, 289, 614, 615, 290, 292, 619, 616, + 621, 293, 0, 290, 617, 293, 622, 292, 623, 618, 290, 293, 0, 290, 292, 292, 290, 291, + 0, 292, 291, 293, 0, 0, 291, 292, 619, 291, 621, 293, 291, 624, 0, 293, 622, 292, + 623, 627, 0, 293, 291, 628, 0, 0, 294, 291, 294, 630, 291, 293, 294, 294, 291, 295, + 0, 291, 294, 295, 291, 624, 296, 0, 0, 295, + + 296, 627, 295, 297, 291, 628, 296, 297, 294, 295, 294, 630, 632, 297, 294, 294, 296, 295, + 297, 633, 294, 295, 445, 297, 296, 298, 445, 295, 296, 298, 295, 297, 445, 298, 296, 297, + 449, 295, 449, 298, 632, 297, 445, 449, 296, 634, 297, 633, 449, 298, 445, 297, 635, 298, + 445, 0, 0, 298, 0, 0, 445, 298, 0, 0, 449, 0, 449, 298, 0, 0, 445, 449, + 0, 634, 636, 637, 449, 298, 439, 439, 635, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 440, 440, 440, 440, 440, 440, 440, 440, 440, + + 440, 640, 636, 637, 644, 646, 647, 649, 440, 442, 442, 442, 442, 442, 442, 442, 442, 442, + 442, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 640, 651, 0, 644, 646, 647, 649, + 440, 441, 441, 652, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 446, 447, 448, 0, + 446, 447, 448, 450, 651, 450, 446, 447, 448, 451, 450, 653, 0, 652, 0, 450, 446, 447, + 448, 0, 451, 0, 451, 0, 446, 447, 448, 451, 446, 447, 448, 450, 451, 450, 446, 447, + 448, 451, 450, 653, 452, 0, 452, 450, 446, 447, + + 448, 452, 451, 453, 451, 638, 452, 453, 454, 451, 0, 0, 454, 453, 451, 0, 638, 655, + 454, 656, 0, 0, 452, 453, 452, 457, 657, 457, 454, 452, 0, 453, 457, 638, 452, 453, + 454, 457, 456, 455, 454, 453, 456, 455, 638, 655, 454, 656, 456, 455, 0, 453, 658, 457, + 657, 457, 454, 455, 456, 455, 457, 458, 0, 458, 660, 457, 456, 455, 458, 661, 456, 455, + 0, 458, 0, 0, 456, 455, 650, 650, 658, 663, 0, 0, 664, 455, 456, 455, 665, 458, + 460, 458, 660, 666, 460, 461, 458, 661, 668, 461, + + 460, 458, 459, 460, 459, 461, 650, 650, 459, 663, 460, 461, 664, 0, 459, 461, 665, 0, + 460, 459, 0, 666, 460, 461, 459, 669, 668, 461, 460, 670, 459, 460, 459, 461, 671, 0, + 459, 672, 460, 461, 462, 463, 459, 461, 462, 463, 0, 459, 462, 0, 462, 463, 459, 669, + 464, 674, 463, 670, 464, 0, 462, 463, 671, 465, 464, 672, 0, 465, 462, 463, 675, 465, + 462, 463, 464, 676, 462, 465, 462, 463, 677, 0, 464, 674, 463, 0, 464, 465, 462, 463, + 680, 465, 464, 681, 466, 465, 466, 682, 675, 465, + + 468, 466, 464, 676, 468, 465, 466, 467, 677, 467, 468, 683, 684, 467, 467, 465, 0, 0, + 680, 467, 468, 681, 466, 0, 466, 682, 687, 0, 468, 466, 688, 0, 468, 690, 466, 467, + 691, 467, 468, 683, 684, 467, 467, 469, 470, 469, 470, 467, 468, 471, 469, 470, 692, 471, + 687, 469, 470, 0, 688, 471, 693, 690, 472, 694, 691, 695, 472, 0, 0, 471, 472, 469, + 470, 469, 470, 696, 472, 471, 469, 470, 692, 471, 0, 469, 470, 473, 472, 471, 693, 473, + 472, 694, 475, 695, 472, 473, 475, 471, 472, 697, + + 473, 0, 475, 696, 472, 473, 477, 0, 0, 474, 477, 474, 475, 473, 472, 474, 477, 473, + 698, 0, 475, 474, 478, 473, 475, 478, 477, 697, 473, 478, 475, 474, 476, 473, 477, 478, + 476, 474, 477, 474, 475, 700, 476, 474, 477, 478, 698, 476, 702, 474, 478, 479, 476, 478, + 477, 479, 704, 478, 0, 474, 476, 479, 479, 478, 476, 840, 842, 844, 480, 700, 476, 479, + 480, 478, 0, 476, 702, 481, 480, 479, 476, 481, 482, 479, 704, 845, 482, 481, 480, 479, + 479, 846, 482, 840, 842, 844, 480, 481, 847, 479, + + 480, 848, 482, 483, 0, 481, 480, 483, 484, 481, 482, 483, 484, 845, 482, 481, 480, 483, + 484, 846, 482, 849, 850, 851, 852, 481, 847, 483, 484, 848, 482, 483, 485, 0, 485, 483, + 484, 854, 485, 483, 484, 486, 855, 486, 485, 483, 484, 856, 486, 849, 850, 851, 852, 486, + 485, 483, 484, 0, 0, 857, 485, 487, 485, 487, 858, 854, 485, 0, 487, 486, 855, 486, + 485, 487, 859, 856, 486, 0, 488, 861, 488, 486, 485, 862, 488, 488, 489, 857, 489, 487, + 488, 487, 858, 489, 863, 490, 487, 864, 489, 490, + + 0, 487, 859, 0, 865, 490, 488, 861, 488, 866, 867, 862, 488, 488, 489, 490, 489, 0, + 488, 868, 491, 489, 863, 490, 491, 864, 489, 490, 491, 492, 0, 492, 865, 490, 491, 869, + 492, 866, 867, 870, 871, 492, 0, 490, 491, 493, 874, 868, 491, 493, 494, 0, 491, 493, + 494, 493, 491, 492, 494, 492, 494, 0, 491, 869, 492, 493, 875, 870, 871, 492, 494, 876, + 491, 493, 874, 877, 0, 493, 494, 496, 878, 493, 494, 493, 0, 495, 494, 495, 494, 496, + 0, 496, 495, 493, 875, 0, 496, 495, 494, 876, + + 0, 496, 497, 877, 497, 879, 882, 496, 878, 497, 885, 497, 498, 495, 497, 495, 498, 496, + 498, 496, 495, 0, 886, 498, 496, 495, 0, 0, 498, 496, 497, 888, 497, 879, 882, 0, + 891, 497, 885, 497, 498, 894, 497, 499, 498, 500, 498, 499, 501, 500, 886, 498, 501, 499, + 887, 500, 498, 887, 501, 888, 500, 501, 895, 499, 891, 500, 0, 0, 501, 894, 0, 499, + 0, 500, 896, 499, 501, 500, 897, 0, 501, 499, 887, 500, 898, 887, 501, 0, 500, 501, + 895, 499, 0, 500, 502, 503, 501, 504, 502, 503, + + 502, 504, 896, 899, 502, 503, 897, 504, 902, 0, 0, 903, 898, 0, 502, 503, 0, 504, + 904, 0, 505, 905, 502, 503, 505, 504, 502, 503, 502, 504, 505, 899, 502, 503, 506, 504, + 902, 507, 506, 903, 505, 507, 502, 503, 506, 504, 904, 507, 505, 905, 906, 508, 505, 0, + 506, 508, 908, 507, 505, 909, 910, 508, 506, 0, 912, 507, 506, 508, 505, 507, 0, 508, + 506, 913, 509, 507, 509, 0, 906, 508, 914, 509, 506, 508, 908, 507, 509, 909, 910, 508, + 512, 510, 912, 510, 512, 508, 915, 917, 510, 508, + + 512, 913, 509, 510, 509, 511, 918, 511, 914, 509, 512, 919, 511, 511, 509, 920, 921, 511, + 512, 510, 922, 510, 512, 0, 915, 917, 510, 923, 512, 0, 924, 510, 513, 511, 918, 511, + 513, 0, 512, 919, 511, 511, 513, 920, 921, 511, 514, 514, 922, 925, 927, 514, 513, 0, + 928, 923, 929, 514, 924, 931, 513, 516, 932, 516, 513, 516, 933, 514, 0, 1036, 513, 516, + 0, 0, 514, 514, 0, 925, 927, 514, 513, 516, 928, 0, 929, 514, 0, 931, 1038, 516, + 932, 516, 0, 516, 933, 514, 515, 1036, 518, 516, + + 515, 517, 518, 517, 515, 517, 515, 0, 518, 516, 515, 517, 0, 0, 518, 519, 1038, 0, + 518, 519, 515, 517, 0, 0, 515, 519, 518, 0, 515, 517, 518, 517, 515, 517, 515, 519, + 518, 1040, 515, 517, 520, 521, 518, 519, 520, 521, 518, 519, 515, 517, 520, 521, 1041, 519, + 522, 520, 1042, 521, 522, 1043, 520, 521, 1045, 519, 522, 1040, 0, 523, 520, 521, 0, 523, + 520, 521, 522, 523, 0, 0, 520, 521, 1041, 523, 522, 520, 1042, 521, 522, 1043, 520, 521, + 1045, 523, 522, 0, 524, 523, 524, 1047, 525, 523, + + 525, 524, 522, 523, 525, 525, 524, 1048, 1049, 523, 525, 526, 0, 526, 1050, 0, 0, 527, + 526, 523, 1051, 527, 524, 526, 524, 1047, 525, 527, 525, 524, 1053, 1055, 525, 525, 524, 1048, + 1049, 527, 525, 526, 528, 526, 1050, 529, 528, 527, 526, 529, 1051, 527, 528, 526, 1057, 529, + 1060, 527, 529, 1062, 1053, 1055, 528, 0, 1063, 529, 0, 527, 1064, 531, 528, 531, 1065, 529, + 528, 1072, 531, 529, 0, 0, 528, 531, 1057, 529, 1060, 0, 529, 1062, 1073, 0, 528, 536, + 1063, 529, 530, 536, 1064, 531, 530, 531, 1065, 536, + + 530, 1072, 531, 533, 533, 533, 530, 531, 1074, 536, 533, 530, 0, 1077, 1073, 533, 530, 536, + 1079, 0, 530, 536, 0, 1081, 530, 1083, 0, 536, 530, 1084, 0, 533, 533, 533, 530, 534, + 1074, 536, 533, 530, 534, 1077, 534, 533, 530, 532, 1079, 534, 535, 0, 535, 1081, 534, 1083, + 532, 535, 532, 1084, 532, 1085, 535, 532, 1086, 534, 0, 1087, 532, 1088, 534, 1090, 534, 1091, + 1092, 532, 0, 534, 535, 537, 535, 0, 534, 537, 532, 535, 532, 537, 532, 1085, 535, 532, + 1086, 537, 538, 1087, 532, 1088, 538, 1090, 1093, 1091, + + 1092, 537, 538, 0, 0, 537, 1095, 538, 1097, 537, 1099, 539, 538, 537, 539, 539, 540, 1100, + 540, 537, 538, 539, 1101, 540, 538, 541, 1093, 541, 540, 537, 538, 539, 541, 0, 1095, 538, + 1097, 541, 1099, 539, 538, 1102, 539, 539, 540, 1100, 540, 0, 542, 539, 1101, 540, 542, 541, + 0, 541, 540, 543, 542, 539, 541, 543, 544, 0, 0, 541, 544, 543, 542, 1102, 0, 545, + 544, 0, 0, 545, 542, 543, 0, 0, 542, 545, 544, 0, 0, 543, 542, 1103, 546, 543, + 544, 545, 546, 0, 544, 543, 542, 0, 546, 545, + + 544, 546, 548, 545, 1108, 543, 548, 547, 546, 545, 544, 547, 548, 548, 1109, 1103, 546, 547, + 1190, 545, 546, 549, 548, 549, 0, 547, 546, 547, 549, 546, 548, 0, 1108, 549, 548, 547, + 546, 0, 0, 547, 548, 548, 1109, 0, 0, 547, 1190, 0, 0, 549, 548, 549, 550, 547, + 550, 547, 549, 0, 1194, 550, 550, 549, 0, 551, 550, 551, 552, 0, 552, 1195, 551, 551, + 553, 552, 553, 551, 553, 1198, 552, 553, 550, 1199, 550, 555, 553, 555, 1194, 550, 550, 0, + 555, 551, 550, 551, 552, 555, 552, 1195, 551, 551, + + 553, 552, 553, 551, 553, 1198, 552, 553, 554, 1199, 554, 555, 553, 555, 0, 554, 554, 556, + 555, 0, 554, 556, 557, 555, 0, 1200, 557, 556, 558, 0, 558, 0, 557, 0, 1204, 558, + 554, 556, 554, 0, 558, 1207, 557, 554, 554, 556, 1208, 560, 554, 556, 557, 560, 559, 1200, + 557, 556, 558, 560, 558, 559, 557, 559, 1204, 558, 0, 556, 559, 560, 558, 1207, 557, 559, + 561, 562, 1208, 560, 561, 562, 1211, 560, 559, 0, 561, 562, 561, 560, 1212, 559, 1213, 559, + 0, 1214, 561, 562, 559, 560, 564, 1217, 564, 559, + + 561, 562, 1218, 564, 561, 562, 1211, 1219, 564, 563, 561, 562, 561, 563, 1212, 1222, 1213, 563, + 566, 1214, 561, 562, 1224, 563, 564, 1217, 564, 566, 712, 566, 1218, 564, 712, 563, 566, 1219, + 564, 563, 712, 566, 565, 563, 565, 1222, 1225, 563, 566, 565, 712, 565, 1224, 563, 565, 0, + 0, 566, 712, 566, 0, 0, 712, 563, 566, 0, 0, 1226, 712, 566, 565, 1227, 565, 567, + 1225, 567, 1228, 565, 712, 565, 567, 568, 565, 568, 567, 567, 1278, 1281, 568, 568, 569, 1285, + 569, 568, 570, 1226, 569, 569, 570, 1227, 570, 567, + + 569, 567, 1228, 570, 1286, 0, 567, 568, 570, 568, 567, 567, 1278, 1281, 568, 568, 569, 1285, + 569, 568, 570, 0, 569, 569, 570, 1289, 570, 571, 569, 571, 1290, 570, 1286, 571, 571, 1291, + 570, 1292, 1296, 571, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 0, 0, 0, 1289, + 0, 571, 0, 571, 1290, 0, 0, 571, 571, 1291, 0, 1292, 1296, 571, 575, 575, 575, 575, + 575, 575, 575, 575, 575, 575, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 577, 706, 706, + + 706, 706, 706, 706, 706, 706, 706, 706, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, + 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 709, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 710, 1297, 710, 711, 713, 711, 710, 710, 713, 711, 711, 1298, 710, 0, 713, 711, + 1279, 1279, 0, 1300, 0, 1327, 1328, 0, 713, 0, 0, 0, 710, 1297, 710, 711, 713, 711, + 710, 710, 713, 711, 711, 1298, 710, 714, 713, 711, 0, 714, 715, 1300, 715, 1327, 1328, 714, + 713, 715, 714, 716, 1279, 1331, 715, 716, 717, 714, + + 717, 1334, 0, 716, 0, 717, 0, 714, 0, 1337, 717, 714, 715, 716, 715, 1303, 1303, 714, + 1341, 715, 714, 716, 1279, 1331, 715, 716, 717, 714, 717, 1334, 718, 716, 719, 717, 718, 720, + 719, 1337, 717, 720, 718, 716, 719, 720, 1354, 1354, 1341, 0, 0, 720, 718, 1355, 719, 1359, + 0, 1303, 1362, 0, 718, 720, 719, 1368, 718, 720, 719, 721, 0, 720, 718, 721, 719, 720, + 722, 1361, 1361, 721, 722, 720, 718, 1355, 719, 1359, 722, 1303, 1362, 721, 724, 720, 1354, 1368, + 724, 723, 722, 721, 724, 723, 724, 721, 0, 723, + + 722, 1372, 0, 721, 722, 723, 724, 0, 0, 0, 722, 0, 1376, 721, 724, 723, 1354, 1361, + 724, 723, 722, 725, 724, 723, 724, 725, 726, 723, 727, 1372, 726, 725, 727, 723, 724, 729, + 726, 729, 727, 726, 1376, 725, 729, 723, 0, 1361, 726, 729, 727, 725, 0, 1378, 1380, 725, + 726, 0, 727, 1382, 726, 725, 727, 1384, 1386, 729, 726, 729, 727, 726, 728, 725, 729, 1388, + 728, 1390, 726, 729, 727, 730, 728, 1378, 1380, 730, 1392, 728, 0, 1382, 0, 730, 728, 1384, + 1386, 0, 1394, 0, 0, 0, 728, 730, 731, 1388, + + 728, 1390, 731, 0, 0, 730, 728, 0, 731, 730, 1392, 728, 733, 731, 733, 730, 728, 732, + 731, 733, 1394, 732, 0, 0, 733, 730, 731, 732, 0, 0, 731, 734, 734, 734, 0, 0, + 731, 732, 734, 0, 733, 731, 733, 734, 0, 732, 731, 733, 0, 732, 0, 0, 733, 0, + 0, 732, 736, 0, 736, 734, 734, 734, 737, 736, 736, 732, 734, 735, 736, 735, 0, 734, + 0, 737, 735, 737, 735, 0, 0, 735, 737, 738, 0, 738, 736, 737, 736, 738, 738, 739, + 737, 736, 736, 738, 0, 735, 736, 735, 739, 0, + + 739, 737, 735, 737, 735, 739, 0, 735, 737, 738, 739, 738, 0, 737, 740, 738, 738, 739, + 740, 0, 741, 738, 741, 742, 740, 742, 739, 741, 739, 743, 742, 743, 741, 739, 740, 742, + 743, 0, 739, 0, 0, 743, 740, 0, 0, 0, 740, 0, 741, 0, 741, 742, 740, 742, + 0, 741, 0, 743, 742, 743, 741, 0, 740, 742, 743, 744, 0, 0, 0, 743, 745, 0, + 745, 744, 745, 744, 0, 745, 0, 746, 744, 746, 745, 746, 0, 744, 746, 747, 0, 747, + 0, 746, 0, 744, 747, 0, 747, 0, 745, 747, + + 745, 744, 745, 744, 0, 745, 0, 746, 744, 746, 745, 746, 0, 744, 746, 747, 0, 747, + 748, 746, 748, 749, 747, 0, 747, 748, 748, 747, 0, 750, 748, 751, 749, 0, 749, 751, + 0, 0, 0, 749, 750, 751, 750, 0, 749, 0, 748, 750, 748, 749, 0, 751, 750, 748, + 748, 0, 0, 750, 748, 751, 749, 752, 749, 751, 0, 752, 0, 749, 750, 751, 750, 752, + 749, 0, 0, 750, 0, 0, 0, 751, 750, 752, 753, 0, 754, 0, 753, 0, 754, 752, + 0, 755, 753, 752, 754, 755, 0, 753, 0, 752, + + 0, 755, 753, 0, 754, 0, 0, 0, 0, 752, 753, 755, 754, 756, 753, 0, 754, 756, + 0, 755, 753, 756, 754, 755, 757, 753, 0, 756, 757, 755, 753, 0, 754, 0, 757, 0, + 0, 756, 758, 755, 0, 756, 758, 759, 757, 756, 0, 759, 758, 756, 0, 759, 757, 0, + 0, 756, 757, 759, 758, 0, 0, 0, 757, 0, 0, 756, 758, 759, 0, 0, 758, 759, + 757, 760, 0, 759, 758, 760, 761, 759, 0, 0, 761, 760, 760, 759, 758, 762, 761, 762, + 763, 0, 763, 760, 762, 759, 0, 763, 761, 762, + + 0, 760, 763, 0, 0, 760, 761, 764, 0, 764, 761, 760, 760, 0, 764, 762, 761, 762, + 763, 764, 763, 760, 762, 0, 765, 763, 761, 762, 765, 0, 763, 0, 0, 0, 765, 764, + 767, 764, 767, 0, 0, 766, 764, 767, 765, 766, 0, 764, 767, 0, 0, 766, 765, 768, + 766, 768, 765, 0, 0, 768, 768, 766, 765, 0, 767, 768, 767, 0, 769, 766, 769, 767, + 765, 766, 769, 769, 767, 0, 0, 766, 769, 768, 766, 768, 0, 0, 0, 768, 768, 766, + 779, 0, 0, 768, 779, 0, 769, 0, 769, 771, + + 779, 771, 769, 769, 0, 772, 771, 772, 769, 770, 779, 771, 772, 0, 770, 0, 770, 772, + 779, 0, 770, 770, 779, 0, 0, 0, 770, 771, 779, 771, 0, 0, 0, 772, 771, 772, + 0, 770, 779, 771, 772, 0, 770, 0, 770, 772, 0, 0, 770, 770, 773, 774, 773, 774, + 770, 0, 0, 773, 774, 775, 0, 775, 773, 774, 0, 776, 775, 776, 0, 0, 0, 775, + 776, 776, 0, 0, 0, 776, 773, 774, 773, 774, 0, 0, 0, 773, 774, 775, 0, 775, + 773, 774, 0, 776, 775, 776, 777, 0, 777, 775, + + 776, 776, 778, 777, 778, 776, 0, 780, 777, 778, 0, 780, 0, 782, 778, 782, 0, 780, + 781, 0, 782, 782, 781, 0, 777, 782, 777, 780, 781, 0, 778, 777, 778, 0, 0, 780, + 777, 778, 781, 780, 0, 782, 778, 782, 0, 780, 781, 0, 782, 782, 781, 0, 0, 782, + 783, 780, 781, 784, 783, 784, 783, 0, 0, 784, 784, 783, 781, 0, 0, 784, 783, 0, + 0, 0, 785, 0, 0, 0, 785, 786, 0, 0, 783, 786, 785, 784, 783, 784, 783, 786, + 0, 784, 784, 783, 785, 0, 0, 784, 783, 786, + + 788, 0, 785, 787, 788, 787, 785, 786, 0, 787, 788, 786, 785, 0, 0, 787, 0, 786, + 0, 0, 788, 0, 785, 0, 0, 787, 789, 786, 788, 0, 789, 787, 788, 787, 0, 0, + 789, 787, 788, 789, 0, 791, 0, 787, 0, 791, 789, 0, 788, 0, 0, 791, 790, 787, + 789, 0, 790, 0, 789, 0, 0, 791, 790, 0, 789, 790, 793, 789, 0, 791, 793, 0, + 790, 791, 789, 0, 793, 792, 0, 791, 790, 792, 0, 0, 790, 792, 793, 792, 0, 791, + 790, 794, 795, 790, 793, 794, 795, 792, 793, 0, + + 790, 794, 795, 0, 793, 792, 0, 0, 0, 792, 0, 794, 795, 792, 793, 792, 0, 0, + 796, 794, 795, 0, 796, 794, 795, 792, 796, 797, 0, 794, 795, 797, 796, 798, 0, 797, + 0, 798, 0, 794, 795, 797, 796, 798, 0, 0, 796, 0, 799, 0, 796, 797, 799, 798, + 796, 797, 0, 0, 799, 797, 796, 798, 800, 797, 0, 798, 800, 0, 799, 797, 796, 798, + 800, 0, 0, 800, 799, 0, 0, 797, 799, 798, 800, 0, 0, 801, 799, 803, 802, 801, + 800, 803, 802, 801, 800, 801, 799, 803, 802, 0, + + 800, 802, 803, 800, 0, 801, 0, 803, 802, 0, 800, 804, 0, 801, 804, 803, 802, 801, + 804, 803, 802, 801, 0, 801, 804, 803, 802, 805, 0, 802, 803, 805, 0, 801, 804, 803, + 802, 805, 0, 804, 806, 0, 804, 0, 806, 0, 804, 805, 806, 807, 806, 807, 804, 809, + 0, 805, 807, 809, 0, 805, 806, 807, 804, 809, 0, 805, 0, 0, 806, 0, 0, 808, + 806, 809, 0, 805, 806, 807, 806, 807, 808, 809, 808, 0, 807, 809, 810, 808, 806, 807, + 810, 809, 808, 811, 0, 0, 810, 811, 0, 808, + + 812, 809, 812, 811, 0, 0, 810, 812, 808, 0, 808, 0, 812, 811, 810, 808, 0, 0, + 810, 813, 808, 811, 814, 813, 810, 811, 814, 0, 812, 813, 812, 811, 814, 815, 810, 812, + 0, 815, 0, 813, 812, 811, 814, 815, 0, 0, 0, 813, 816, 0, 814, 813, 816, 815, + 814, 0, 0, 813, 816, 817, 814, 815, 818, 817, 0, 815, 818, 813, 816, 817, 814, 815, + 818, 0, 0, 0, 816, 0, 0, 817, 816, 815, 818, 0, 0, 0, 816, 817, 0, 0, + 818, 817, 0, 0, 818, 0, 816, 817, 0, 819, + + 818, 819, 820, 0, 820, 0, 819, 817, 0, 820, 818, 819, 822, 821, 820, 821, 0, 0, + 0, 0, 821, 822, 0, 822, 0, 821, 0, 819, 822, 819, 820, 0, 820, 822, 819, 0, + 0, 820, 0, 819, 822, 821, 820, 821, 0, 823, 0, 823, 821, 822, 0, 822, 823, 821, + 823, 0, 822, 823, 824, 0, 824, 822, 825, 0, 825, 824, 826, 0, 0, 825, 824, 825, + 0, 823, 825, 823, 0, 826, 0, 826, 823, 0, 823, 0, 826, 823, 824, 0, 824, 826, + 825, 0, 825, 824, 826, 0, 0, 825, 824, 825, + + 0, 827, 825, 827, 0, 826, 0, 826, 827, 827, 829, 828, 826, 827, 829, 0, 828, 826, + 828, 0, 829, 0, 0, 828, 0, 0, 0, 0, 828, 827, 829, 827, 0, 0, 0, 0, + 827, 827, 829, 828, 0, 827, 829, 0, 828, 0, 828, 0, 829, 830, 831, 828, 830, 830, + 831, 0, 828, 0, 829, 830, 831, 0, 0, 832, 833, 0, 0, 832, 833, 830, 831, 0, + 0, 832, 833, 0, 0, 830, 831, 832, 830, 830, 831, 832, 833, 0, 0, 830, 831, 834, + 835, 832, 833, 834, 835, 832, 833, 830, 831, 834, + + 835, 832, 833, 0, 0, 0, 0, 832, 0, 834, 835, 832, 833, 836, 0, 836, 0, 834, + 835, 0, 836, 834, 835, 0, 937, 836, 937, 834, 835, 0, 0, 937, 938, 939, 938, 939, + 937, 834, 835, 938, 939, 836, 0, 836, 938, 939, 941, 939, 836, 0, 941, 0, 937, 836, + 937, 0, 941, 0, 0, 937, 938, 939, 938, 939, 937, 0, 941, 938, 939, 940, 0, 940, + 938, 939, 941, 939, 940, 0, 941, 0, 0, 940, 942, 943, 941, 944, 942, 943, 0, 944, + 0, 0, 942, 943, 941, 944, 0, 940, 0, 940, + + 944, 0, 942, 943, 940, 944, 0, 0, 945, 940, 942, 943, 945, 944, 942, 943, 945, 944, + 0, 0, 942, 943, 945, 944, 946, 946, 0, 0, 944, 946, 942, 943, 945, 944, 0, 946, + 945, 947, 0, 947, 945, 0, 0, 947, 945, 946, 0, 0, 0, 947, 945, 0, 946, 946, + 948, 0, 948, 946, 0, 947, 945, 948, 949, 946, 949, 947, 948, 947, 950, 949, 949, 947, + 950, 946, 949, 951, 0, 947, 950, 951, 0, 0, 948, 0, 948, 951, 0, 947, 950, 948, + 949, 0, 949, 0, 948, 951, 950, 949, 949, 0, + + 950, 952, 949, 951, 0, 952, 950, 951, 953, 0, 953, 952, 0, 951, 954, 953, 950, 0, + 954, 0, 953, 952, 0, 951, 954, 0, 0, 955, 0, 952, 0, 955, 0, 952, 954, 0, + 953, 955, 953, 952, 0, 0, 954, 953, 0, 0, 954, 955, 953, 952, 956, 0, 954, 0, + 956, 955, 958, 0, 956, 955, 958, 957, 954, 957, 956, 955, 958, 959, 957, 0, 0, 959, + 0, 957, 956, 955, 958, 959, 956, 0, 0, 0, 956, 0, 958, 0, 956, 959, 958, 957, + 0, 957, 956, 960, 958, 959, 957, 960, 0, 959, + + 0, 957, 956, 960, 958, 959, 963, 961, 0, 0, 963, 961, 962, 960, 962, 959, 963, 961, + 0, 962, 0, 960, 961, 0, 962, 960, 963, 961, 0, 0, 0, 960, 0, 964, 963, 961, + 0, 964, 963, 961, 962, 960, 962, 964, 963, 961, 0, 962, 0, 0, 961, 0, 962, 964, + 963, 961, 965, 0, 966, 967, 965, 964, 966, 967, 0, 964, 965, 0, 966, 967, 968, 964, + 968, 966, 967, 0, 965, 968, 966, 967, 0, 964, 968, 0, 965, 0, 966, 967, 965, 969, + 966, 967, 0, 969, 965, 0, 966, 967, 968, 969, + + 968, 966, 967, 0, 965, 968, 966, 967, 0, 969, 968, 0, 970, 0, 970, 971, 972, 969, + 970, 971, 972, 969, 0, 0, 970, 971, 972, 969, 0, 0, 0, 0, 0, 0, 970, 971, + 972, 969, 0, 0, 970, 973, 970, 971, 972, 973, 970, 971, 972, 0, 0, 973, 970, 971, + 972, 0, 974, 0, 974, 973, 974, 973, 970, 971, 972, 976, 974, 976, 0, 973, 975, 0, + 976, 973, 975, 0, 974, 976, 0, 973, 975, 0, 0, 0, 974, 975, 974, 973, 974, 973, + 975, 0, 0, 976, 974, 976, 0, 0, 975, 977, + + 976, 977, 975, 0, 974, 976, 977, 978, 975, 0, 0, 977, 978, 975, 978, 0, 0, 0, + 975, 978, 0, 979, 0, 979, 978, 0, 0, 977, 979, 977, 0, 0, 0, 979, 977, 978, + 980, 0, 980, 977, 978, 0, 978, 980, 0, 0, 0, 978, 980, 979, 0, 979, 978, 0, + 0, 981, 979, 981, 982, 0, 982, 979, 981, 981, 980, 982, 980, 981, 0, 0, 982, 980, + 983, 0, 983, 0, 980, 0, 0, 983, 0, 0, 0, 981, 983, 981, 982, 0, 982, 0, + 981, 981, 0, 982, 0, 981, 0, 984, 982, 984, + + 983, 986, 983, 986, 984, 984, 985, 983, 986, 984, 985, 986, 983, 986, 0, 0, 985, 0, + 0, 0, 0, 0, 0, 0, 0, 984, 985, 984, 987, 986, 987, 986, 984, 984, 985, 987, + 986, 984, 985, 986, 987, 986, 0, 988, 985, 988, 0, 0, 0, 0, 988, 0, 990, 0, + 985, 988, 987, 989, 987, 989, 990, 0, 990, 987, 989, 0, 0, 990, 987, 989, 0, 988, + 990, 988, 991, 0, 991, 992, 988, 992, 990, 991, 0, 988, 992, 989, 991, 989, 990, 992, + 990, 0, 989, 0, 0, 990, 0, 989, 0, 0, + + 990, 994, 991, 994, 991, 992, 993, 992, 994, 991, 993, 0, 992, 994, 991, 0, 993, 992, + 0, 995, 0, 0, 0, 0, 0, 0, 993, 0, 0, 994, 995, 994, 995, 0, 993, 0, + 994, 995, 993, 0, 0, 994, 995, 996, 993, 996, 0, 995, 0, 0, 996, 996, 0, 997, + 993, 996, 0, 997, 995, 997, 995, 0, 0, 0, 997, 995, 0, 0, 0, 997, 995, 996, + 0, 996, 0, 0, 0, 0, 996, 996, 0, 997, 998, 996, 998, 997, 999, 997, 999, 998, + 998, 0, 997, 999, 998, 0, 0, 997, 999, 1000, + + 0, 1000, 0, 1001, 0, 1002, 1000, 1001, 0, 1002, 998, 1000, 998, 1001, 999, 1002, 999, 998, + 998, 0, 1002, 999, 998, 1001, 0, 1002, 999, 1000, 0, 1000, 0, 1001, 1006, 1002, 1000, 1001, + 1006, 1002, 0, 1000, 0, 1001, 1006, 1002, 1003, 1003, 1004, 0, 1002, 1003, 1004, 1001, 1006, 1002, + 0, 1003, 1004, 0, 0, 1004, 1006, 0, 0, 0, 1006, 1003, 1004, 0, 0, 1019, 1006, 1019, + 1003, 1003, 1004, 1005, 1019, 1003, 1004, 1005, 1006, 1019, 1007, 1003, 1004, 1005, 1007, 1004, 1005, 0, + 0, 0, 1007, 1003, 1004, 1005, 0, 1019, 0, 1019, + + 0, 1008, 1007, 1005, 1019, 1008, 0, 1005, 1009, 1019, 1007, 1008, 1009, 1005, 1007, 1010, 1005, 0, + 1009, 1010, 1007, 1008, 0, 1005, 0, 1010, 0, 0, 1009, 1008, 1007, 0, 0, 1008, 1011, 1010, + 1009, 1012, 1011, 1008, 1009, 1012, 1011, 1010, 0, 1012, 1009, 1010, 1011, 1008, 0, 1012, 0, 1010, + 0, 0, 1009, 0, 1011, 0, 0, 1012, 1011, 1010, 0, 1012, 1011, 1013, 1013, 1012, 1011, 0, + 1013, 1012, 0, 0, 1011, 1014, 1013, 1012, 0, 1014, 0, 0, 0, 0, 1011, 1014, 1013, 1012, + 0, 0, 1014, 0, 1015, 1013, 1013, 1014, 1015, 0, + + 1013, 0, 0, 1016, 1015, 1014, 1013, 1016, 0, 1014, 0, 0, 0, 1016, 1015, 1014, 1013, 0, + 0, 0, 1014, 0, 1015, 1016, 0, 1014, 1015, 0, 1017, 1017, 1018, 1016, 1015, 1017, 1018, 1016, + 0, 0, 1018, 1017, 0, 1016, 1015, 0, 1018, 0, 0, 0, 0, 1017, 0, 1016, 0, 1020, + 1018, 1020, 1017, 1017, 1018, 1020, 1020, 1017, 1018, 0, 0, 1020, 1018, 1017, 1021, 0, 1021, 0, + 1018, 0, 0, 1021, 1021, 1017, 0, 1022, 1021, 1020, 1018, 1020, 0, 0, 0, 1020, 1020, 0, + 1022, 0, 1022, 1020, 0, 0, 1021, 1022, 1021, 1023, + + 0, 0, 1022, 1021, 1021, 0, 0, 1022, 1021, 1024, 1023, 1024, 1023, 0, 0, 0, 1024, 1023, + 1022, 0, 1022, 1024, 1023, 0, 1025, 1022, 1025, 1023, 0, 0, 1022, 1025, 0, 0, 0, 0, + 1025, 1024, 1023, 1024, 1023, 0, 0, 1026, 1024, 1023, 0, 1026, 0, 1024, 1023, 0, 1025, 1026, + 1025, 1027, 1027, 1028, 1029, 1025, 1027, 1028, 1029, 1026, 1025, 0, 1027, 1028, 1029, 0, 0, 1026, + 0, 0, 0, 1026, 1027, 1028, 1029, 0, 1030, 1026, 1030, 1027, 1027, 1028, 1029, 1030, 1027, 1028, + 1029, 1026, 1030, 0, 1027, 1028, 1029, 0, 1031, 0, + + 0, 1032, 0, 0, 1027, 1028, 1029, 0, 1030, 1031, 1030, 1031, 1032, 0, 1032, 1030, 1031, 0, + 0, 1032, 1030, 1031, 0, 1033, 1032, 1033, 1031, 0, 0, 1032, 1033, 1034, 0, 1034, 0, 1033, + 0, 1031, 1034, 1031, 1032, 0, 1032, 1034, 1031, 0, 0, 1032, 0, 1031, 1111, 1033, 1032, 1033, + 1111, 1113, 0, 1113, 1033, 1034, 1111, 1034, 1113, 1033, 1112, 0, 1034, 1113, 1112, 0, 1111, 1034, + 0, 0, 1112, 0, 0, 0, 1111, 1114, 0, 1114, 1111, 1113, 1112, 1113, 1114, 1115, 1111, 1115, + 1113, 1114, 1112, 1116, 1115, 1113, 1112, 1116, 1111, 1115, + + 0, 0, 1112, 1116, 1118, 0, 1118, 1114, 0, 1114, 0, 1118, 1112, 1116, 1114, 1115, 1118, 1115, + 0, 1114, 1117, 1116, 1115, 0, 1117, 1116, 1119, 1115, 1119, 0, 1117, 1116, 1118, 1119, 1118, 1117, + 0, 0, 1119, 1118, 1117, 1116, 0, 1120, 1118, 1120, 0, 0, 1117, 0, 1120, 0, 1117, 0, + 1119, 1120, 1119, 1121, 1117, 1121, 0, 1119, 0, 1117, 1121, 0, 1119, 0, 1117, 1121, 0, 1120, + 1122, 1120, 1122, 0, 0, 1124, 1120, 1122, 1122, 0, 0, 1120, 1122, 1121, 1124, 1121, 1124, 1123, + 1123, 1123, 1121, 1124, 0, 0, 1123, 1121, 1124, 0, + + 1122, 1123, 1122, 0, 0, 1124, 0, 1122, 1122, 0, 0, 0, 1122, 1125, 1124, 1125, 1124, 1123, + 1123, 1123, 1125, 1124, 0, 0, 1123, 1125, 1124, 0, 1126, 1123, 1126, 0, 1127, 0, 1127, 1126, + 1126, 1128, 0, 1127, 1126, 1125, 0, 1125, 1127, 0, 0, 1128, 1125, 1128, 0, 0, 0, 1125, + 1128, 0, 1126, 0, 1126, 1128, 1127, 0, 1127, 1126, 1126, 1128, 0, 1127, 1126, 1129, 0, 1129, + 1127, 0, 1130, 1128, 1129, 1128, 0, 0, 0, 1129, 1128, 1130, 1131, 1130, 1131, 1128, 0, 0, + 1130, 1131, 0, 0, 0, 1130, 1131, 1129, 1132, 1129, + + 1132, 0, 1130, 0, 1129, 1132, 0, 0, 0, 1129, 1132, 1130, 1131, 1130, 1131, 1133, 0, 1133, + 1130, 1131, 0, 0, 1133, 1130, 1131, 0, 1132, 1133, 1132, 1134, 0, 1134, 0, 1132, 0, 0, + 1134, 1137, 1132, 1137, 0, 1134, 1135, 1133, 1137, 1133, 1135, 0, 0, 1137, 1133, 0, 1135, 0, + 0, 1133, 1136, 1134, 0, 1134, 1136, 0, 1135, 0, 1134, 1137, 1136, 1137, 0, 1134, 1135, 1138, + 1137, 1138, 1135, 0, 1136, 1137, 1138, 1138, 1135, 0, 1139, 1138, 1136, 0, 1139, 0, 1136, 0, + 1135, 1140, 1139, 1140, 1136, 0, 0, 0, 1140, 1138, + + 0, 1138, 1139, 1140, 1136, 0, 1138, 1138, 0, 0, 1139, 1138, 0, 0, 1139, 1141, 1142, 1141, + 1142, 1140, 1139, 1140, 1141, 1142, 0, 0, 1140, 1141, 1142, 0, 1139, 1140, 0, 0, 0, 1143, + 0, 1143, 0, 0, 0, 0, 1143, 1141, 1142, 1141, 1142, 1143, 0, 0, 1141, 1142, 1144, 0, + 1144, 1141, 1142, 0, 0, 1144, 1145, 0, 1145, 1143, 1144, 1143, 1146, 1145, 1146, 0, 1143, 0, + 1145, 1146, 0, 1143, 0, 1147, 1146, 1147, 1144, 0, 1144, 1147, 1147, 0, 0, 1144, 1145, 1147, + 1145, 0, 1144, 1148, 1146, 1145, 1146, 1148, 0, 0, + + 1145, 1146, 0, 1148, 0, 1147, 1146, 1147, 0, 0, 1149, 1147, 1147, 1148, 1149, 0, 1150, 1147, + 1149, 1151, 1150, 1148, 0, 1151, 1149, 1148, 1150, 0, 1152, 1151, 1152, 1148, 0, 0, 1149, 1152, + 1150, 0, 1149, 1151, 1152, 1148, 1149, 1153, 1150, 1153, 1149, 1151, 1150, 0, 1153, 1151, 1149, 0, + 1150, 1153, 1152, 1151, 1152, 0, 0, 0, 1149, 1152, 1150, 0, 0, 1151, 1152, 0, 1154, 1153, + 1154, 1153, 1155, 0, 1155, 1154, 1153, 0, 0, 1155, 1154, 1153, 0, 1157, 1155, 1157, 1156, 0, + 0, 0, 1157, 0, 0, 0, 0, 1157, 1154, 1156, + + 1154, 1156, 1155, 0, 1155, 1154, 1156, 0, 0, 1155, 1154, 1156, 0, 1157, 1155, 1157, 1156, 0, + 1159, 0, 1157, 0, 1159, 0, 1158, 1157, 1158, 1156, 1159, 1156, 0, 1158, 1158, 1160, 1156, 0, + 1158, 1160, 1159, 1156, 0, 0, 0, 1160, 0, 0, 1159, 1161, 0, 0, 1159, 1161, 1158, 1160, + 1158, 0, 1159, 1161, 1162, 1158, 1158, 1160, 1162, 0, 1158, 1160, 1159, 1161, 1162, 0, 1163, 1160, + 1163, 0, 0, 1161, 0, 1163, 1162, 1161, 0, 1160, 1163, 0, 0, 1161, 1162, 1164, 0, 1164, + 1162, 0, 1165, 1166, 1164, 1161, 1162, 0, 1163, 1164, + + 1163, 1165, 1166, 1165, 1166, 1163, 1162, 0, 1165, 1166, 1163, 0, 0, 1165, 1166, 1164, 1167, 1164, + 1167, 0, 1165, 1166, 1164, 1167, 0, 0, 0, 1164, 1167, 1165, 1166, 1165, 1166, 1168, 0, 1168, + 1165, 1166, 0, 0, 1168, 1165, 1166, 0, 1167, 1168, 1167, 1169, 1170, 1169, 1170, 1167, 0, 0, + 1169, 1170, 1167, 0, 0, 1169, 1170, 1168, 1171, 1168, 1171, 0, 0, 0, 1168, 1171, 0, 0, + 0, 1168, 1171, 1169, 1170, 1169, 1170, 1172, 0, 1172, 1169, 1170, 0, 1174, 1172, 1169, 1170, 0, + 1171, 1172, 1171, 1173, 0, 1173, 1174, 1171, 1174, 1175, + + 1173, 0, 1171, 1174, 0, 1173, 0, 1172, 1174, 1172, 1175, 0, 1175, 1174, 1172, 0, 0, 1175, + 0, 1172, 0, 1173, 1175, 1173, 1174, 0, 1174, 1175, 1173, 0, 1176, 1174, 0, 1173, 0, 1177, + 1174, 1177, 1175, 1176, 1175, 1176, 1177, 1177, 1178, 1175, 1176, 1177, 0, 0, 1175, 1176, 1178, 0, + 1178, 0, 0, 0, 1176, 1178, 0, 0, 0, 1177, 1178, 1177, 1179, 1176, 1179, 1176, 1177, 1177, + 1178, 1179, 1176, 1177, 0, 0, 1179, 1176, 1178, 1180, 1178, 1180, 0, 0, 0, 1178, 1180, 0, + 0, 0, 1178, 1180, 1179, 1181, 1179, 1181, 1182, 0, + + 1182, 1179, 1181, 0, 0, 1182, 1179, 1181, 0, 1180, 1182, 1180, 1183, 0, 1183, 1184, 1180, 1184, + 1183, 1183, 0, 1180, 1184, 1181, 1183, 1181, 1182, 1184, 1182, 1232, 1181, 1232, 1233, 1182, 1233, 1181, + 1232, 0, 1182, 1233, 1183, 1232, 1183, 1184, 1233, 1184, 1183, 1183, 0, 1234, 1184, 1234, 1183, 0, + 0, 1184, 1234, 1232, 0, 1232, 1233, 1234, 1233, 1235, 1232, 1235, 0, 1233, 0, 1232, 1235, 0, + 1233, 0, 0, 1235, 1236, 1234, 0, 1234, 1236, 0, 1239, 1239, 1234, 0, 1236, 0, 0, 1234, + 1237, 1235, 0, 1235, 1237, 1238, 1236, 0, 1235, 1238, + + 1237, 0, 0, 1235, 1236, 1238, 0, 0, 1236, 1239, 1237, 0, 0, 1239, 1236, 1238, 1240, 0, + 1237, 1239, 1240, 0, 1237, 1238, 1236, 0, 1240, 1238, 1237, 1239, 1242, 1241, 0, 1238, 1242, 1241, + 1240, 1239, 1237, 1241, 1242, 1239, 0, 1238, 1240, 1241, 0, 1239, 1240, 0, 1242, 0, 0, 0, + 1240, 1241, 1243, 1239, 1242, 1241, 1243, 1244, 1242, 1241, 1240, 1244, 1243, 1241, 1242, 0, 1245, 1244, + 0, 1241, 1245, 0, 1243, 0, 1242, 0, 1245, 1244, 0, 1241, 1243, 1245, 0, 1247, 1243, 1244, + 1245, 1247, 0, 1244, 1243, 0, 1248, 1247, 1245, 1244, + + 1248, 1246, 1245, 1246, 1243, 1246, 1248, 1247, 1245, 1244, 1249, 1246, 0, 1245, 1249, 1247, 1248, 0, + 1245, 1247, 1249, 1246, 0, 0, 1248, 1247, 0, 0, 1248, 1246, 1249, 1246, 0, 1246, 1248, 1247, + 0, 0, 1249, 1246, 0, 0, 1249, 1250, 1248, 1250, 0, 0, 1249, 1246, 1250, 0, 1251, 0, + 1251, 1250, 0, 0, 1249, 1251, 1252, 0, 1252, 0, 1251, 1253, 0, 1252, 0, 0, 0, 1250, + 1252, 1250, 1253, 0, 1253, 1254, 1250, 1254, 1251, 1253, 1251, 1250, 1254, 0, 1253, 1251, 1252, 1254, + 1252, 0, 1251, 1253, 1255, 1252, 1255, 0, 0, 0, + + 1252, 1255, 1253, 0, 1253, 1254, 1255, 1254, 1256, 1253, 1256, 0, 1254, 0, 1253, 1256, 0, 1254, + 0, 1257, 1256, 1257, 1255, 0, 1255, 1257, 1257, 0, 0, 1255, 0, 1257, 0, 0, 1255, 1258, + 1256, 0, 1256, 1258, 1259, 0, 0, 1256, 1259, 1258, 0, 1257, 1256, 1257, 1259, 0, 0, 1257, + 1257, 1258, 0, 0, 0, 1257, 1259, 0, 1260, 1258, 1260, 0, 0, 1258, 1259, 1260, 0, 0, + 1259, 1258, 1260, 1261, 0, 1261, 1259, 1262, 0, 1262, 1261, 1258, 0, 1263, 1262, 1261, 1259, 0, + 1260, 1262, 1260, 0, 1263, 0, 1263, 1260, 0, 0, + + 0, 1263, 1260, 1261, 0, 1261, 1263, 1262, 0, 1262, 1261, 0, 0, 1263, 1262, 1261, 0, 0, + 1264, 1262, 1264, 0, 1263, 0, 1263, 1264, 1264, 0, 0, 1263, 1264, 0, 1265, 1265, 1263, 1265, + 0, 1266, 0, 1266, 1265, 0, 0, 0, 1266, 1265, 1264, 0, 1264, 1266, 1267, 0, 1267, 1264, + 1264, 0, 0, 1267, 1264, 0, 1265, 1265, 1267, 1265, 0, 1266, 0, 1266, 1265, 0, 0, 0, + 1266, 1265, 1268, 0, 1268, 1266, 1267, 0, 1267, 1268, 1268, 0, 0, 1267, 1268, 1269, 0, 1269, + 1267, 1270, 0, 1270, 1269, 0, 0, 1270, 1270, 1269, + + 0, 0, 1268, 1270, 1268, 0, 1271, 1271, 1271, 1268, 1268, 0, 0, 1271, 1268, 1269, 0, 1269, + 1271, 1270, 0, 1270, 1269, 0, 0, 1270, 1270, 1269, 0, 1273, 1272, 1270, 1272, 1273, 1271, 1271, + 1271, 1272, 1272, 1273, 0, 1271, 1272, 1274, 1275, 0, 1271, 1274, 1275, 1273, 0, 0, 0, 1274, + 1275, 0, 0, 1273, 1272, 0, 1272, 1273, 0, 1274, 1275, 1272, 1272, 1273, 0, 1276, 1272, 1274, + 1275, 1276, 1302, 1274, 1275, 1273, 1302, 1276, 0, 1274, 1275, 1314, 1302, 1314, 0, 1302, 0, 1276, + 1314, 1274, 1275, 0, 1302, 1314, 0, 1276, 0, 1304, + + 0, 1276, 1302, 1304, 0, 0, 1302, 1276, 0, 1304, 1305, 1314, 1302, 1314, 1305, 1302, 0, 1276, + 1314, 1304, 1305, 0, 1302, 1314, 1306, 1305, 0, 1304, 1306, 1307, 1305, 1304, 0, 1307, 1306, 0, + 0, 1304, 1305, 1307, 0, 0, 1305, 0, 1306, 0, 0, 1304, 1305, 1307, 1308, 0, 1306, 1305, + 1308, 0, 1306, 1307, 1305, 0, 1308, 1307, 1306, 0, 1309, 1310, 1309, 1307, 1309, 1310, 1308, 0, + 1306, 0, 1309, 1310, 0, 1307, 1308, 1311, 1310, 0, 1308, 1311, 1309, 1310, 0, 0, 1308, 1311, + 0, 0, 1309, 1310, 1309, 0, 1309, 1310, 1308, 1311, + + 1312, 0, 1309, 1310, 1312, 1313, 0, 1311, 1310, 1313, 1312, 1311, 1309, 1310, 1315, 1313, 0, 1311, + 1313, 1315, 1312, 1315, 0, 0, 0, 1313, 1315, 1311, 1312, 0, 1316, 1315, 1312, 1313, 1316, 1317, + 0, 1313, 1312, 1317, 1316, 0, 1315, 1313, 0, 1317, 1313, 1315, 1312, 1315, 1316, 0, 0, 1313, + 1315, 1317, 1318, 0, 1316, 1315, 1318, 1319, 1316, 1317, 0, 1319, 1318, 1317, 1316, 0, 1320, 1319, + 0, 1317, 1320, 1321, 1318, 0, 1316, 1321, 1320, 1319, 0, 1317, 1318, 1321, 1321, 0, 1318, 1319, + 1320, 0, 0, 1319, 1318, 1321, 1322, 0, 1320, 1319, + + 1322, 1323, 1320, 1321, 1318, 1323, 1322, 1321, 1320, 1319, 0, 1323, 0, 1321, 1321, 0, 1322, 0, + 1320, 0, 0, 1323, 0, 1321, 1322, 1324, 1324, 1342, 1322, 1323, 1324, 1342, 0, 1323, 1322, 0, + 1324, 1342, 0, 1323, 1340, 1340, 0, 0, 1322, 0, 1324, 1342, 0, 1323, 0, 0, 1343, 1324, + 1324, 1342, 1343, 0, 1324, 1342, 0, 1345, 1343, 1345, 1324, 1342, 1344, 1340, 1345, 0, 1344, 1340, + 1343, 1345, 1324, 1342, 1344, 1340, 0, 0, 1343, 1346, 0, 1346, 1343, 0, 1344, 1340, 1346, 1345, + 1343, 1345, 0, 1346, 1344, 1340, 1345, 0, 1344, 1340, + + 1343, 1345, 0, 0, 1344, 1340, 1347, 0, 1347, 1346, 1348, 1346, 1348, 1347, 1344, 1340, 1346, 1348, + 1347, 0, 0, 1346, 1348, 1349, 0, 1349, 0, 0, 0, 0, 1349, 0, 0, 0, 1347, 1349, + 1347, 1350, 1348, 1350, 1348, 1347, 0, 0, 1350, 1348, 1347, 0, 0, 1350, 1348, 1349, 0, 1349, + 0, 0, 1351, 0, 1349, 0, 1351, 0, 0, 1349, 0, 1350, 1351, 1350, 0, 1352, 1363, 1364, + 1350, 1352, 1363, 1364, 1351, 1350, 0, 1352, 1363, 1364, 0, 0, 1351, 0, 0, 0, 1351, 1352, + 1363, 1364, 0, 0, 1351, 0, 1365, 1352, 1363, 1364, + + 1365, 1352, 1363, 1364, 1351, 0, 1365, 1352, 1363, 1364, 0, 0, 0, 1366, 0, 1366, 1365, 1352, + 1363, 1364, 1366, 0, 0, 0, 1365, 1366, 0, 0, 1365, 0, 1374, 0, 1374, 0, 1365, 0, + 0, 1374, 0, 0, 0, 1366, 1374, 1366, 1365, 0, 0, 0, 1366, 0, 0, 0, 0, 1366, + 0, 0, 0, 0, 1374, 0, 1374, 0, 0, 0, 0, 1374, 0, 0, 0, 0, 1374, 1406, + 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1407, 0, 0, 1407, 1407, 1407, 1407, 1407, 1407, + 1407, 1408, 1408, 0, 1408, 1409, 1409, 1409, 1410, 0, + + 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1411, 1411, 1411, 0, 1411, 1411, 1411, 1411, 1411, 1411, 1412, + 0, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1413, 0, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 1414, 0, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1415, 0, 1415, 1415, 1415, 1415, 1415, + 1415, 1415, 1415, 1416, 0, 1416, 1417, 0, 1417, 1418, 0, 1418, 1419, 0, 1419, 1420, 0, 1420, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, + 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -3168,17 +2198,20 @@ static const flex_int16_t yy_chk[9253] = ***************************/ #line 12 "flex_lexer.l" -#include "../sql/Expr.h" -#include "bison_parser.h" -#include #include +#include #include +#include "../sql/Expr.h" +#include "bison_parser.h" -#define TOKEN(name) { return SQL_##name; } +#define TOKEN(name) \ + { \ + return SQL_##name; \ + } static thread_local std::stringstream strbuf; -#line 3181 "flex_lexer.cpp" +#line 3180 "flex_lexer.cpp" /*************************** ** Section 2: Rules @@ -3192,7 +2225,7 @@ static thread_local std::stringstream strbuf; /*************************** ** Section 3: Rules ***************************/ -#line 3195 "flex_lexer.cpp" +#line 3194 "flex_lexer.cpp" #define INITIAL 0 #define singlequotedstring 1 @@ -3207,129 +2240,127 @@ static thread_local std::stringstream strbuf; #endif #ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * +#define YY_EXTRA_TYPE void* #endif /* Holds the entire state of the reentrant scanner. */ -struct yyguts_t - { - - /* User-defined. Not touched by flex. */ - YY_EXTRA_TYPE yyextra_r; - - /* The rest are the same as the globals declared in the non-reentrant scanner. */ - FILE *yyin_r, *yyout_r; - size_t yy_buffer_stack_top; /**< index of top of stack. */ - size_t yy_buffer_stack_max; /**< capacity of stack. */ - YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ - char yy_hold_char; - yy_size_t yy_n_chars; - yy_size_t yyleng_r; - char *yy_c_buf_p; - int yy_init; - int yy_start; - int yy_did_buffer_switch_on_eof; - int yy_start_stack_ptr; - int yy_start_stack_depth; - int *yy_start_stack; - yy_state_type yy_last_accepting_state; - char* yy_last_accepting_cpos; - - int yylineno_r; - int yy_flex_debug_r; - - char *yytext_r; - int yy_more_flag; - int yy_more_len; - - YYSTYPE * yylval_r; - - YYLTYPE * yylloc_r; - - }; /* end struct yyguts_t */ +struct yyguts_t { + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE* yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char* yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int* yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char* yytext_r; + int yy_more_flag; + int yy_more_len; + + YYSTYPE* yylval_r; + + YYLTYPE* yylloc_r; + +}; /* end struct yyguts_t */ + +static int yy_init_globals(yyscan_t yyscanner); + +/* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ +#define yylval yyg->yylval_r -static int yy_init_globals ( yyscan_t yyscanner ); +#define yylloc yyg->yylloc_r - /* This must go here because YYSTYPE and YYLTYPE are included - * from bison output in section 1.*/ - # define yylval yyg->yylval_r - - # define yylloc yyg->yylloc_r - -int yylex_init (yyscan_t* scanner); +int yylex_init(yyscan_t* scanner); -int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); +int yylex_init_extra(YY_EXTRA_TYPE user_defined, yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy ( yyscan_t yyscanner ); +int yylex_destroy(yyscan_t yyscanner); -int yyget_debug ( yyscan_t yyscanner ); +int yyget_debug(yyscan_t yyscanner); -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); +void yyset_debug(int debug_flag, yyscan_t yyscanner); -YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); +YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner); -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); +void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner); -FILE *yyget_in ( yyscan_t yyscanner ); +FILE* yyget_in(yyscan_t yyscanner); -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); +void yyset_in(FILE* _in_str, yyscan_t yyscanner); -FILE *yyget_out ( yyscan_t yyscanner ); +FILE* yyget_out(yyscan_t yyscanner); -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); +void yyset_out(FILE* _out_str, yyscan_t yyscanner); - yy_size_t yyget_leng ( yyscan_t yyscanner ); +int yyget_leng(yyscan_t yyscanner); -char *yyget_text ( yyscan_t yyscanner ); +char* yyget_text(yyscan_t yyscanner); -int yyget_lineno ( yyscan_t yyscanner ); +int yyget_lineno(yyscan_t yyscanner); -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); +void yyset_lineno(int _line_number, yyscan_t yyscanner); -int yyget_column ( yyscan_t yyscanner ); +int yyget_column(yyscan_t yyscanner); -void yyset_column ( int _column_no , yyscan_t yyscanner ); +void yyset_column(int _column_no, yyscan_t yyscanner); -YYSTYPE * yyget_lval ( yyscan_t yyscanner ); +YYSTYPE* yyget_lval(yyscan_t yyscanner); -void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); +void yyset_lval(YYSTYPE* yylval_param, yyscan_t yyscanner); + +YYLTYPE* yyget_lloc(yyscan_t yyscanner); + +void yyset_lloc(YYLTYPE* yylloc_param, yyscan_t yyscanner); - YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); - - void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); - /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap ( yyscan_t yyscanner ); +extern "C" int yywrap(yyscan_t yyscanner); #else -extern int yywrap ( yyscan_t yyscanner ); +extern int yywrap(yyscan_t yyscanner); #endif #endif #ifndef YY_NO_UNPUT - + #endif #ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +static void yy_flex_strncpy(char*, const char*, int, yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +static int yy_flex_strlen(const char*, yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus -static int yyinput ( yyscan_t yyscanner ); +static int yyinput(yyscan_t yyscanner); #else -static int input ( yyscan_t yyscanner ); +static int input(yyscan_t yyscanner); #endif #endif @@ -3349,42 +2380,36 @@ static int input ( yyscan_t yyscanner ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#define ECHO \ + do { \ + if (fwrite(yytext, (size_t)yyleng, 1, yyout)) { \ + } \ + } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - yy_size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ +#define YY_INPUT(buf, result, max_size) \ + if (YY_CURRENT_BUFFER_LVALUE->yy_is_interactive) { \ + int c = '*'; \ + int n; \ + for (n = 0; n < max_size && (c = getc(yyin)) != EOF && c != '\n'; ++n) buf[n] = (char)c; \ + if (c == '\n') buf[n++] = (char)c; \ + if (c == EOF && ferror(yyin)) YY_FATAL_ERROR("input in flex scanner failed"); \ + result = n; \ + } else { \ + errno = 0; \ + while ((result = (int)fread(buf, 1, (yy_size_t)max_size, yyin)) == 0 && ferror(yyin)) { \ + if (errno != EINTR) { \ + YY_FATAL_ERROR("input in flex scanner failed"); \ + break; \ + } \ + errno = 0; \ + clearerr(yyin); \ + } \ + } #endif @@ -3403,7 +2428,7 @@ static int input ( yyscan_t yyscanner ); /* Report a fatal error. */ #ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#define YY_FATAL_ERROR(msg) yy_fatal_error(msg, yyscanner) #endif /* end tables serialization structures and prototypes */ @@ -3414,11 +2439,9 @@ static int input ( yyscan_t yyscanner ); #ifndef YY_DECL #define YY_DECL_IS_OURS 1 -extern int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); +extern int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner); -#define YY_DECL int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) +#define YY_DECL int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng @@ -3430,1144 +2453,1148 @@ extern int yylex \ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; +#define YY_BREAK /*LINTED*/ break; #endif -#define YY_RULE_SETUP \ - YY_USER_ACTION +#define YY_RULE_SETUP YY_USER_ACTION /** The main scanner function which does all the work. */ -YY_DECL -{ - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +YY_DECL { + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yylval = yylval_param; + yylval = yylval_param; - yylloc = yylloc_param; + yylloc = yylloc_param; - if ( !yyg->yy_init ) - { - yyg->yy_init = 1; + if (!yyg->yy_init) { + yyg->yy_init = 1; #ifdef YY_USER_INIT - YY_USER_INIT; + YY_USER_INIT; #endif - if ( ! yyg->yy_start ) - yyg->yy_start = 1; /* first start state */ + if (!yyg->yy_start) yyg->yy_start = 1; /* first start state */ - if ( ! yyin ) - yyin = stdin; + if (!yyin) yyin = stdin; - if ( ! yyout ) - yyout = stdout; + if (!yyout) yyout = stdout; - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (yyscanner); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); - } + if (!YY_CURRENT_BUFFER) { + yyensure_buffer_stack(yyscanner); + YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); + } - yy_load_buffer_state( yyscanner ); - } + yy_load_buffer_state(yyscanner); + } - { + { #line 57 "flex_lexer.l" +#line 3481 "flex_lexer.cpp" -#line 3482 "flex_lexer.cpp" - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ - { - yy_cp = yyg->yy_c_buf_p; + while (/*CONSTCOND*/ 1) /* loops until end-of-file is reached */ + { + yy_cp = yyg->yy_c_buf_p; - /* Support of yytext. */ - *yy_cp = yyg->yy_hold_char; + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; - /* yy_bp points to the position in yy_ch_buf of the start of + /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ - yy_bp = yy_cp; - - yy_current_state = yyg->yy_start; -yy_match: - do - { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1406 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - ++yy_cp; - } - while ( yy_current_state != 1405 ); - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yyg->yy_hold_char; - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP + yy_bp = yy_cp; + + yy_current_state = yyg->yy_start; + yy_match: + do { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if (yy_accept[yy_current_state]) { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { + yy_current_state = (int)yy_def[yy_current_state]; + if (yy_current_state >= 1406) yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + ++yy_cp; + } while (yy_current_state != 1405); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + + yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + + do_action: /* This label is used only to access EOF actions. */ + + switch (yy_act) { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + + case 1: + YY_RULE_SETUP #line 59 "flex_lexer.l" -BEGIN(COMMENT); - YY_BREAK -case 2: -YY_RULE_SETUP + BEGIN(COMMENT); + YY_BREAK + case 2: + YY_RULE_SETUP #line 60 "flex_lexer.l" -/* skipping comment content until a end of line is read */; - YY_BREAK -case 3: -/* rule 3 can match eol */ -YY_RULE_SETUP + /* skipping comment content until a end of line is read */; + YY_BREAK + case 3: + /* rule 3 can match eol */ + YY_RULE_SETUP #line 61 "flex_lexer.l" -BEGIN(INITIAL); - YY_BREAK -case 4: -/* rule 4 can match eol */ -YY_RULE_SETUP + BEGIN(INITIAL); + YY_BREAK + case 4: + /* rule 4 can match eol */ + YY_RULE_SETUP #line 63 "flex_lexer.l" -/* skip whitespace */; - YY_BREAK -case 5: -YY_RULE_SETUP + /* skip whitespace */; + YY_BREAK + case 5: + YY_RULE_SETUP #line 65 "flex_lexer.l" -TOKEN(ADD) - YY_BREAK -case 6: -YY_RULE_SETUP + TOKEN(ADD) + YY_BREAK + case 6: + YY_RULE_SETUP #line 66 "flex_lexer.l" -TOKEN(AFTER) - YY_BREAK -case 7: -YY_RULE_SETUP + TOKEN(AFTER) + YY_BREAK + case 7: + YY_RULE_SETUP #line 67 "flex_lexer.l" -TOKEN(ALL) - YY_BREAK -case 8: -YY_RULE_SETUP + TOKEN(ALL) + YY_BREAK + case 8: + YY_RULE_SETUP #line 68 "flex_lexer.l" -TOKEN(ALTER) - YY_BREAK -case 9: -YY_RULE_SETUP + TOKEN(ALTER) + YY_BREAK + case 9: + YY_RULE_SETUP #line 69 "flex_lexer.l" -TOKEN(ANALYZE) - YY_BREAK -case 10: -YY_RULE_SETUP + TOKEN(ANALYZE) + YY_BREAK + case 10: + YY_RULE_SETUP #line 70 "flex_lexer.l" -TOKEN(AND) - YY_BREAK -case 11: -YY_RULE_SETUP + TOKEN(AND) + YY_BREAK + case 11: + YY_RULE_SETUP #line 71 "flex_lexer.l" -TOKEN(ARRAY) - YY_BREAK -case 12: -YY_RULE_SETUP + TOKEN(ARRAY) + YY_BREAK + case 12: + YY_RULE_SETUP #line 72 "flex_lexer.l" -TOKEN(AS) - YY_BREAK -case 13: -YY_RULE_SETUP + TOKEN(AS) + YY_BREAK + case 13: + YY_RULE_SETUP #line 73 "flex_lexer.l" -TOKEN(ASC) - YY_BREAK -case 14: -YY_RULE_SETUP + TOKEN(ASC) + YY_BREAK + case 14: + YY_RULE_SETUP #line 74 "flex_lexer.l" -TOKEN(BEFORE) - YY_BREAK -case 15: -YY_RULE_SETUP + TOKEN(BEFORE) + YY_BREAK + case 15: + YY_RULE_SETUP #line 75 "flex_lexer.l" -TOKEN(BEGIN) - YY_BREAK -case 16: -YY_RULE_SETUP + TOKEN(BEGIN) + YY_BREAK + case 16: + YY_RULE_SETUP #line 76 "flex_lexer.l" -TOKEN(BETWEEN) - YY_BREAK -case 17: -YY_RULE_SETUP + TOKEN(BETWEEN) + YY_BREAK + case 17: + YY_RULE_SETUP #line 77 "flex_lexer.l" -TOKEN(BIGINT) - YY_BREAK -case 18: -YY_RULE_SETUP + TOKEN(BIGINT) + YY_BREAK + case 18: + YY_RULE_SETUP #line 78 "flex_lexer.l" -TOKEN(BOOLEAN) - YY_BREAK -case 19: -YY_RULE_SETUP + TOKEN(BOOLEAN) + YY_BREAK + case 19: + YY_RULE_SETUP #line 79 "flex_lexer.l" -TOKEN(BY) - YY_BREAK -case 20: -YY_RULE_SETUP + TOKEN(BY) + YY_BREAK + case 20: + YY_RULE_SETUP #line 80 "flex_lexer.l" -TOKEN(CALL) - YY_BREAK -case 21: -YY_RULE_SETUP + TOKEN(CALL) + YY_BREAK + case 21: + YY_RULE_SETUP #line 81 "flex_lexer.l" -TOKEN(CASCADE) - YY_BREAK -case 22: -YY_RULE_SETUP + TOKEN(CASCADE) + YY_BREAK + case 22: + YY_RULE_SETUP #line 82 "flex_lexer.l" -TOKEN(CASE) - YY_BREAK -case 23: -YY_RULE_SETUP + TOKEN(CASE) + YY_BREAK + case 23: + YY_RULE_SETUP #line 83 "flex_lexer.l" -TOKEN(CAST) - YY_BREAK -case 24: -YY_RULE_SETUP + TOKEN(CAST) + YY_BREAK + case 24: + YY_RULE_SETUP #line 84 "flex_lexer.l" -TOKEN(CHAR) - YY_BREAK -case 25: -YY_RULE_SETUP + TOKEN(CHAR) + YY_BREAK + case 25: + YY_RULE_SETUP #line 85 "flex_lexer.l" -TOKEN(COLUMN) - YY_BREAK -case 26: -YY_RULE_SETUP + TOKEN(COLUMN) + YY_BREAK + case 26: + YY_RULE_SETUP #line 86 "flex_lexer.l" -TOKEN(COLUMNS) - YY_BREAK -case 27: -YY_RULE_SETUP + TOKEN(COLUMNS) + YY_BREAK + case 27: + YY_RULE_SETUP #line 87 "flex_lexer.l" -TOKEN(COMMIT) - YY_BREAK -case 28: -YY_RULE_SETUP + TOKEN(COMMIT) + YY_BREAK + case 28: + YY_RULE_SETUP #line 88 "flex_lexer.l" -TOKEN(CONTROL) - YY_BREAK -case 29: -YY_RULE_SETUP + TOKEN(CONTROL) + YY_BREAK + case 29: + YY_RULE_SETUP #line 89 "flex_lexer.l" -TOKEN(COPY) - YY_BREAK -case 30: -YY_RULE_SETUP + TOKEN(COPY) + YY_BREAK + case 30: + YY_RULE_SETUP #line 90 "flex_lexer.l" -TOKEN(CREATE) - YY_BREAK -case 31: -YY_RULE_SETUP + TOKEN(CREATE) + YY_BREAK + case 31: + YY_RULE_SETUP #line 91 "flex_lexer.l" -TOKEN(CROSS) - YY_BREAK -case 32: -YY_RULE_SETUP + TOKEN(CROSS) + YY_BREAK + case 32: + YY_RULE_SETUP #line 92 "flex_lexer.l" -TOKEN(DATE) - YY_BREAK -case 33: -YY_RULE_SETUP + TOKEN(DATE) + YY_BREAK + case 33: + YY_RULE_SETUP #line 93 "flex_lexer.l" -TOKEN(DATETIME) - YY_BREAK -case 34: -YY_RULE_SETUP + TOKEN(DATETIME) + YY_BREAK + case 34: + YY_RULE_SETUP #line 94 "flex_lexer.l" -TOKEN(DAY) - YY_BREAK -case 35: -YY_RULE_SETUP + TOKEN(DAY) + YY_BREAK + case 35: + YY_RULE_SETUP #line 95 "flex_lexer.l" -TOKEN(DAYS) - YY_BREAK -case 36: -YY_RULE_SETUP + TOKEN(DAYS) + YY_BREAK + case 36: + YY_RULE_SETUP #line 96 "flex_lexer.l" -TOKEN(DEALLOCATE) - YY_BREAK -case 37: -YY_RULE_SETUP + TOKEN(DEALLOCATE) + YY_BREAK + case 37: + YY_RULE_SETUP #line 97 "flex_lexer.l" -TOKEN(DECIMAL) - YY_BREAK -case 38: -YY_RULE_SETUP + TOKEN(DECIMAL) + YY_BREAK + case 38: + YY_RULE_SETUP #line 98 "flex_lexer.l" -TOKEN(DEFAULT) - YY_BREAK -case 39: -YY_RULE_SETUP + TOKEN(DEFAULT) + YY_BREAK + case 39: + YY_RULE_SETUP #line 99 "flex_lexer.l" -TOKEN(DELETE) - YY_BREAK -case 40: -YY_RULE_SETUP + TOKEN(DELETE) + YY_BREAK + case 40: + YY_RULE_SETUP #line 100 "flex_lexer.l" -TOKEN(DELTA) - YY_BREAK -case 41: -YY_RULE_SETUP + TOKEN(DELTA) + YY_BREAK + case 41: + YY_RULE_SETUP #line 101 "flex_lexer.l" -TOKEN(DESC) - YY_BREAK -case 42: -YY_RULE_SETUP + TOKEN(DESC) + YY_BREAK + case 42: + YY_RULE_SETUP #line 102 "flex_lexer.l" -TOKEN(DESCRIBE) - YY_BREAK -case 43: -YY_RULE_SETUP + TOKEN(DESCRIBE) + YY_BREAK + case 43: + YY_RULE_SETUP #line 103 "flex_lexer.l" -TOKEN(DIRECT) - YY_BREAK -case 44: -YY_RULE_SETUP + TOKEN(DIRECT) + YY_BREAK + case 44: + YY_RULE_SETUP #line 104 "flex_lexer.l" -TOKEN(DISTINCT) - YY_BREAK -case 45: -YY_RULE_SETUP + TOKEN(DISTINCT) + YY_BREAK + case 45: + YY_RULE_SETUP #line 105 "flex_lexer.l" -TOKEN(DIV) - YY_BREAK -case 46: -YY_RULE_SETUP + TOKEN(DIV) + YY_BREAK + case 46: + YY_RULE_SETUP #line 106 "flex_lexer.l" -TOKEN(DOUBLE) - YY_BREAK -case 47: -YY_RULE_SETUP + TOKEN(DOUBLE) + YY_BREAK + case 47: + YY_RULE_SETUP #line 107 "flex_lexer.l" -TOKEN(DROP) - YY_BREAK -case 48: -YY_RULE_SETUP + TOKEN(DROP) + YY_BREAK + case 48: + YY_RULE_SETUP #line 108 "flex_lexer.l" -TOKEN(ELSE) - YY_BREAK -case 49: -YY_RULE_SETUP + TOKEN(ELSE) + YY_BREAK + case 49: + YY_RULE_SETUP #line 109 "flex_lexer.l" -TOKEN(ENCODING) - YY_BREAK -case 50: -YY_RULE_SETUP + TOKEN(ENCODING) + YY_BREAK + case 50: + YY_RULE_SETUP #line 110 "flex_lexer.l" -TOKEN(END) - YY_BREAK -case 51: -YY_RULE_SETUP + TOKEN(END) + YY_BREAK + case 51: + YY_RULE_SETUP #line 111 "flex_lexer.l" -TOKEN(ESCAPE) - YY_BREAK -case 52: -YY_RULE_SETUP + TOKEN(ESCAPE) + YY_BREAK + case 52: + YY_RULE_SETUP #line 112 "flex_lexer.l" -TOKEN(EXCEPT) - YY_BREAK -case 53: -YY_RULE_SETUP + TOKEN(EXCEPT) + YY_BREAK + case 53: + YY_RULE_SETUP #line 113 "flex_lexer.l" -TOKEN(EXECUTE) - YY_BREAK -case 54: -YY_RULE_SETUP + TOKEN(EXECUTE) + YY_BREAK + case 54: + YY_RULE_SETUP #line 114 "flex_lexer.l" -TOKEN(EXISTS) - YY_BREAK -case 55: -YY_RULE_SETUP + TOKEN(EXISTS) + YY_BREAK + case 55: + YY_RULE_SETUP #line 115 "flex_lexer.l" -TOKEN(EXPLAIN) - YY_BREAK -case 56: -YY_RULE_SETUP + TOKEN(EXPLAIN) + YY_BREAK + case 56: + YY_RULE_SETUP #line 116 "flex_lexer.l" -TOKEN(EXTRACT) - YY_BREAK -case 57: -YY_RULE_SETUP + TOKEN(EXTRACT) + YY_BREAK + case 57: + YY_RULE_SETUP #line 117 "flex_lexer.l" -TOKEN(FALSE) - YY_BREAK -case 58: -YY_RULE_SETUP + TOKEN(FALSE) + YY_BREAK + case 58: + YY_RULE_SETUP #line 118 "flex_lexer.l" -TOKEN(FILE) - YY_BREAK -case 59: -YY_RULE_SETUP + TOKEN(FILE) + YY_BREAK + case 59: + YY_RULE_SETUP #line 119 "flex_lexer.l" -TOKEN(FLOAT) - YY_BREAK -case 60: -YY_RULE_SETUP + TOKEN(FLOAT) + YY_BREAK + case 60: + YY_RULE_SETUP #line 120 "flex_lexer.l" -TOKEN(FOLLOWING) - YY_BREAK -case 61: -YY_RULE_SETUP + TOKEN(FOLLOWING) + YY_BREAK + case 61: + YY_RULE_SETUP #line 121 "flex_lexer.l" -TOKEN(FOR) - YY_BREAK -case 62: -YY_RULE_SETUP + TOKEN(FOR) + YY_BREAK + case 62: + YY_RULE_SETUP #line 122 "flex_lexer.l" -TOKEN(FOREIGN) - YY_BREAK -case 63: -YY_RULE_SETUP + TOKEN(FOREIGN) + YY_BREAK + case 63: + YY_RULE_SETUP #line 123 "flex_lexer.l" -TOKEN(FORMAT) - YY_BREAK -case 64: -YY_RULE_SETUP + TOKEN(FORMAT) + YY_BREAK + case 64: + YY_RULE_SETUP #line 124 "flex_lexer.l" -TOKEN(FROM) - YY_BREAK -case 65: -YY_RULE_SETUP + TOKEN(FROM) + YY_BREAK + case 65: + YY_RULE_SETUP #line 125 "flex_lexer.l" -TOKEN(FULL) - YY_BREAK -case 66: -YY_RULE_SETUP + TOKEN(FULL) + YY_BREAK + case 66: + YY_RULE_SETUP #line 126 "flex_lexer.l" -TOKEN(GLOBAL) - YY_BREAK -case 67: -YY_RULE_SETUP + TOKEN(GLOBAL) + YY_BREAK + case 67: + YY_RULE_SETUP #line 127 "flex_lexer.l" -TOKEN(GROUP) - YY_BREAK -case 68: -YY_RULE_SETUP + TOKEN(GROUP) + YY_BREAK + case 68: + YY_RULE_SETUP #line 128 "flex_lexer.l" -TOKEN(GROUPS) - YY_BREAK -case 69: -YY_RULE_SETUP + TOKEN(GROUPS) + YY_BREAK + case 69: + YY_RULE_SETUP #line 129 "flex_lexer.l" -TOKEN(HASH) - YY_BREAK -case 70: -YY_RULE_SETUP + TOKEN(HASH) + YY_BREAK + case 70: + YY_RULE_SETUP #line 130 "flex_lexer.l" -TOKEN(HAVING) - YY_BREAK -case 71: -YY_RULE_SETUP + TOKEN(HAVING) + YY_BREAK + case 71: + YY_RULE_SETUP #line 131 "flex_lexer.l" -TOKEN(HINT) - YY_BREAK -case 72: -YY_RULE_SETUP + TOKEN(HINT) + YY_BREAK + case 72: + YY_RULE_SETUP #line 132 "flex_lexer.l" -TOKEN(HOUR) - YY_BREAK -case 73: -YY_RULE_SETUP + TOKEN(HOUR) + YY_BREAK + case 73: + YY_RULE_SETUP #line 133 "flex_lexer.l" -TOKEN(HOURS) - YY_BREAK -case 74: -YY_RULE_SETUP + TOKEN(HOURS) + YY_BREAK + case 74: + YY_RULE_SETUP #line 134 "flex_lexer.l" -TOKEN(IF) - YY_BREAK -case 75: -YY_RULE_SETUP + TOKEN(IF) + YY_BREAK + case 75: + YY_RULE_SETUP #line 135 "flex_lexer.l" -TOKEN(ILIKE) - YY_BREAK -case 76: -YY_RULE_SETUP + TOKEN(ILIKE) + YY_BREAK + case 76: + YY_RULE_SETUP #line 136 "flex_lexer.l" -TOKEN(IMPORT) - YY_BREAK -case 77: -YY_RULE_SETUP + TOKEN(IMPORT) + YY_BREAK + case 77: + YY_RULE_SETUP #line 137 "flex_lexer.l" -TOKEN(IN) - YY_BREAK -case 78: -YY_RULE_SETUP + TOKEN(IN) + YY_BREAK + case 78: + YY_RULE_SETUP #line 138 "flex_lexer.l" -TOKEN(INDEX) - YY_BREAK -case 79: -YY_RULE_SETUP + TOKEN(INDEX) + YY_BREAK + case 79: + YY_RULE_SETUP #line 139 "flex_lexer.l" -TOKEN(INNER) - YY_BREAK -case 80: -YY_RULE_SETUP + TOKEN(INNER) + YY_BREAK + case 80: + YY_RULE_SETUP #line 140 "flex_lexer.l" -TOKEN(INSERT) - YY_BREAK -case 81: -YY_RULE_SETUP + TOKEN(INSERT) + YY_BREAK + case 81: + YY_RULE_SETUP #line 141 "flex_lexer.l" -TOKEN(INT) - YY_BREAK -case 82: -YY_RULE_SETUP + TOKEN(INT) + YY_BREAK + case 82: + YY_RULE_SETUP #line 142 "flex_lexer.l" -TOKEN(INTEGER) - YY_BREAK -case 83: -YY_RULE_SETUP + TOKEN(INTEGER) + YY_BREAK + case 83: + YY_RULE_SETUP #line 143 "flex_lexer.l" -TOKEN(INTERSECT) - YY_BREAK -case 84: -YY_RULE_SETUP + TOKEN(INTERSECT) + YY_BREAK + case 84: + YY_RULE_SETUP #line 144 "flex_lexer.l" -TOKEN(INTERVAL) - YY_BREAK -case 85: -YY_RULE_SETUP + TOKEN(INTERVAL) + YY_BREAK + case 85: + YY_RULE_SETUP #line 145 "flex_lexer.l" -TOKEN(INTO) - YY_BREAK -case 86: -YY_RULE_SETUP + TOKEN(INTO) + YY_BREAK + case 86: + YY_RULE_SETUP #line 146 "flex_lexer.l" -TOKEN(IS) - YY_BREAK -case 87: -YY_RULE_SETUP + TOKEN(IS) + YY_BREAK + case 87: + YY_RULE_SETUP #line 147 "flex_lexer.l" -TOKEN(ISNULL) - YY_BREAK -case 88: -YY_RULE_SETUP + TOKEN(ISNULL) + YY_BREAK + case 88: + YY_RULE_SETUP #line 148 "flex_lexer.l" -TOKEN(JOIN) - YY_BREAK -case 89: -YY_RULE_SETUP + TOKEN(JOIN) + YY_BREAK + case 89: + YY_RULE_SETUP #line 149 "flex_lexer.l" -TOKEN(KEY) - YY_BREAK -case 90: -YY_RULE_SETUP + TOKEN(KEY) + YY_BREAK + case 90: + YY_RULE_SETUP #line 150 "flex_lexer.l" -TOKEN(LEFT) - YY_BREAK -case 91: -YY_RULE_SETUP + TOKEN(LEFT) + YY_BREAK + case 91: + YY_RULE_SETUP #line 151 "flex_lexer.l" -TOKEN(LIKE) - YY_BREAK -case 92: -YY_RULE_SETUP + TOKEN(LIKE) + YY_BREAK + case 92: + YY_RULE_SETUP #line 152 "flex_lexer.l" -TOKEN(LIMIT) - YY_BREAK -case 93: -YY_RULE_SETUP + TOKEN(LIMIT) + YY_BREAK + case 93: + YY_RULE_SETUP #line 153 "flex_lexer.l" -TOKEN(LOAD) - YY_BREAK -case 94: -YY_RULE_SETUP + TOKEN(LOAD) + YY_BREAK + case 94: + YY_RULE_SETUP #line 154 "flex_lexer.l" -TOKEN(LOCAL) - YY_BREAK -case 95: -YY_RULE_SETUP + TOKEN(LOCAL) + YY_BREAK + case 95: + YY_RULE_SETUP #line 155 "flex_lexer.l" -TOKEN(LOCKED) - YY_BREAK -case 96: -YY_RULE_SETUP + TOKEN(LOCKED) + YY_BREAK + case 96: + YY_RULE_SETUP #line 156 "flex_lexer.l" -TOKEN(LONG) - YY_BREAK -case 97: -YY_RULE_SETUP + TOKEN(LONG) + YY_BREAK + case 97: + YY_RULE_SETUP #line 157 "flex_lexer.l" -TOKEN(MERGE) - YY_BREAK -case 98: -YY_RULE_SETUP + TOKEN(MERGE) + YY_BREAK + case 98: + YY_RULE_SETUP #line 158 "flex_lexer.l" -TOKEN(MINUS) - YY_BREAK -case 99: -YY_RULE_SETUP + TOKEN(MINUS) + YY_BREAK + case 99: + YY_RULE_SETUP #line 159 "flex_lexer.l" -TOKEN(MINUTE) - YY_BREAK -case 100: -YY_RULE_SETUP + TOKEN(MINUTE) + YY_BREAK + case 100: + YY_RULE_SETUP #line 160 "flex_lexer.l" -TOKEN(MINUTES) - YY_BREAK -case 101: -YY_RULE_SETUP + TOKEN(MINUTES) + YY_BREAK + case 101: + YY_RULE_SETUP #line 161 "flex_lexer.l" -TOKEN(MOD) - YY_BREAK -case 102: -YY_RULE_SETUP + TOKEN(MOD) + YY_BREAK + case 102: + YY_RULE_SETUP #line 162 "flex_lexer.l" -TOKEN(MONTH) - YY_BREAK -case 103: -YY_RULE_SETUP + TOKEN(MONTH) + YY_BREAK + case 103: + YY_RULE_SETUP #line 163 "flex_lexer.l" -TOKEN(MONTHS) - YY_BREAK -case 104: -YY_RULE_SETUP + TOKEN(MONTHS) + YY_BREAK + case 104: + YY_RULE_SETUP #line 164 "flex_lexer.l" -TOKEN(NATURAL) - YY_BREAK -case 105: -YY_RULE_SETUP + TOKEN(NATURAL) + YY_BREAK + case 105: + YY_RULE_SETUP #line 165 "flex_lexer.l" -TOKEN(NO) - YY_BREAK -case 106: -YY_RULE_SETUP + TOKEN(NO) + YY_BREAK + case 106: + YY_RULE_SETUP #line 166 "flex_lexer.l" -TOKEN(NOT) - YY_BREAK -case 107: -YY_RULE_SETUP + TOKEN(NOT) + YY_BREAK + case 107: + YY_RULE_SETUP #line 167 "flex_lexer.l" -TOKEN(NOWAIT) - YY_BREAK -case 108: -YY_RULE_SETUP + TOKEN(NOWAIT) + YY_BREAK + case 108: + YY_RULE_SETUP #line 168 "flex_lexer.l" -TOKEN(NULL) - YY_BREAK -case 109: -YY_RULE_SETUP + TOKEN(NULL) + YY_BREAK + case 109: + YY_RULE_SETUP #line 169 "flex_lexer.l" -TOKEN(NVARCHAR) - YY_BREAK -case 110: -YY_RULE_SETUP + TOKEN(NVARCHAR) + YY_BREAK + case 110: + YY_RULE_SETUP #line 170 "flex_lexer.l" -TOKEN(OF) - YY_BREAK -case 111: -YY_RULE_SETUP + TOKEN(OF) + YY_BREAK + case 111: + YY_RULE_SETUP #line 171 "flex_lexer.l" -TOKEN(OFF) - YY_BREAK -case 112: -YY_RULE_SETUP + TOKEN(OFF) + YY_BREAK + case 112: + YY_RULE_SETUP #line 172 "flex_lexer.l" -TOKEN(OFFSET) - YY_BREAK -case 113: -YY_RULE_SETUP + TOKEN(OFFSET) + YY_BREAK + case 113: + YY_RULE_SETUP #line 173 "flex_lexer.l" -TOKEN(ON) - YY_BREAK -case 114: -YY_RULE_SETUP + TOKEN(ON) + YY_BREAK + case 114: + YY_RULE_SETUP #line 174 "flex_lexer.l" -TOKEN(OR) - YY_BREAK -case 115: -YY_RULE_SETUP + TOKEN(OR) + YY_BREAK + case 115: + YY_RULE_SETUP #line 175 "flex_lexer.l" -TOKEN(ORDER) - YY_BREAK -case 116: -YY_RULE_SETUP + TOKEN(ORDER) + YY_BREAK + case 116: + YY_RULE_SETUP #line 176 "flex_lexer.l" -TOKEN(OUTER) - YY_BREAK -case 117: -YY_RULE_SETUP + TOKEN(OUTER) + YY_BREAK + case 117: + YY_RULE_SETUP #line 177 "flex_lexer.l" -TOKEN(OVER) - YY_BREAK -case 118: -YY_RULE_SETUP + TOKEN(OVER) + YY_BREAK + case 118: + YY_RULE_SETUP #line 178 "flex_lexer.l" -TOKEN(PARAMETERS) - YY_BREAK -case 119: -YY_RULE_SETUP + TOKEN(PARAMETERS) + YY_BREAK + case 119: + YY_RULE_SETUP #line 179 "flex_lexer.l" -TOKEN(PARTITION) - YY_BREAK -case 120: -YY_RULE_SETUP + TOKEN(PARTITION) + YY_BREAK + case 120: + YY_RULE_SETUP #line 180 "flex_lexer.l" -TOKEN(PLAN) - YY_BREAK -case 121: -YY_RULE_SETUP + TOKEN(PLAN) + YY_BREAK + case 121: + YY_RULE_SETUP #line 181 "flex_lexer.l" -TOKEN(PRECEDING) - YY_BREAK -case 122: -YY_RULE_SETUP + TOKEN(PRECEDING) + YY_BREAK + case 122: + YY_RULE_SETUP #line 182 "flex_lexer.l" -TOKEN(PREPARE) - YY_BREAK -case 123: -YY_RULE_SETUP + TOKEN(PREPARE) + YY_BREAK + case 123: + YY_RULE_SETUP #line 183 "flex_lexer.l" -TOKEN(PRIMARY) - YY_BREAK -case 124: -YY_RULE_SETUP + TOKEN(PRIMARY) + YY_BREAK + case 124: + YY_RULE_SETUP #line 184 "flex_lexer.l" -TOKEN(RANGE) - YY_BREAK -case 125: -YY_RULE_SETUP + TOKEN(RANGE) + YY_BREAK + case 125: + YY_RULE_SETUP #line 185 "flex_lexer.l" -TOKEN(REAL) - YY_BREAK -case 126: -YY_RULE_SETUP + TOKEN(REAL) + YY_BREAK + case 126: + YY_RULE_SETUP #line 186 "flex_lexer.l" -TOKEN(REFERENCES) - YY_BREAK -case 127: -YY_RULE_SETUP + TOKEN(REFERENCES) + YY_BREAK + case 127: + YY_RULE_SETUP #line 187 "flex_lexer.l" -TOKEN(RENAME) - YY_BREAK -case 128: -YY_RULE_SETUP + TOKEN(RENAME) + YY_BREAK + case 128: + YY_RULE_SETUP #line 188 "flex_lexer.l" -TOKEN(RESTRICT) - YY_BREAK -case 129: -YY_RULE_SETUP + TOKEN(RESTRICT) + YY_BREAK + case 129: + YY_RULE_SETUP #line 189 "flex_lexer.l" -TOKEN(RIGHT) - YY_BREAK -case 130: -YY_RULE_SETUP + TOKEN(RIGHT) + YY_BREAK + case 130: + YY_RULE_SETUP #line 190 "flex_lexer.l" -TOKEN(ROLLBACK) - YY_BREAK -case 131: -YY_RULE_SETUP + TOKEN(ROLLBACK) + YY_BREAK + case 131: + YY_RULE_SETUP #line 191 "flex_lexer.l" -TOKEN(ROWS) - YY_BREAK -case 132: -YY_RULE_SETUP + TOKEN(ROWS) + YY_BREAK + case 132: + YY_RULE_SETUP #line 192 "flex_lexer.l" -TOKEN(SCHEMA) - YY_BREAK -case 133: -YY_RULE_SETUP + TOKEN(SCHEMA) + YY_BREAK + case 133: + YY_RULE_SETUP #line 193 "flex_lexer.l" -TOKEN(SCHEMAS) - YY_BREAK -case 134: -YY_RULE_SETUP + TOKEN(SCHEMAS) + YY_BREAK + case 134: + YY_RULE_SETUP #line 194 "flex_lexer.l" -TOKEN(SECOND) - YY_BREAK -case 135: -YY_RULE_SETUP + TOKEN(SECOND) + YY_BREAK + case 135: + YY_RULE_SETUP #line 195 "flex_lexer.l" -TOKEN(SECONDS) - YY_BREAK -case 136: -YY_RULE_SETUP + TOKEN(SECONDS) + YY_BREAK + case 136: + YY_RULE_SETUP #line 196 "flex_lexer.l" -TOKEN(SELECT) - YY_BREAK -case 137: -YY_RULE_SETUP + TOKEN(SELECT) + YY_BREAK + case 137: + YY_RULE_SETUP #line 197 "flex_lexer.l" -TOKEN(SET) - YY_BREAK -case 138: -YY_RULE_SETUP + TOKEN(SET) + YY_BREAK + case 138: + YY_RULE_SETUP #line 198 "flex_lexer.l" -TOKEN(SHARE) - YY_BREAK -case 139: -YY_RULE_SETUP + TOKEN(SHARE) + YY_BREAK + case 139: + YY_RULE_SETUP #line 199 "flex_lexer.l" -TOKEN(SHOW) - YY_BREAK -case 140: -YY_RULE_SETUP + TOKEN(SHOW) + YY_BREAK + case 140: + YY_RULE_SETUP #line 200 "flex_lexer.l" -TOKEN(SKIP) - YY_BREAK -case 141: -YY_RULE_SETUP + TOKEN(SKIP) + YY_BREAK + case 141: + YY_RULE_SETUP #line 201 "flex_lexer.l" -TOKEN(SMALLINT) - YY_BREAK -case 142: -YY_RULE_SETUP + TOKEN(SMALLINT) + YY_BREAK + case 142: + YY_RULE_SETUP #line 202 "flex_lexer.l" -TOKEN(SORTED) - YY_BREAK -case 143: -YY_RULE_SETUP + TOKEN(SORTED) + YY_BREAK + case 143: + YY_RULE_SETUP #line 203 "flex_lexer.l" -TOKEN(SPATIAL) - YY_BREAK -case 144: -YY_RULE_SETUP + TOKEN(SPATIAL) + YY_BREAK + case 144: + YY_RULE_SETUP #line 204 "flex_lexer.l" -TOKEN(TABLE) - YY_BREAK -case 145: -YY_RULE_SETUP + TOKEN(TABLE) + YY_BREAK + case 145: + YY_RULE_SETUP #line 205 "flex_lexer.l" -TOKEN(TABLES) - YY_BREAK -case 146: -YY_RULE_SETUP + TOKEN(TABLES) + YY_BREAK + case 146: + YY_RULE_SETUP #line 206 "flex_lexer.l" -TOKEN(TEMPORARY) - YY_BREAK -case 147: -YY_RULE_SETUP + TOKEN(TEMPORARY) + YY_BREAK + case 147: + YY_RULE_SETUP #line 207 "flex_lexer.l" -TOKEN(TEXT) - YY_BREAK -case 148: -YY_RULE_SETUP + TOKEN(TEXT) + YY_BREAK + case 148: + YY_RULE_SETUP #line 208 "flex_lexer.l" -TOKEN(THEN) - YY_BREAK -case 149: -YY_RULE_SETUP + TOKEN(THEN) + YY_BREAK + case 149: + YY_RULE_SETUP #line 209 "flex_lexer.l" -TOKEN(TIME) - YY_BREAK -case 150: -YY_RULE_SETUP + TOKEN(TIME) + YY_BREAK + case 150: + YY_RULE_SETUP #line 210 "flex_lexer.l" -TOKEN(TIMESTAMP) - YY_BREAK -case 151: -YY_RULE_SETUP + TOKEN(TIMESTAMP) + YY_BREAK + case 151: + YY_RULE_SETUP #line 211 "flex_lexer.l" -TOKEN(TO) - YY_BREAK -case 152: -YY_RULE_SETUP + TOKEN(TO) + YY_BREAK + case 152: + YY_RULE_SETUP #line 212 "flex_lexer.l" -TOKEN(TOP) - YY_BREAK -case 153: -YY_RULE_SETUP + TOKEN(TOP) + YY_BREAK + case 153: + YY_RULE_SETUP #line 213 "flex_lexer.l" -TOKEN(TRANSACTION) - YY_BREAK -case 154: -YY_RULE_SETUP + TOKEN(TRANSACTION) + YY_BREAK + case 154: + YY_RULE_SETUP #line 214 "flex_lexer.l" -TOKEN(TRUE) - YY_BREAK -case 155: -YY_RULE_SETUP + TOKEN(TRUE) + YY_BREAK + case 155: + YY_RULE_SETUP #line 215 "flex_lexer.l" -TOKEN(TRUNCATE) - YY_BREAK -case 156: -YY_RULE_SETUP + TOKEN(TRUNCATE) + YY_BREAK + case 156: + YY_RULE_SETUP #line 216 "flex_lexer.l" -TOKEN(UNBOUNDED) - YY_BREAK -case 157: -YY_RULE_SETUP + TOKEN(UNBOUNDED) + YY_BREAK + case 157: + YY_RULE_SETUP #line 217 "flex_lexer.l" -TOKEN(UNION) - YY_BREAK -case 158: -YY_RULE_SETUP + TOKEN(UNION) + YY_BREAK + case 158: + YY_RULE_SETUP #line 218 "flex_lexer.l" -TOKEN(UNIQUE) - YY_BREAK -case 159: -YY_RULE_SETUP + TOKEN(UNIQUE) + YY_BREAK + case 159: + YY_RULE_SETUP #line 219 "flex_lexer.l" -TOKEN(UNLOAD) - YY_BREAK -case 160: -YY_RULE_SETUP + TOKEN(UNLOAD) + YY_BREAK + case 160: + YY_RULE_SETUP #line 220 "flex_lexer.l" -TOKEN(UPDATE) - YY_BREAK -case 161: -YY_RULE_SETUP + TOKEN(UPDATE) + YY_BREAK + case 161: + YY_RULE_SETUP #line 221 "flex_lexer.l" -TOKEN(USING) - YY_BREAK -case 162: -YY_RULE_SETUP + TOKEN(USING) + YY_BREAK + case 162: + YY_RULE_SETUP #line 222 "flex_lexer.l" -TOKEN(VALUES) - YY_BREAK -case 163: -YY_RULE_SETUP + TOKEN(VALUES) + YY_BREAK + case 163: + YY_RULE_SETUP #line 223 "flex_lexer.l" -TOKEN(VARCHAR) - YY_BREAK -case 164: -YY_RULE_SETUP + TOKEN(VARCHAR) + YY_BREAK + case 164: + YY_RULE_SETUP #line 224 "flex_lexer.l" -TOKEN(VIEW) - YY_BREAK -case 165: -YY_RULE_SETUP + TOKEN(VIEW) + YY_BREAK + case 165: + YY_RULE_SETUP #line 225 "flex_lexer.l" -TOKEN(VIRTUAL) - YY_BREAK -case 166: -YY_RULE_SETUP + TOKEN(VIRTUAL) + YY_BREAK + case 166: + YY_RULE_SETUP #line 226 "flex_lexer.l" -TOKEN(WHEN) - YY_BREAK -case 167: -YY_RULE_SETUP + TOKEN(WHEN) + YY_BREAK + case 167: + YY_RULE_SETUP #line 227 "flex_lexer.l" -TOKEN(WHERE) - YY_BREAK -case 168: -YY_RULE_SETUP + TOKEN(WHERE) + YY_BREAK + case 168: + YY_RULE_SETUP #line 228 "flex_lexer.l" -TOKEN(WITH) - YY_BREAK -case 169: -YY_RULE_SETUP + TOKEN(WITH) + YY_BREAK + case 169: + YY_RULE_SETUP #line 229 "flex_lexer.l" -TOKEN(YEAR) - YY_BREAK -case 170: -YY_RULE_SETUP + TOKEN(YEAR) + YY_BREAK + case 170: + YY_RULE_SETUP #line 230 "flex_lexer.l" -TOKEN(YEARS) - YY_BREAK -case 171: -/* rule 171 can match eol */ -YY_RULE_SETUP + TOKEN(YEARS) + YY_BREAK + case 171: + /* rule 171 can match eol */ + YY_RULE_SETUP #line 232 "flex_lexer.l" -TOKEN(CURRENT_ROW) - YY_BREAK -case 172: -/* rule 172 can match eol */ -YY_RULE_SETUP + TOKEN(CURRENT_ROW) + YY_BREAK + case 172: + /* rule 172 can match eol */ + YY_RULE_SETUP #line 233 "flex_lexer.l" -TOKEN(CHARACTER_VARYING) - YY_BREAK -/* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ -case 173: -YY_RULE_SETUP + TOKEN(CHARACTER_VARYING) + YY_BREAK + /* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ + case 173: + YY_RULE_SETUP #line 236 "flex_lexer.l" -TOKEN(EQUALS) - YY_BREAK -case 174: -YY_RULE_SETUP + TOKEN(EQUALS) + YY_BREAK + case 174: + YY_RULE_SETUP #line 237 "flex_lexer.l" -TOKEN(NULLSAFEEQUALS) - YY_BREAK -case 175: -YY_RULE_SETUP + TOKEN(NULLSAFEEQUALS) + YY_BREAK + case 175: + YY_RULE_SETUP #line 238 "flex_lexer.l" -TOKEN(NOTEQUALS) - YY_BREAK -case 176: -YY_RULE_SETUP + TOKEN(NOTEQUALS) + YY_BREAK + case 176: + YY_RULE_SETUP #line 239 "flex_lexer.l" -TOKEN(NOTEQUALS) - YY_BREAK -case 177: -YY_RULE_SETUP + TOKEN(NOTEQUALS) + YY_BREAK + case 177: + YY_RULE_SETUP #line 240 "flex_lexer.l" -TOKEN(LESSEQ) - YY_BREAK -case 178: -YY_RULE_SETUP + TOKEN(LESSEQ) + YY_BREAK + case 178: + YY_RULE_SETUP #line 241 "flex_lexer.l" -TOKEN(GREATEREQ) - YY_BREAK -case 179: -YY_RULE_SETUP + TOKEN(GREATEREQ) + YY_BREAK + case 179: + YY_RULE_SETUP #line 242 "flex_lexer.l" -TOKEN(LOGICALAND) - YY_BREAK -case 180: -YY_RULE_SETUP + TOKEN(LOGICALAND) + YY_BREAK + case 180: + YY_RULE_SETUP #line 243 "flex_lexer.l" -TOKEN(LOGICALOR) - YY_BREAK -case 181: -YY_RULE_SETUP + TOKEN(LOGICALOR) + YY_BREAK + case 181: + YY_RULE_SETUP #line 244 "flex_lexer.l" -TOKEN(BITSHIFTLEFT) - YY_BREAK -case 182: -YY_RULE_SETUP + TOKEN(BITSHIFTLEFT) + YY_BREAK + case 182: + YY_RULE_SETUP #line 245 "flex_lexer.l" -TOKEN(BITSHIFTRIGHT) - YY_BREAK -case 183: -YY_RULE_SETUP + TOKEN(BITSHIFTRIGHT) + YY_BREAK + case 183: + YY_RULE_SETUP #line 247 "flex_lexer.l" -{ return yytext[0]; } - YY_BREAK -case 184: + { + return yytext[0]; + } + YY_BREAK + case 184: #line 250 "flex_lexer.l" -case 185: + case 185: #line 251 "flex_lexer.l" -case 186: -YY_RULE_SETUP + case 186: + YY_RULE_SETUP #line 251 "flex_lexer.l" -{ - yylval->fval = atof(yytext); - return SQL_FLOATVAL; -} - YY_BREAK -/* + { + yylval->fval = atof(yytext); + return SQL_FLOATVAL; + } + YY_BREAK + /* * Regularly, negative literals are treated as . This does not work for LLONG_MIN, as it has no * positive equivalent. We thus match for LLONG_MIN specifically. This is not an issue for floats, where * numeric_limits::lowest() == -numeric_limits::max(); */ -case 187: -YY_RULE_SETUP + case 187: + YY_RULE_SETUP #line 261 "flex_lexer.l" -{ - yylval->ival = LLONG_MIN; - return SQL_INTVAL; -} - YY_BREAK -case 188: -YY_RULE_SETUP + { + yylval->ival = LLONG_MIN; + return SQL_INTVAL; + } + YY_BREAK + case 188: + YY_RULE_SETUP #line 266 "flex_lexer.l" -{ - errno = 0; - yylval->ival = strtoll(yytext, nullptr, 0); - if (errno) { - yylval->sval = strdup(yytext); - return SQL_BIGINTVAL; - } - return SQL_INTVAL; -} - YY_BREAK -case 189: -YY_RULE_SETUP + { + errno = 0; + yylval->ival = strtoll(yytext, nullptr, 0); + if (errno) { + yylval->sval = strdup(yytext); + return SQL_BIGINTVAL; + } + return SQL_INTVAL; + } + YY_BREAK + case 189: + YY_RULE_SETUP #line 276 "flex_lexer.l" -{ - // Crop the leading and trailing quote char - yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); - return SQL_IDENTIFIER; -} - YY_BREAK -case 190: -YY_RULE_SETUP + { + // Crop the leading and trailing quote char + yylval->sval = hsql::substr(yytext, 1, strlen(yytext) - 1); + return SQL_IDENTIFIER; + } + YY_BREAK + case 190: + YY_RULE_SETUP #line 282 "flex_lexer.l" -{ - // Crop the leading and trailing quote char - yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); - return SQL_IDENTIFIER; -} - YY_BREAK -case 191: -YY_RULE_SETUP + { + // Crop the leading and trailing quote char + yylval->sval = hsql::substr(yytext, 1, strlen(yytext) - 1); + return SQL_IDENTIFIER; + } + YY_BREAK + case 191: + YY_RULE_SETUP #line 288 "flex_lexer.l" -{ - yylval->sval = strdup(yytext); - return SQL_IDENTIFIER; -} - YY_BREAK -case 192: -YY_RULE_SETUP + { + yylval->sval = strdup(yytext); + return SQL_IDENTIFIER; + } + YY_BREAK + case 192: + YY_RULE_SETUP #line 293 "flex_lexer.l" -{ BEGIN singlequotedstring; strbuf.clear(); strbuf.str(""); } // Clear strbuf manually, see #170 - YY_BREAK -case 193: -YY_RULE_SETUP + { + BEGIN singlequotedstring; + strbuf.clear(); + strbuf.str(""); + } // Clear strbuf manually, see #170 + YY_BREAK + case 193: + YY_RULE_SETUP #line 294 "flex_lexer.l" -{ strbuf << '\''; } - YY_BREAK -case 194: -/* rule 194 can match eol */ -YY_RULE_SETUP + { + strbuf << '\''; + } + YY_BREAK + case 194: + /* rule 194 can match eol */ + YY_RULE_SETUP #line 295 "flex_lexer.l" -{ strbuf << yytext; } - YY_BREAK -case 195: -YY_RULE_SETUP + { + strbuf << yytext; + } + YY_BREAK + case 195: + YY_RULE_SETUP #line 296 "flex_lexer.l" -{ BEGIN 0; yylval->sval = strdup(strbuf.str().c_str()); return SQL_STRING; } - YY_BREAK -case YY_STATE_EOF(singlequotedstring): + { + BEGIN 0; + yylval->sval = strdup(strbuf.str().c_str()); + return SQL_STRING; + } + YY_BREAK + case YY_STATE_EOF(singlequotedstring): #line 297 "flex_lexer.l" -{ fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); return 0; } - YY_BREAK -case 196: -YY_RULE_SETUP + { + fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); + return 0; + } + YY_BREAK + case 196: + YY_RULE_SETUP #line 299 "flex_lexer.l" -{ fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); return 0; } - YY_BREAK -case 197: -YY_RULE_SETUP + { + fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); + return 0; + } + YY_BREAK + case 197: + YY_RULE_SETUP #line 301 "flex_lexer.l" -ECHO; - YY_BREAK -#line 4554 "flex_lexer.cpp" -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(COMMENT): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yyg->yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's + ECHO; + YY_BREAK +#line 4553 "flex_lexer.cpp" + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(COMMENT): + yyterminate(); + + case YY_END_OF_BUFFER: { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int)(yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW) { + /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure @@ -4576,27 +3603,26 @@ case YY_STATE_EOF(COMMENT): * this is the first action (other than possibly a * back-up) that will match for the new input source. */ - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } - /* Note that here we test for yy_c_buf_p "<=" to the position + /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ - if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; + if (yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]) { /* This was really a NUL. */ + yy_state_type yy_next_state; - yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state( yyscanner ); + yy_current_state = yy_get_previous_state(yyscanner); - /* Okay, we're now positioned to make the NUL + /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal @@ -4605,35 +3631,31 @@ case YY_STATE_EOF(COMMENT): * will run more slowly). */ - yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); - - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yyg->yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( yyscanner ) ) - { - case EOB_ACT_END_OF_FILE: - { - yyg->yy_did_buffer_switch_on_eof = 0; - - if ( yywrap( yyscanner ) ) - { - /* Note: because we've taken care in + yy_next_state = yy_try_NUL_trans(yy_current_state, yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if (yy_next_state) { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else { + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + } + } + + else + switch (yy_get_next_buffer(yyscanner)) { + case EOB_ACT_END_OF_FILE: { + yyg->yy_did_buffer_switch_on_eof = 0; + + if (yywrap(yyscanner)) { + /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total @@ -4642,49 +3664,44 @@ case YY_STATE_EOF(COMMENT): * YY_NULL, it'll still work - another * YY_NULL will get returned. */ - yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yyg->yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = - yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( yyscanner ); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yyg->yy_c_buf_p = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; - - yy_current_state = yy_get_previous_state( yyscanner ); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else { + if (!yyg->yy_did_buffer_switch_on_eof) YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(yyscanner); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state(yyscanner); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR("fatal flex scanner internal error--no action found"); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer @@ -4694,171 +3711,142 @@ case YY_STATE_EOF(COMMENT): * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ -static int yy_get_next_buffer (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char *source = yyg->yytext_ptr; - int number_to_move, i; - int ret_val; - - if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so +static int yy_get_next_buffer(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + char* dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char* source = yyg->yytext_ptr; + int number_to_move, i; + int ret_val; + + if (yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1]) + YY_FATAL_ERROR("fatal flex scanner internal error--end of buffer missed"); + + if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) { /* Don't try to fill the buffer, so this is an EOF. */ + if (yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1) { + /* We matched a single character, the EOB, so * treat this as a final EOF. */ - return EOB_ACT_END_OF_FILE; - } + return EOB_ACT_END_OF_FILE; + } - else - { - /* We matched some text prior to the EOB, first + else { + /* We matched some text prior to the EOB, first * process it. */ - return EOB_ACT_LAST_MATCH; - } - } + return EOB_ACT_LAST_MATCH; + } + } - /* Try to read more data. */ + /* Try to read more data. */ - /* First move last chars to start of buffer. */ - number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); + /* First move last chars to start of buffer. */ + number_to_move = (int)(yyg->yy_c_buf_p - yyg->yytext_ptr - 1); - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); + for (i = 0; i < number_to_move; ++i) *(dest++) = *(source++); - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, + if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) + /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; - - else - { - yy_size_t num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - int yy_c_buf_p_offset = - (int) (yyg->yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - yy_size_t new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc( (void *) b->yy_ch_buf, - (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - yyg->yy_n_chars, num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - if ( yyg->yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin , yyscanner); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( - (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); - } - - yyg->yy_n_chars += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else { + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while (num_to_read <= 0) { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = (int)(yyg->yy_c_buf_p - b->yy_ch_buf); + + if (b->yy_is_our_buffer) { + int new_size = b->yy_buf_size * 2; + + if (new_size <= 0) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char*) + /* Include room in for 2 EOB chars. */ + yyrealloc((void*)b->yy_ch_buf, (yy_size_t)(b->yy_buf_size + 2), yyscanner); + } else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if (!b->yy_ch_buf) YY_FATAL_ERROR("fatal error - scanner input buffer overflow"); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + } + + if (num_to_read > YY_READ_BUF_SIZE) num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), yyg->yy_n_chars, num_to_read); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if (yyg->yy_n_chars == 0) { + if (number_to_move == YY_MORE_ADJ) { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin, yyscanner); + } + + else { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = + (char*)yyrealloc((void*)YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t)new_size, yyscanner); + if (!YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) YY_FATAL_ERROR("out of dynamic memory in yy_get_next_buffer()"); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int)(new_size - 2); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ - static yy_state_type yy_get_previous_state (yyscan_t yyscanner) -{ - yy_state_type yy_current_state; - char *yy_cp; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - yy_current_state = yyg->yy_start; - - for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) - { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1406 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - } - - return yy_current_state; +static yy_state_type yy_get_previous_state(yyscan_t yyscanner) { + yy_state_type yy_current_state; + char* yy_cp; + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yyg->yy_start; + + for (yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp) { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if (yy_accept[yy_current_state]) { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { + yy_current_state = (int)yy_def[yy_current_state]; + if (yy_current_state >= 1406) yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + } + + return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character @@ -4866,29 +3854,25 @@ static int yy_get_next_buffer (yyscan_t yyscanner) * synopsis * next_state = yy_try_NUL_trans( current_state ); */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) -{ - int yy_is_jam; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ - char *yy_cp = yyg->yy_c_buf_p; - - YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1406 ) - yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1405); - - (void)yyg; - return yy_is_jam ? 0 : yy_current_state; +static yy_state_type yy_try_NUL_trans(yy_state_type yy_current_state, yyscan_t yyscanner) { + int yy_is_jam; + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + char* yy_cp = yyg->yy_c_buf_p; + + YY_CHAR yy_c = 1; + if (yy_accept[yy_current_state]) { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { + yy_current_state = (int)yy_def[yy_current_state]; + if (yy_current_state >= 1406) yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_is_jam = (yy_current_state == 1405); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT @@ -4897,36 +3881,32 @@ static int yy_get_next_buffer (yyscan_t yyscanner) #ifndef YY_NO_INPUT #ifdef __cplusplus - static int yyinput (yyscan_t yyscanner) +static int yyinput(yyscan_t yyscanner) #else - static int input (yyscan_t yyscanner) +static int input(yyscan_t yyscanner) #endif { - int c; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + int c; + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - *yyg->yy_c_buf_p = yyg->yy_hold_char; + *yyg->yy_c_buf_p = yyg->yy_hold_char; - if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. + if (*yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR) { + /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ - if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) - /* This was really a NUL. */ - *yyg->yy_c_buf_p = '\0'; - - else - { /* need more input */ - yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr; - ++yyg->yy_c_buf_p; - - switch ( yy_get_next_buffer( yyscanner ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() + if (yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]) /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else { /* need more input */ + int offset = (int)(yyg->yy_c_buf_p - yyg->yytext_ptr); + ++yyg->yy_c_buf_p; + + switch (yy_get_next_buffer(yyscanner)) { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before @@ -4936,102 +3916,93 @@ static int yy_get_next_buffer (yyscan_t yyscanner) * to EOB_ACT_END_OF_FILE. */ - /* Reset buffer status. */ - yyrestart( yyin , yyscanner); + /* Reset buffer status. */ + yyrestart(yyin, yyscanner); - /*FALLTHROUGH*/ + /*FALLTHROUGH*/ - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( yyscanner ) ) - return 0; + case EOB_ACT_END_OF_FILE: { + if (yywrap(yyscanner)) return 0; - if ( ! yyg->yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; + if (!yyg->yy_did_buffer_switch_on_eof) YY_NEW_FILE; #ifdef __cplusplus - return yyinput(yyscanner); + return yyinput(yyscanner); #else - return input(yyscanner); + return input(yyscanner); #endif - } + } - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = yyg->yytext_ptr + offset; - break; - } - } - } + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } - c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ - *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ - yyg->yy_hold_char = *++yyg->yy_c_buf_p; + c = *(unsigned char*)yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; - return c; + return c; } -#endif /* ifndef YY_NO_INPUT */ +#endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ - void yyrestart (FILE * input_file , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +void yyrestart(FILE* input_file, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (yyscanner); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); - } + if (!YY_CURRENT_BUFFER) { + yyensure_buffer_stack(yyscanner); + YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); + } - yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); - yy_load_buffer_state( yyscanner ); + yy_init_buffer(YY_CURRENT_BUFFER, input_file, yyscanner); + yy_load_buffer_state(yyscanner); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - /* TODO. We should be able to replace this entire function body + /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ - yyensure_buffer_stack (yyscanner); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( yyscanner ); - - /* We don't actually know whether we did this switch during + yyensure_buffer_stack(yyscanner); + if (YY_CURRENT_BUFFER == new_buffer) return; + + if (YY_CURRENT_BUFFER) { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state(yyscanner); + + /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ - yyg->yy_did_buffer_switch_on_eof = 1; + yyg->yy_did_buffer_switch_on_eof = 1; } -static void yy_load_buffer_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - yyg->yy_hold_char = *yyg->yy_c_buf_p; +static void yy_load_buffer_state(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; } /** Allocate and initialize an input buffer state. @@ -5040,105 +4011,96 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param yyscanner The scanner object. * @return the allocated buffer state. */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +YY_BUFFER_STATE yy_create_buffer(FILE* file, int size, yyscan_t yyscanner) { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE)yyalloc(sizeof(struct yy_buffer_state), yyscanner); + if (!b) YY_FATAL_ERROR("out of dynamic memory in yy_create_buffer()"); - b->yy_buf_size = size; + b->yy_buf_size = size; - /* yy_ch_buf has to be 2 characters longer than the size given because + /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + b->yy_ch_buf = (char*)yyalloc((yy_size_t)(b->yy_buf_size + 2), yyscanner); + if (!b->yy_ch_buf) YY_FATAL_ERROR("out of dynamic memory in yy_create_buffer()"); - b->yy_is_our_buffer = 1; + b->yy_is_our_buffer = 1; - yy_init_buffer( b, file , yyscanner); + yy_init_buffer(b, file, yyscanner); - return b; + return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * @param yyscanner The scanner object. */ - void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if ( ! b ) - return; + if (!b) return; - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + if (b == YY_CURRENT_BUFFER) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE)0; - if ( b->yy_is_our_buffer ) - yyfree( (void *) b->yy_ch_buf , yyscanner ); + if (b->yy_is_our_buffer) yyfree((void*)b->yy_ch_buf, yyscanner); - yyfree( (void *) b , yyscanner ); + yyfree((void*)b, yyscanner); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) +static void yy_init_buffer(YY_BUFFER_STATE b, FILE* file, yyscan_t yyscanner) { - int oerrno = errno; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + int oerrno = errno; + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yy_flush_buffer( b , yyscanner); + yy_flush_buffer(b, yyscanner); - b->yy_input_file = file; - b->yy_fill_buffer = 1; + b->yy_input_file = file; + b->yy_fill_buffer = 1; - /* If b is the current buffer, then yy_init_buffer was _probably_ + /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } + if (b != YY_CURRENT_BUFFER) { + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } - b->yy_is_interactive = 0; - - errno = oerrno; + b->yy_is_interactive = 0; + + errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ - void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if ( ! b ) - return; +void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + if (!b) return; - b->yy_n_chars = 0; + b->yy_n_chars = 0; - /* We always need two end-of-buffer characters. The first causes + /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - b->yy_buf_pos = &b->yy_ch_buf[0]; + b->yy_buf_pos = &b->yy_ch_buf[0]; - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( yyscanner ); + if (b == YY_CURRENT_BUFFER) yy_load_buffer_state(yyscanner); } /** Pushes the new state onto the stack. The new state becomes @@ -5147,99 +4109,83 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param new_buffer The new state. * @param yyscanner The scanner object. */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(yyscanner); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - yyg->yy_buffer_stack_top++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( yyscanner ); - yyg->yy_did_buffer_switch_on_eof = 1; +void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) return; + + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if (YY_CURRENT_BUFFER) { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state(yyscanner); + yyg->yy_did_buffer_switch_on_eof = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * @param yyscanner The scanner object. */ -void yypop_buffer_state (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); - YY_CURRENT_BUFFER_LVALUE = NULL; - if (yyg->yy_buffer_stack_top > 0) - --yyg->yy_buffer_stack_top; - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( yyscanner ); - yyg->yy_did_buffer_switch_on_eof = 1; - } +void yypop_buffer_state(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) return; + + yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state(yyscanner); + yyg->yy_did_buffer_switch_on_eof = 1; + } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ -static void yyensure_buffer_stack (yyscan_t yyscanner) -{ - yy_size_t num_to_alloc; - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - if (!yyg->yy_buffer_stack) { +static void yyensure_buffer_stack(yyscan_t yyscanner) { + yy_size_t num_to_alloc; + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - /* First allocation is just for 2 elements, since we don't know if this + if (!yyg->yy_buffer_stack) { + /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - , yyscanner); - if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - yyg->yy_buffer_stack_max = num_to_alloc; - yyg->yy_buffer_stack_top = 0; - return; - } - - if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = yyg->yy_buffer_stack_max + grow_size; - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc - (yyg->yy_buffer_stack, - num_to_alloc * sizeof(struct yy_buffer_state*) - , yyscanner); - if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); - yyg->yy_buffer_stack_max = num_to_alloc; - } + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc(num_to_alloc * sizeof(struct yy_buffer_state*), yyscanner); + if (!yyg->yy_buffer_stack) YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1) { + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc( + yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*), yyscanner); + if (!yyg->yy_buffer_stack) YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } } /** Setup the input buffer state to scan directly from a user-specified character buffer. @@ -5248,33 +4194,29 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return NULL; - - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b , yyscanner ); - - return b; +YY_BUFFER_STATE yy_scan_buffer(char* base, yy_size_t size, yyscan_t yyscanner) { + YY_BUFFER_STATE b; + + if (size < 2 || base[size - 2] != YY_END_OF_BUFFER_CHAR || base[size - 1] != YY_END_OF_BUFFER_CHAR) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE)yyalloc(sizeof(struct yy_buffer_state), yyscanner); + if (!b) YY_FATAL_ERROR("out of dynamic memory in yy_scan_buffer()"); + + b->yy_buf_size = (int)(size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b, yyscanner); + + return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will @@ -5285,10 +4227,8 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) -{ - - return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); +YY_BUFFER_STATE yy_scan_string(const char* yystr, yyscan_t yyscanner) { + return yy_scan_bytes(yystr, (int)strlen(yystr), yyscanner); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will @@ -5298,177 +4238,156 @@ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - yy_size_t i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) yyalloc( n , yyscanner ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n , yyscanner); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it +YY_BUFFER_STATE yy_scan_bytes(const char* yybytes, int _yybytes_len, yyscan_t yyscanner) { + YY_BUFFER_STATE b; + char* buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t)(_yybytes_len + 2); + buf = (char*)yyalloc(n, yyscanner); + if (!buf) YY_FATAL_ERROR("out of dynamic memory in yy_scan_bytes()"); + + for (i = 0; i < _yybytes_len; ++i) buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len + 1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf, n, yyscanner); + if (!b) YY_FATAL_ERROR("bad buffer in yy_scan_bytes()"); + + /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ - b->yy_is_our_buffer = 1; + b->yy_is_our_buffer = 1; - return b; + return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif -static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); +static void yynoreturn yy_fatal_error(const char* msg, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + fprintf(stderr, "%s\n", msg); + exit(YY_EXIT_FAILURE); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yy_size_t yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] = yyg->yy_hold_char; \ - yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ - yyg->yy_hold_char = *yyg->yy_c_buf_p; \ - *yyg->yy_c_buf_p = '\0'; \ - yyleng = yyless_macro_arg; \ - } \ - while ( 0 ) +#define yyless(n) \ + do { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg); \ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } while (0) /* Accessor methods (get/set functions) to struct members. */ /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ -YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyextra; +YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yyextra; } /** Get the current line number. * @param yyscanner The scanner object. */ -int yyget_lineno (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +int yyget_lineno(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if (! YY_CURRENT_BUFFER) - return 0; - - return yylineno; + if (!YY_CURRENT_BUFFER) return 0; + + return yylineno; } /** Get the current column number. * @param yyscanner The scanner object. */ -int yyget_column (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +int yyget_column(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if (! YY_CURRENT_BUFFER) - return 0; - - return yycolumn; + if (!YY_CURRENT_BUFFER) return 0; + + return yycolumn; } /** Get the input stream. * @param yyscanner The scanner object. */ -FILE *yyget_in (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyin; +FILE* yyget_in(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yyin; } /** Get the output stream. * @param yyscanner The scanner object. */ -FILE *yyget_out (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyout; +FILE* yyget_out(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yyout; } /** Get the length of the current token. * @param yyscanner The scanner object. */ -yy_size_t yyget_leng (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yyleng; +int yyget_leng(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yyleng; } /** Get the current token. * @param yyscanner The scanner object. */ -char *yyget_text (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yytext; +char* yyget_text(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yytext; } /** Set the user-defined data. This data is never touched by the scanner. * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ -void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyextra = user_defined ; +void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined; } /** Set the current line number. * @param _line_number line number * @param yyscanner The scanner object. */ -void yyset_lineno (int _line_number , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +void yyset_lineno(int _line_number, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - /* lineno is only valid if an input buffer exists. */ - if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); - - yylineno = _line_number; + /* lineno is only valid if an input buffer exists. */ + if (!YY_CURRENT_BUFFER) YY_FATAL_ERROR("yyset_lineno called with no buffer"); + + yylineno = _line_number; } /** Set the current column. * @param _column_no column number * @param yyscanner The scanner object. */ -void yyset_column (int _column_no , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +void yyset_column(int _column_no, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (!YY_CURRENT_BUFFER) YY_FATAL_ERROR("yyset_column called with no buffer"); - /* column is only valid if an input buffer exists. */ - if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_column called with no buffer" ); - - yycolumn = _column_no; + yycolumn = _column_no; } /** Set the input stream. This does not discard the current @@ -5477,80 +4396,71 @@ void yyset_column (int _column_no , yyscan_t yyscanner) * @param yyscanner The scanner object. * @see yy_switch_to_buffer */ -void yyset_in (FILE * _in_str , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyin = _in_str ; +void yyset_in(FILE* _in_str, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str; } -void yyset_out (FILE * _out_str , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyout = _out_str ; +void yyset_out(FILE* _out_str, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str; } -int yyget_debug (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yy_flex_debug; +int yyget_debug(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; } -void yyset_debug (int _bdebug , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flex_debug = _bdebug ; +void yyset_debug(int _bdebug, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = _bdebug; } /* Accessor methods for yylval and yylloc */ -YYSTYPE * yyget_lval (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yylval; +YYSTYPE* yyget_lval(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yylval; } -void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yylval = yylval_param; +void yyset_lval(YYSTYPE* yylval_param, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yylval = yylval_param; } -YYLTYPE *yyget_lloc (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - return yylloc; +YYLTYPE* yyget_lloc(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + return yylloc; } - -void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yylloc = yylloc_param; + +void yyset_lloc(YYLTYPE* yylloc_param, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + yylloc = yylloc_param; } - + /* User-visible API */ /* yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ -int yylex_init(yyscan_t* ptr_yy_globals) -{ - if (ptr_yy_globals == NULL){ - errno = EINVAL; - return 1; - } +int yylex_init(yyscan_t* ptr_yy_globals) { + if (ptr_yy_globals == NULL) { + errno = EINVAL; + return 1; + } - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + *ptr_yy_globals = (yyscan_t)yyalloc(sizeof(struct yyguts_t), NULL); - if (*ptr_yy_globals == NULL){ - errno = ENOMEM; - return 1; - } + if (*ptr_yy_globals == NULL) { + errno = ENOMEM; + return 1; + } - /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals, 0x00, sizeof(struct yyguts_t)); - return yy_init_globals ( *ptr_yy_globals ); + return yy_init_globals(*ptr_yy_globals); } /* yylex_init_extra has the same functionality as yylex_init, but follows the @@ -5560,94 +4470,91 @@ int yylex_init(yyscan_t* ptr_yy_globals) * The user defined value in the first argument will be available to yyalloc in * the yyextra field. */ -int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) -{ - struct yyguts_t dummy_yyguts; +int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals) { + struct yyguts_t dummy_yyguts; - yyset_extra (yy_user_defined, &dummy_yyguts); + yyset_extra(yy_user_defined, &dummy_yyguts); - if (ptr_yy_globals == NULL){ - errno = EINVAL; - return 1; - } + if (ptr_yy_globals == NULL) { + errno = EINVAL; + return 1; + } - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + *ptr_yy_globals = (yyscan_t)yyalloc(sizeof(struct yyguts_t), &dummy_yyguts); - if (*ptr_yy_globals == NULL){ - errno = ENOMEM; - return 1; - } + if (*ptr_yy_globals == NULL) { + errno = ENOMEM; + return 1; + } - /* By setting to 0xAA, we expose bugs in + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + memset(*ptr_yy_globals, 0x00, sizeof(struct yyguts_t)); - yyset_extra (yy_user_defined, *ptr_yy_globals); + yyset_extra(yy_user_defined, *ptr_yy_globals); - return yy_init_globals ( *ptr_yy_globals ); + return yy_init_globals(*ptr_yy_globals); } -static int yy_init_globals (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - /* Initialization is the same as for the non-reentrant scanner. +static int yy_init_globals(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ - yyg->yy_buffer_stack = NULL; - yyg->yy_buffer_stack_top = 0; - yyg->yy_buffer_stack_max = 0; - yyg->yy_c_buf_p = NULL; - yyg->yy_init = 0; - yyg->yy_start = 0; + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; - yyg->yy_start_stack_ptr = 0; - yyg->yy_start_stack_depth = 0; - yyg->yy_start_stack = NULL; + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; /* Defined in main.c */ #ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; + yyin = stdin; + yyout = stdout; #else - yyin = NULL; - yyout = NULL; + yyin = NULL; + yyout = NULL; #endif - /* For future reference: Set errno on error, since we are called by + /* For future reference: Set errno on error, since we are called by * yylex_init() */ - return 0; + return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(yyscanner); - } +int yylex_destroy(yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while (YY_CURRENT_BUFFER) { + yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(yyscanner); + } - /* Destroy the stack itself. */ - yyfree(yyg->yy_buffer_stack , yyscanner); - yyg->yy_buffer_stack = NULL; + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack, yyscanner); + yyg->yy_buffer_stack = NULL; - /* Destroy the start condition stack. */ - yyfree( yyg->yy_start_stack , yyscanner ); - yyg->yy_start_stack = NULL; + /* Destroy the start condition stack. */ + yyfree(yyg->yy_start_stack, yyscanner); + yyg->yy_start_stack = NULL; - /* Reset the globals. This is important in a non-reentrant scanner so the next time + /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ - yy_init_globals( yyscanner); + yy_init_globals(yyscanner); - /* Destroy the main struct (reentrant only). */ - yyfree ( yyscanner , yyscanner ); - yyscanner = NULL; - return 0; + /* Destroy the main struct (reentrant only). */ + yyfree(yyscanner, yyscanner); + yyscanner = NULL; + return 0; } /* @@ -5655,55 +4562,48 @@ int yylex_destroy (yyscan_t yyscanner) */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; +static void yy_flex_strncpy(char* s1, const char* s2, int n, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + (void)yyg; - int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; + int i; + for (i = 0; i < n; ++i) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (const char * s , yyscan_t yyscanner) -{ - int n; - for ( n = 0; s[n]; ++n ) - ; +static int yy_flex_strlen(const char* s, yyscan_t yyscanner) { + int n; + for (n = 0; s[n]; ++n); - return n; + return n; } #endif -void *yyalloc (yy_size_t size , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - return malloc(size); +void* yyalloc(yy_size_t size, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + return malloc(size); } -void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; +void* yyrealloc(void* ptr, yy_size_t size, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + (void)yyg; - /* The cast to (char *) in the following accommodates both + /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return realloc(ptr, size); + return realloc(ptr, size); } -void yyfree (void * ptr , yyscan_t yyscanner) -{ - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +void yyfree(void* ptr, yyscan_t yyscanner) { + struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free((char*)ptr); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" @@ -5714,7 +4614,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) ** Section 3: User code ***************************/ -int yyerror(const char *msg) { - fprintf(stderr, "[SQL-Lexer-Error] %s\n",msg); return 0; +int yyerror(const char* msg) { + fprintf(stderr, "[SQL-Lexer-Error] %s\n", msg); + return 0; } - diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.h b/extern/hyrise_sql_parser/src/parser/flex_lexer.h index 6901db577e..5dd7c61b4a 100644 --- a/extern/hyrise_sql_parser/src/parser/flex_lexer.h +++ b/extern/hyrise_sql_parser/src/parser/flex_lexer.h @@ -6,7 +6,7 @@ #line 7 "flex_lexer.h" -#define YY_INT_ALIGNED short int +#define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ @@ -255,10 +255,10 @@ /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ -#include -#include #include +#include #include +#include /* end standard C headers. */ @@ -269,7 +269,7 @@ /* C99 systems have . Non-C99 systems may or may not. */ -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. @@ -285,46 +285,45 @@ typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; -typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; +typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN -#define INT8_MIN (-128) +#define INT8_MIN (-128) #endif #ifndef INT16_MIN -#define INT16_MIN (-32767-1) +#define INT16_MIN (-32767 - 1) #endif #ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) +#define INT32_MIN (-2147483647 - 1) #endif #ifndef INT8_MAX -#define INT8_MAX (127) +#define INT8_MAX (127) #endif #ifndef INT16_MAX -#define INT16_MAX (32767) +#define INT16_MAX (32767) #endif #ifndef INT32_MAX -#define INT32_MAX (2147483647) +#define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX -#define UINT8_MAX (255U) +#define UINT8_MAX (255U) #endif #ifndef UINT16_MAX -#define UINT16_MAX (65535U) +#define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) +#define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) +#define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ @@ -374,7 +373,7 @@ typedef void* yyscan_t; #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; +typedef struct yy_buffer_state* YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T @@ -384,74 +383,72 @@ typedef size_t yy_size_t; #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; +struct yy_buffer_state { + FILE* yy_input_file; - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ + char* yy_ch_buf; /* input buffer */ + char* yy_buf_pos; /* current position in input buffer */ - /* Size of input buffer in bytes, not including room for EOB + /* Size of input buffer in bytes, not including room for EOB * characters. */ - int yy_buf_size; + int yy_buf_size; - /* Number of characters read into yy_ch_buf, not including EOB + /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - yy_size_t yy_n_chars; + int yy_n_chars; - /* Whether we "own" the buffer - i.e., we know we created it, + /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ - int yy_is_our_buffer; + int yy_is_our_buffer; - /* Whether this is an "interactive" input source; if so, and + /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ - int yy_is_interactive; + int yy_is_interactive; - /* Whether we're considered to be at the beginning of a line. + /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ - int yy_at_bol; + int yy_at_bol; - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ - /* Whether to try to fill the input buffer when we reach the + /* Whether to try to fill the input buffer when we reach the * end of it. */ - int yy_fill_buffer; + int yy_fill_buffer; - int yy_buffer_status; - - }; + int yy_buffer_status; +}; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -void yypop_buffer_state ( yyscan_t yyscanner ); +void yyrestart(FILE* input_file, yyscan_t yyscanner); +void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); +YY_BUFFER_STATE yy_create_buffer(FILE* file, int size, yyscan_t yyscanner); +void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); +void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); +void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); +void yypop_buffer_state(yyscan_t yyscanner); -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_buffer(char* base, yy_size_t size, yyscan_t yyscanner); +YY_BUFFER_STATE yy_scan_string(const char* yy_str, yyscan_t yyscanner); +YY_BUFFER_STATE yy_scan_bytes(const char* bytes, int len, yyscan_t yyscanner); -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); +void* yyalloc(yy_size_t, yyscan_t yyscanner); +void* yyrealloc(void*, yy_size_t, yyscan_t yyscanner); +void yyfree(void*, yyscan_t yyscanner); /* Begin user sect3 */ -#define hsql_wrap(yyscanner) (/*CONSTCOND*/1) +#define hsql_wrap(yyscanner) (/*CONSTCOND*/ 1) #define YY_SKIP_YYWRAP #define yytext_ptr yytext_r @@ -472,72 +469,72 @@ void yyfree ( void * , yyscan_t yyscanner ); #endif #ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * +#define YY_EXTRA_TYPE void* #endif -int yylex_init (yyscan_t* scanner); +int yylex_init(yyscan_t* scanner); -int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); +int yylex_init_extra(YY_EXTRA_TYPE user_defined, yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy ( yyscan_t yyscanner ); +int yylex_destroy(yyscan_t yyscanner); + +int yyget_debug(yyscan_t yyscanner); -int yyget_debug ( yyscan_t yyscanner ); +void yyset_debug(int debug_flag, yyscan_t yyscanner); -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); +YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner); -YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); +void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner); -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); +FILE* yyget_in(yyscan_t yyscanner); -FILE *yyget_in ( yyscan_t yyscanner ); +void yyset_in(FILE* _in_str, yyscan_t yyscanner); -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); +FILE* yyget_out(yyscan_t yyscanner); -FILE *yyget_out ( yyscan_t yyscanner ); +void yyset_out(FILE* _out_str, yyscan_t yyscanner); -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); +int yyget_leng(yyscan_t yyscanner); - yy_size_t yyget_leng ( yyscan_t yyscanner ); +char* yyget_text(yyscan_t yyscanner); -char *yyget_text ( yyscan_t yyscanner ); +int yyget_lineno(yyscan_t yyscanner); -int yyget_lineno ( yyscan_t yyscanner ); +void yyset_lineno(int _line_number, yyscan_t yyscanner); -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); +int yyget_column(yyscan_t yyscanner); -int yyget_column ( yyscan_t yyscanner ); +void yyset_column(int _column_no, yyscan_t yyscanner); -void yyset_column ( int _column_no , yyscan_t yyscanner ); +YYSTYPE* yyget_lval(yyscan_t yyscanner); -YYSTYPE * yyget_lval ( yyscan_t yyscanner ); +void yyset_lval(YYSTYPE* yylval_param, yyscan_t yyscanner); -void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); +YYLTYPE* yyget_lloc(yyscan_t yyscanner); + +void yyset_lloc(YYLTYPE* yylloc_param, yyscan_t yyscanner); - YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); - - void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); - /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap ( yyscan_t yyscanner ); +extern "C" int yywrap(yyscan_t yyscanner); #else -extern int yywrap ( yyscan_t yyscanner ); +extern int yywrap(yyscan_t yyscanner); #endif #endif #ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +static void yy_flex_strncpy(char*, const char*, int, yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +static int yy_flex_strlen(const char*, yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT @@ -565,11 +562,9 @@ static int yy_flex_strlen ( const char * , yyscan_t yyscanner); #ifndef YY_DECL #define YY_DECL_IS_OURS 1 -extern int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); +extern int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner); -#define YY_DECL int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) +#define YY_DECL int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner) #endif /* !YY_DECL */ /* yy_get_previous_state - get the state just before the EOB char was reached */ @@ -733,7 +728,6 @@ extern int yylex \ #line 301 "flex_lexer.l" - -#line 737 "flex_lexer.h" +#line 736 "flex_lexer.h" #undef hsql_IN_HEADER #endif /* hsql_HEADER_H */ diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.l b/extern/hyrise_sql_parser/src/parser/flex_lexer.l index 5552b261de..1468ccafa3 100644 --- a/extern/hyrise_sql_parser/src/parser/flex_lexer.l +++ b/extern/hyrise_sql_parser/src/parser/flex_lexer.l @@ -285,7 +285,7 @@ CHARACTER[ \t\n]+VARYING TOKEN(CHARACTER_VARYING) return SQL_IDENTIFIER; } -[A-Za-z][A-Za-z0-9_]* { +[A-Za-z_][A-Za-z0-9_]* { yylval->sval = strdup(yytext); return SQL_IDENTIFIER; } From dd2f2ae9d3672295b77478997e01c761f269f66f Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Wed, 17 Jun 2026 13:50:23 -0700 Subject: [PATCH 07/19] Refactor Hyrise adapter and add diagnostics The adapter previously took some shortcuts to pass test cases via string normalization. These string manipulations have been removed from the adapter and replaced with a full parse tree walk to confirm and reject invalid queries. This version is able to report more informative errors when failures occur. Also did some minor cleanup for readability, renamed str() function to nullToEmpty() since this does a better job of describing what purpose the function serves, and removed temporary float conversion and replaced with more robust std::to_chars. --- src/ccontrol/HyriseAdapter.cc | 532 ++++++++++++++++++++-------------- src/ccontrol/HyriseAdapter.h | 5 +- 2 files changed, 314 insertions(+), 223 deletions(-) diff --git a/src/ccontrol/HyriseAdapter.cc b/src/ccontrol/HyriseAdapter.cc index 4b276c28aa..da8d3106d4 100644 --- a/src/ccontrol/HyriseAdapter.cc +++ b/src/ccontrol/HyriseAdapter.cc @@ -23,14 +23,14 @@ #include "ccontrol/HyriseAdapter.h" -#include -#include -#include +#include +#include +#include #include -#include -#include +#include #include #include +#include #include #include @@ -74,173 +74,222 @@ namespace { using namespace lsst::qserv; -std::string str(char const* value) { return value == nullptr ? std::string() : std::string(value); } +// Forward declarations +void validateStatement(hsql::SelectStatement const* stmt); +void validateExpression(hsql::Expr const* expr); +std::shared_ptr buildValueExpr(hsql::Expr const* expr); +std::shared_ptr buildBoolFactorTerm(hsql::Expr const* expr); +std::shared_ptr buildBoolTerm(hsql::Expr const* expr); + +std::string nullToEmpty(char const* value) { return value == nullptr ? std::string() : std::string(value); } [[noreturn]] void unsupported(std::string const& what) { throw parser::ParseException("HyriseAdapter unsupported SQL construct: " + what); } -std::string formatFloat(double value) { - std::ostringstream out; - // digits10 (not max_digits10) avoids exposing binary floating-point noise for ordinary decimal - // literals (e.g. 0.1) while still giving enough precision for literals with many significant digits. - out << std::setprecision(std::numeric_limits::digits10) << value; - return out.str(); +std::string unparseableQueryError(std::string const& sql) { + return std::string("Failed to instantiate query: \"") + sql + '"'; } -// Forward declarations for the mutually-recursive expression/term builders below. -std::shared_ptr buildValueExpr(hsql::Expr const* expr); -std::shared_ptr buildBoolFactorTerm(hsql::Expr const* expr); -std::shared_ptr buildBoolTerm(hsql::Expr const* expr); - -// --------------------------------------------------------------------------- -// The following helpers (qualifiedName, operatorSql, exprSql, containsFunction) -// are used only to render an hsql::Expr back into SQL text for diagnostic -// error messages (e.g. "functions are not allowed in ORDER BY"). They are not -// part of the AST-to-IR conversion itself. -// --------------------------------------------------------------------------- +std::string formatFloat(double value) { + // Note using: std::to_chars because it is locale-independent + // and emits the shortest representation that round-trips back to the same double + if (!std::isfinite(value)) unsupported("infinite floating-point literal"); + std::array buf; + auto const [ptr, ec] = std::to_chars(buf.data(), buf.data() + buf.size(), value); + if (ec != std::errc()) unsupported("unrepresentable floating-point literal"); + return std::string(buf.data(), ptr); +} -std::string qualifiedName(std::vector const& parts) { - std::string result; - for (auto const& part : parts) { - if (part.empty()) continue; - if (!result.empty()) result += "."; - result += part; +// Human-readable names for the Hyrise enum values to help produce better error messages. +std::string exprTypeName(hsql::ExprType type) { + switch (type) { + case hsql::kExprCast: + return "CAST expression"; + case hsql::kExprExtract: + return "EXTRACT expression"; + case hsql::kExprSelect: + return "scalar subquery"; + case hsql::kExprParameter: + return "parameter placeholder"; + case hsql::kExprArray: + return "array literal"; + case hsql::kExprArrayIndex: + return "array subscript"; + case hsql::kExprLiteralDate: + return "date literal"; + case hsql::kExprLiteralInterval: + return "interval literal"; + case hsql::kExprHint: + return "optimizer hint"; + default: + return "expression type " + std::to_string(type); } - return result; } -std::string operatorSql(hsql::OperatorType op) { +std::string operatorName(hsql::OperatorType op) { switch (op) { - case hsql::kOpPlus: - return "+"; - case hsql::kOpMinus: - return "-"; - case hsql::kOpAsterisk: - return "*"; - case hsql::kOpSlash: - return "/"; - case hsql::kOpPercentage: - return "%"; - case hsql::kOpMod: - return "MOD"; - case hsql::kOpDiv: - return "DIV"; - case hsql::kOpCaret: - case hsql::kOpBitXor: - return "^"; - case hsql::kOpBitAnd: - return "&"; - case hsql::kOpBitOr: - return "|"; - case hsql::kOpBitShiftLeft: - return "<<"; - case hsql::kOpBitShiftRight: - return ">>"; + case hsql::kOpILike: + return "ILIKE"; + case hsql::kOpExists: + return "EXISTS"; + case hsql::kOpCase: + return "CASE"; + case hsql::kOpNot: + return "NOT"; + case hsql::kOpLike: + return "LIKE"; + case hsql::kOpAnd: + return "AND"; + case hsql::kOpOr: + return "OR"; + case hsql::kOpIn: + return "IN"; + case hsql::kOpBetween: + return "BETWEEN"; + case hsql::kOpIsNull: + return "IS NULL"; default: - unsupported("operator rendering"); + return "operator type " + std::to_string(op); } } -std::string exprSql(hsql::Expr const* expr) { - if (expr == nullptr) unsupported("null expression"); - switch (expr->type) { - case hsql::kExprColumnRef: - return qualifiedName({str(expr->schema), str(expr->table), str(expr->name)}); - case hsql::kExprStar: - return qualifiedName({str(expr->table), "*"}); - case hsql::kExprLiteralInt: - return std::to_string(expr->ival); - case hsql::kExprLiteralIntString: - return str(expr->name); - case hsql::kExprLiteralFloat: - return formatFloat(expr->fval); - case hsql::kExprLiteralString: - return "'" + str(expr->name) + "'"; - case hsql::kExprLiteralNull: - return "NULL"; - case hsql::kExprFunctionRef: { - std::string result = qualifiedName({str(expr->schema), str(expr->name)}) + "("; - if (expr->distinct) result += "DISTINCT "; - if (expr->exprList != nullptr) { - for (auto iter = expr->exprList->begin(); iter != expr->exprList->end(); ++iter) { - if (iter != expr->exprList->begin()) result += ", "; - result += exprSql(*iter); - } - } - result += ")"; - return result; - } - case hsql::kExprOperator: - if (expr->opType == hsql::kOpUnaryMinus) return "-" + exprSql(expr->expr); - return exprSql(expr->expr) + " " + operatorSql(expr->opType) + " " + exprSql(expr->expr2); - default: - unsupported("expression rendering"); +void validateIdentifier(char const* identifier) { + if (identifier != nullptr && identifier[0] == '_') { + throw parser::ParseException("Error parsing query, near \"" + nullToEmpty(identifier) + + "\", Identifiers in Qserv may not start with an underscore."); } } -bool containsFunction(hsql::Expr const* expr) { - if (expr == nullptr) return false; - if (expr->type == hsql::kExprFunctionRef) return true; - if (containsFunction(expr->expr) || containsFunction(expr->expr2)) return true; - if (expr->exprList != nullptr) { - for (auto const* child : *expr->exprList) { - if (containsFunction(child)) return true; +void validateAlias(hsql::Alias const* alias) { + if (alias == nullptr) return; + validateIdentifier(alias->name); + if (alias->columns != nullptr) { + for (auto const* column : *alias->columns) { + validateIdentifier(column); } } - return false; } -// --------------------------------------------------------------------------- -// End of diagnostic-only AST rendering helpers. -// --------------------------------------------------------------------------- - -void trimTrailingWhitespace(std::string& sql) { - while (!sql.empty() && std::isspace(static_cast(sql.back()))) { - sql.pop_back(); - } +void validateOrder(hsql::OrderDescription const* order) { + if (order != nullptr) validateExpression(order->expr); } -// TODO(DM-55216): This mainly exists to chop off extra whitespace and eliminate -// queries with empty extra statements (i.e., something;;). Hyrise will -// reject ';;', maybe that behavior is better anyway? -std::string normalizeSql(std::string const& sql) { - std::string normalized{sql}; - trimTrailingWhitespace(normalized); - while (!normalized.empty() && normalized.back() == ';') { - normalized.pop_back(); - trimTrailingWhitespace(normalized); - } - return normalized; +void validateLimit(hsql::LimitDescription const* limit) { + if (limit == nullptr) return; + validateExpression(limit->limit); + validateExpression(limit->offset); } -// Mirrors the wording of the error ANTLR's parser produced for an unparseable statement, so that -// callers/tests written against the old parser's messages continue to see the same text. -std::string unparseableQueryError(std::string const& sql) { - return std::string("Failed to instantiate query: \"") + sql + '"'; +void validateExpression(hsql::Expr const* expr) { + if (expr == nullptr) return; + if (expr->type == hsql::kExprOperator && expr->opType == hsql::kOpCase) { + throw parser::ParseException("qserv can not parse query: CASE expressions are not supported."); + } + if (expr->type == hsql::kExprColumnRef || expr->type == hsql::kExprStar) { + validateIdentifier(expr->schema); + validateIdentifier(expr->table); + validateIdentifier(expr->name); + } else if (expr->type == hsql::kExprFunctionRef) { + validateIdentifier(expr->schema); + validateIdentifier(expr->name); + } + validateIdentifier(expr->alias); + validateExpression(expr->expr); + validateExpression(expr->expr2); + if (expr->exprList != nullptr) { + for (auto const* child : *expr->exprList) { + validateExpression(child); + } + } + validateStatement(expr->select); + if (expr->windowDescription != nullptr) { + if (expr->windowDescription->partitionList != nullptr) { + for (auto const* partition : *expr->windowDescription->partitionList) { + validateExpression(partition); + } + } + if (expr->windowDescription->orderList != nullptr) { + for (auto const* order : *expr->windowDescription->orderList) { + validateOrder(order); + } + } + } } -// TODO(DM-55216): containsChunkId() and caseWhenFragment()/the "CASE WHEN" check below run on the raw, -// unparsed SQL text rather than the parsed AST. This is a quick stand-in for the equivalent ANTLR-era -// checks, but it can produce false positives if "_chunkId" or "CASE WHEN" appear inside a string literal -// or quoted identifier rather than as actual SQL syntax. Once the Hyrise migration is further along these -// checks should be reimplemented as a walk over the parsed hsql::SQLParserResult. -bool containsChunkId(std::string const& sql) { - static std::regex const pattern{R"((^|[^A-Za-z0-9_])_chunkId([^A-Za-z0-9_]|$))", std::regex::ECMAScript}; - return std::regex_search(sql, pattern); +void validateTable(hsql::TableRef const* table) { + if (table == nullptr) return; + validateIdentifier(table->schema); + validateIdentifier(table->name); + validateAlias(table->alias); + validateStatement(table->select); + if (table->list != nullptr) { + for (auto const* child : *table->list) { + validateTable(child); + } + } + if (table->join != nullptr) { + validateTable(table->join->left); + validateTable(table->join->right); + validateExpression(table->join->condition); + if (table->join->namedColumns != nullptr) { + for (auto const* column : *table->join->namedColumns) { + validateIdentifier(column); + } + } + } } -std::string caseWhenFragment(std::string const& sql) { - std::string upper = boost::algorithm::to_upper_copy(sql); - auto begin = upper.find("CASE WHEN"); - if (begin == std::string::npos) { - return "CASE WHEN"; +void validateStatement(hsql::SelectStatement const* stmt) { + if (stmt == nullptr) return; + if (stmt->selectList != nullptr) { + for (auto const* expr : *stmt->selectList) { + validateExpression(expr); + } } - auto end = upper.find("END", begin); - if (end == std::string::npos) { - return sql.substr(begin); + validateTable(stmt->fromTable); + validateExpression(stmt->whereClause); + if (stmt->groupBy != nullptr) { + if (stmt->groupBy->columns != nullptr) { + for (auto const* expr : *stmt->groupBy->columns) { + validateExpression(expr); + } + } + validateExpression(stmt->groupBy->having); + } + validateExpression(stmt->having); + if (stmt->order != nullptr) { + for (auto const* order : *stmt->order) { + validateOrder(order); + } + } + validateLimit(stmt->limit); + if (stmt->withDescriptions != nullptr) { + for (auto const* with : *stmt->withDescriptions) { + validateIdentifier(with->alias); + validateStatement(with->select); + } + } + if (stmt->setOperations != nullptr) { + for (auto const* setOp : *stmt->setOperations) { + validateStatement(setOp->nestedSelectStatement); + if (setOp->resultOrder != nullptr) { + for (auto const* order : *setOp->resultOrder) { + validateOrder(order); + } + } + validateLimit(setOp->resultLimit); + } + } + if (stmt->lockings != nullptr) { + for (auto const* locking : *stmt->lockings) { + if (locking->tables != nullptr) { + for (auto const* table : *locking->tables) { + validateIdentifier(table); + } + } + } } - return sql.substr(begin, (end + 3) - begin); } query::ValueExpr::Op valueOp(hsql::OperatorType op) { @@ -271,7 +320,7 @@ query::ValueExpr::Op valueOp(hsql::OperatorType op) { case hsql::kOpBitShiftRight: return query::ValueExpr::BIT_SHIFT_RIGHT; default: - unsupported("value operator"); + unsupported("value operator " + operatorName(op)); } } @@ -292,15 +341,10 @@ query::CompPredicate::OpType compOp(hsql::OperatorType op) { case hsql::kOpGreaterEq: return query::CompPredicate::GREATER_THAN_OR_EQUALS_OP; default: - unsupported("comparison operator"); + unsupported("comparison operator " + operatorName(op)); } } -std::shared_ptr buildNotTerm(std::shared_ptr const& term) { - return std::make_shared( - query::BoolTerm::PtrVector{std::make_shared(term, true)}); -} - struct WhereTerm { std::shared_ptr term; query::AreaRestrictorVec restrictors; @@ -312,9 +356,9 @@ void appendRestrictors(query::AreaRestrictorVec& target, query::AreaRestrictorVe std::shared_ptr buildColumnRef(hsql::Expr const* expr) { if (expr->type != hsql::kExprColumnRef) unsupported("non-column column reference"); - std::string schema = str(expr->schema); - std::string table = str(expr->table); - std::string name = str(expr->name); + std::string schema = nullToEmpty(expr->schema); + std::string table = nullToEmpty(expr->table); + std::string name = nullToEmpty(expr->name); if (name.empty()) unsupported("empty column reference"); if (!schema.empty() || !table.empty()) { return std::make_shared(schema, table, name); @@ -328,43 +372,92 @@ std::shared_ptr buildSimpleBoolTerm(std::shared_ptr(term, hasNot)}); } +bool isQservRestrictorName(std::string const& name) { + return boost::algorithm::iequals(name, "qserv_areaspec_box") || + boost::algorithm::iequals(name, "qserv_areaspec_circle") || + boost::algorithm::iequals(name, "qserv_areaspec_ellipse") || + boost::algorithm::iequals(name, "qserv_areaspec_poly"); +} + +bool isIntegerLiteral(hsql::Expr const* expr) { + return expr != nullptr && + (expr->type == hsql::kExprLiteralInt || expr->type == hsql::kExprLiteralIntString); +} + std::shared_ptr buildValueFactor(hsql::Expr const* expr) { if (expr == nullptr) unsupported("null expression"); switch (expr->type) { case hsql::kExprColumnRef: return query::ValueFactor::newColumnRefFactor(buildColumnRef(expr)); + case hsql::kExprStar: - return query::ValueFactor::newStarFactor(str(expr->table)); + return query::ValueFactor::newStarFactor(nullToEmpty(expr->table)); + case hsql::kExprLiteralInt: return query::ValueFactor::newConstFactor(std::to_string(expr->ival)); + case hsql::kExprLiteralIntString: - return query::ValueFactor::newConstFactor(str(expr->name)); + return query::ValueFactor::newConstFactor(nullToEmpty(expr->name)); + case hsql::kExprLiteralFloat: return query::ValueFactor::newConstFactor(formatFloat(expr->fval)); - case hsql::kExprLiteralString: - return query::ValueFactor::newConstFactor("'" + str(expr->name) + "'"); + + case hsql::kExprLiteralString: { + std::string s = nullToEmpty(expr->name); + std::string escaped; + escaped.reserve(s.size()); + for (char c : s) { + if (c == '\'') escaped += '\''; + escaped += c; + } + return query::ValueFactor::newConstFactor("'" + escaped + "'"); + } + case hsql::kExprLiteralNull: return query::ValueFactor::newConstFactor("NULL"); + case hsql::kExprFunctionRef: { + // Filter out disallowed function modifiers + if (expr->distinct) unsupported("DISTINCT in function arguments"); + if (expr->windowDescription != nullptr) unsupported("window function"); + + std::string name = nullToEmpty(expr->name); + if (isQservRestrictorName(name)) unsupported("qserv area restrictor function in this position"); + + // Populate our function and its arguments. query::ValueExprPtrVector args; if (expr->exprList != nullptr) { for (auto const* arg : *expr->exprList) { args.push_back(buildValueExpr(arg)); } } - auto func = query::FuncExpr::newWithArgs(str(expr->name), args); - std::string name = str(expr->name); - if (boost::algorithm::iequals(name, "COUNT") || boost::algorithm::iequals(name, "MIN") || - boost::algorithm::iequals(name, "MAX") || boost::algorithm::iequals(name, "SUM") || - boost::algorithm::iequals(name, "AVG")) { - return query::ValueFactor::newAggFactor(func); + auto func = query::FuncExpr::newWithArgs(name, args); + + // Check for supported / unsupported aggregation functions + static char const* const supportedAggregation[] = { + "COUNT", "MIN", "MAX", "SUM", "AVG", + }; + for (auto const* agg : supportedAggregation) { + if (boost::algorithm::iequals(name, agg)) { + return query::ValueFactor::newAggFactor(func); + } } + + static char const* const unsupportedAggregation[] = { + "STD", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", "VAR_POP", "VAR_SAMP", + "VARIANCE", "GROUP_CONCAT", "BIT_AND", "BIT_OR", "BIT_XOR"}; + for (auto const* agg : unsupportedAggregation) { + if (boost::algorithm::iequals(name, agg)) unsupported("aggregate function " + name); + } + return query::ValueFactor::newFuncFactor(func); } + case hsql::kExprOperator: return query::ValueFactor::newExprFactor(buildValueExpr(expr)); + default: - unsupported("value factor type"); + unsupported(exprTypeName(expr->type)); } } @@ -406,7 +499,7 @@ std::string restrictorArg(hsql::Expr const* expr) { case hsql::kExprLiteralInt: return std::to_string(expr->ival); case hsql::kExprLiteralIntString: - return str(expr->name); + return nullToEmpty(expr->name); case hsql::kExprLiteralFloat: return formatFloat(expr->fval); case hsql::kExprOperator: @@ -422,43 +515,50 @@ std::string restrictorArg(hsql::Expr const* expr) { std::shared_ptr buildAreaRestrictor(hsql::Expr const* expr) { if (expr == nullptr) return nullptr; - // ANTLR's grammar fires a dedicated QservFunctionSpec rule for qserv_areaspec_* functions regardless - // of surrounding context, so it also handles forms like "qserv_areaspec_box(...) = 1" and - // "1 = qserv_areaspec_box(...)". Replicate that by unwrapping equality comparisons here. + + // The following is intended to match the legacy ANTLR-based parser. It used a dedicated + // QservFunctionSpec rule for qserv_areaspec_* functions, but only when it was bare or + // compared against an integer literal ("qserv_areaspec_box(...) = 1", "1 = ..."). if (expr->type == hsql::kExprOperator && expr->opType == hsql::kOpEquals) { - if (auto r = buildAreaRestrictor(expr->expr)) return r; - if (auto r = buildAreaRestrictor(expr->expr2)) return r; + if (isIntegerLiteral(expr->expr2)) { + if (auto r = buildAreaRestrictor(expr->expr)) return r; + } + if (isIntegerLiteral(expr->expr)) { + if (auto r = buildAreaRestrictor(expr->expr2)) return r; + } } + + // Ensure this is a function ref. if (expr->type != hsql::kExprFunctionRef) return nullptr; - std::string name = str(expr->name); - if (!boost::algorithm::iequals(name, "qserv_areaspec_box") && - !boost::algorithm::iequals(name, "qserv_areaspec_circle") && - !boost::algorithm::iequals(name, "qserv_areaspec_ellipse") && - !boost::algorithm::iequals(name, "qserv_areaspec_poly")) { - return nullptr; - } - if (expr->exprList == nullptr) unsupported("empty qserv area restrictor argument list"); + + // Only qserv_areaspec_* are restrictors; for any other function return nullptr so normal value / + // predicate handling takes over + std::string name = nullToEmpty(expr->name); + if (!isQservRestrictorName(name)) return nullptr; + + // Set up args + if (expr->exprList == nullptr) return nullptr; std::vector args; for (auto const* arg : *expr->exprList) { args.push_back(restrictorArg(arg)); } + + // Create the appropriate AreaRestrictor* try { if (boost::algorithm::iequals(name, "qserv_areaspec_box")) { return std::make_shared(args); - } - if (boost::algorithm::iequals(name, "qserv_areaspec_circle")) { + } else if (boost::algorithm::iequals(name, "qserv_areaspec_circle")) { return std::make_shared(args); - } - if (boost::algorithm::iequals(name, "qserv_areaspec_ellipse")) { + } else if (boost::algorithm::iequals(name, "qserv_areaspec_ellipse")) { return std::make_shared(args); - } - if (boost::algorithm::iequals(name, "qserv_areaspec_poly")) { + } else if (boost::algorithm::iequals(name, "qserv_areaspec_poly")) { return std::make_shared(args); } } catch (std::logic_error const& err) { throw parser::ParseException(err.what()); } - unsupported("qserv area restrictor function"); + + return nullptr; } std::shared_ptr buildValueExpr(hsql::Expr const* expr) { @@ -471,7 +571,7 @@ std::shared_ptr buildValueExpr(hsql::Expr const* expr) { } if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralIntString) { return query::ValueExpr::newSimple( - query::ValueFactor::newConstFactor("-" + str(expr->expr->name))); + query::ValueFactor::newConstFactor("-" + nullToEmpty(expr->expr->name))); } if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralFloat) { return query::ValueExpr::newSimple( @@ -586,7 +686,7 @@ std::shared_ptr buildBoolTerm(hsql::Expr const* expr) { buildValueExpr(expr->expr->exprList->at(1)), true)); } } - return buildNotTerm(buildBoolFactorTerm(expr->expr)); + return buildSimpleBoolTerm(buildBoolFactorTerm(expr->expr), true); } return buildSimpleBoolTerm(buildBoolFactorTerm(expr)); } @@ -597,7 +697,7 @@ std::shared_ptr buildSelectList(hsql::SelectStatement const& for (auto const* expr : *stmt.selectList) { auto value = buildValueExpr(expr); if (expr->alias != nullptr) { - value->setAlias(str(expr->alias)); + value->setAlias(nullToEmpty(expr->alias)); value->setAliasIsUserDefined(true); } selectList->addValueExpr(value); @@ -606,13 +706,14 @@ std::shared_ptr buildSelectList(hsql::SelectStatement const& } std::string tableAlias(hsql::Alias const* alias) { - return alias == nullptr ? std::string() : str(alias->name); + return alias == nullptr ? std::string() : nullToEmpty(alias->name); } query::TableRef::Ptr buildSimpleTableRef(hsql::TableRef const* table) { if (table == nullptr) unsupported("missing from table"); if (table->type != hsql::kTableName) unsupported("non-simple table reference"); - return std::make_shared(str(table->schema), str(table->name), tableAlias(table->alias)); + return std::make_shared(nullToEmpty(table->schema), nullToEmpty(table->name), + tableAlias(table->alias)); } query::JoinRef::Type buildJoinType(hsql::JoinType type) { @@ -639,7 +740,7 @@ std::shared_ptr buildJoinSpec(hsql::JoinDefinition const* join) if (join->namedColumns != nullptr) { if (join->namedColumns->size() != 1) unsupported("multi-column USING"); return std::make_shared( - std::make_shared(str(join->namedColumns->front()))); + std::make_shared(nullToEmpty(join->namedColumns->front()))); } if (join->condition != nullptr) { return std::make_shared(buildBoolTerm(join->condition)); @@ -695,14 +796,15 @@ std::shared_ptr buildOrderBy(hsql::SelectStatement const& if (stmt.order == nullptr || stmt.order->empty()) return nullptr; auto orderBy = std::make_shared(); for (auto const* term : *stmt.order) { - if (containsFunction(term->expr)) { - throw parser::ParseException("Error parsing query, near \"" + exprSql(term->expr) + - "\", qserv does not support functions in ORDER BY."); + if (term->null_ordering != hsql::NullOrdering::Undefined) unsupported("NULLS FIRST/LAST in ORDER BY"); + auto valueExpr = buildValueExpr(term->expr); + if (valueExpr->isFunction()) { + throw parser::ParseException("qserv does not support functions in ORDER BY."); } query::OrderByTerm::Order order = query::OrderByTerm::DEFAULT; if (term->type == hsql::kOrderAsc) order = query::OrderByTerm::ASC; if (term->type == hsql::kOrderDesc) order = query::OrderByTerm::DESC; - orderBy->addTerm(query::OrderByTerm(buildValueExpr(term->expr), order)); + orderBy->addTerm(query::OrderByTerm(valueExpr, order)); } return orderBy; } @@ -730,49 +832,41 @@ std::shared_ptr buildHaving(hsql::SelectStatement const& st int buildLimit(hsql::SelectStatement const& stmt) { if (stmt.limit == nullptr || stmt.limit->limit == nullptr) return lsst::qserv::NOTSET; + if (stmt.limit->offset != nullptr) unsupported("OFFSET"); auto const* limit = stmt.limit->limit; if (limit->type != hsql::kExprLiteralInt) unsupported("non-integer LIMIT"); if (limit->ival > static_cast(std::numeric_limits::max())) unsupported("LIMIT overflow"); return static_cast(limit->ival); } -std::shared_ptr buildSelectStmt(hsql::SQLParserResult const& result) { - if (!result.isValid()) { - throw parser::ParseException(result.errorMsg() == nullptr ? "Hyrise parse failed" - : result.errorMsg()); +} // namespace + +namespace lsst::qserv::ccontrol { + +std::shared_ptr HyriseAdapter::makeSelectStmt(std::string const& sql) { + hsql::SQLParserResult result; + hsql::SQLParser::parse(sql, &result); + + if (!result.isValid() || result.size() == 0) { + throw parser::ParseException(unparseableQueryError(sql)); + } + + if (result.size() > 1) { + unsupported("multiple statements"); } - if (result.size() != 1) unsupported("multiple statements"); + auto const* stmt = dynamic_cast(result.getStatement(0)); + if (stmt == nullptr) unsupported("non-SELECT statement"); if (stmt->setOperations != nullptr && !stmt->setOperations->empty()) unsupported("set operations"); if (stmt->withDescriptions != nullptr && !stmt->withDescriptions->empty()) unsupported("WITH"); + if (stmt->lockings != nullptr && !stmt->lockings->empty()) unsupported("row locking"); + + validateStatement(stmt); return std::make_shared( buildSelectList(*stmt), buildFromList(*stmt), buildWhereClause(*stmt), buildOrderBy(*stmt), buildGroupBy(*stmt), buildHaving(*stmt), stmt->selectDistinct, buildLimit(*stmt)); } -} // namespace - -namespace lsst::qserv::ccontrol { - -std::shared_ptr HyriseAdapter::makeSelectStmt(std::string const& sql) { - auto normalized = normalizeSql(sql); - if (containsChunkId(normalized)) { - throw parser::ParseException( - "Error parsing query, near \"_chunkId\", Identifiers in Qserv may not " - "start with an underscore."); - } - if (boost::algorithm::icontains(normalized, "CASE WHEN")) { - throw parser::ParseException("qserv can not parse query, near \"" + caseWhenFragment(normalized) + - "\""); - } - hsql::SQLParserResult result; - hsql::SQLParser::parse(normalized, &result); - if (!result.isValid()) { - throw parser::ParseException(unparseableQueryError(sql)); - } - return buildSelectStmt(result); -} - } // namespace lsst::qserv::ccontrol diff --git a/src/ccontrol/HyriseAdapter.h b/src/ccontrol/HyriseAdapter.h index 2acb61ab91..0e462eec99 100644 --- a/src/ccontrol/HyriseAdapter.h +++ b/src/ccontrol/HyriseAdapter.h @@ -33,10 +33,7 @@ class SelectStmt; namespace lsst::qserv::ccontrol { -/// Build Qserv's existing query IR from Hyrise parser output. -/// -/// This is intentionally separate from ParseListener/ParseAdapters because those -/// classes are coupled to ANTLR parser context types. +/// Build Qserv query IR from Hyrise parser output. class HyriseAdapter { public: static std::shared_ptr makeSelectStmt(std::string const& sql); From f27e2778ee658c2aaacb584e2a49be0156d8e485 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Thu, 18 Jun 2026 12:14:02 -0700 Subject: [PATCH 08/19] Add more Qserv IR test validation --- src/ccontrol/testAntlr4GeneratedIR.cc | 129 ++++++++++++++++++++++++++ src/ccontrol/testHyriseGeneratedIR.cc | 129 ++++++++++++++++++++++++++ src/ccontrol/testParserCorpus.cc | 3 + 3 files changed, 261 insertions(+) diff --git a/src/ccontrol/testAntlr4GeneratedIR.cc b/src/ccontrol/testAntlr4GeneratedIR.cc index de8b5b12f7..cb903de924 100644 --- a/src/ccontrol/testAntlr4GeneratedIR.cc +++ b/src/ccontrol/testAntlr4GeneratedIR.cc @@ -2265,6 +2265,89 @@ static const vector ANTLR4_TEST_QUERIES = { FromList(TableRef("", "Object", "")), nullptr, nullptr, nullptr, nullptr, 0, -1); }, "SELECT (`objectId`-1) AS `o` FROM `Object`"), + + // test HAVING with an aggregate + Antlr4TestQueries( + "SELECT objectId, COUNT(*) FROM Object GROUP BY objectId HAVING COUNT(*) > 1", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("COUNT", + ValueExpr("", + FactorOp(ValueFactor(STAR, ""), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + nullptr, // WhereClause + nullptr, // OrderByClause + GroupByClause(GroupByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + "")), + HavingClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr( + "COUNT", + ValueExpr( + "", + FactorOp( + ValueFactor(STAR, + ""), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + 0, -1); + }, + "SELECT `objectId`,COUNT(*) FROM `Object` GROUP BY `objectId` HAVING COUNT(*)>1"), + + // test a function nested inside an ORDER BY expression. A bare "ORDER BY f(x)" is rejected, but a + // function within a larger expression is allowed. + Antlr4TestQueries( + "SELECT objectId FROM Object ORDER BY ra_PS + scisql_fluxToAbMag(gFlux_PS)", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + nullptr, // WhereClause + OrderByClause(OrderByTerm( + ValueExpr( + "", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::PLUS), + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr("scisql_fluxToAbMag", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", + "gFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, // GroupByClause + nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` ORDER BY(`ra_PS`+scisql_fluxToAbMag(`gFlux_PS`))"), }; BOOST_DATA_TEST_CASE(antlr4_test, ANTLR4_TEST_QUERIES, queryInfo) { @@ -2306,4 +2389,50 @@ BOOST_AUTO_TEST_CASE(set_session_var_test) { parser::adapter_order_error); } +// OFFSET is not supported by qserv. +BOOST_AUTO_TEST_CASE(offset_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT objectId FROM Object LIMIT 10 OFFSET 5"), + parser::ParseException); +} + +// DISTINCT inside an aggregate function is not supported by qserv. +BOOST_AUTO_TEST_CASE(aggregate_distinct_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT COUNT(DISTINCT objectId) FROM Object"), + parser::ParseException); +} + +// Window functions (OVER clause) are not supported by qserv. +BOOST_AUTO_TEST_CASE(window_function_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt( + "SELECT SUM(ra_PS) OVER (PARTITION BY objectId) FROM Object"), + parser::ParseException); +} + +// Aggregate functions outside the supported set (COUNT/MIN/MAX/SUM/AVG) are not supported by qserv. +BOOST_AUTO_TEST_CASE(unsupported_aggregate_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT STDDEV(ra_PS) FROM Object"), + parser::ParseException); +} + +// Row locking clauses (FOR UPDATE / LOCK IN SHARE MODE) are not supported by qserv. +BOOST_AUTO_TEST_CASE(row_locking_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT objectId FROM Object FOR UPDATE"), + parser::ParseException); +} + +// NULLS FIRST/LAST ordering is not supported by qserv. +BOOST_AUTO_TEST_CASE(nulls_ordering_not_supported) { + BOOST_CHECK_THROW( + ccontrol::ParseRunner::makeSelectStmt("SELECT objectId FROM Object ORDER BY objectId NULLS LAST"), + parser::ParseException); +} + +// A qserv area restrictor may appear bare or compared against an integer literal ("= 1"). Comparing it +// against a column should be rejected +BOOST_AUTO_TEST_CASE(area_restrictor_against_column_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) = objectId"), + parser::ParseException); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/ccontrol/testHyriseGeneratedIR.cc b/src/ccontrol/testHyriseGeneratedIR.cc index 89c7eb9460..a1eae12529 100644 --- a/src/ccontrol/testHyriseGeneratedIR.cc +++ b/src/ccontrol/testHyriseGeneratedIR.cc @@ -2266,6 +2266,89 @@ static const vector ANTLR4_TEST_QUERIES = { FromList(TableRef("", "Object", "")), nullptr, nullptr, nullptr, nullptr, 0, -1); }, "SELECT (`objectId`-1) AS `o` FROM `Object`"), + + // test HAVING with an aggregate + Antlr4TestQueries( + "SELECT objectId, COUNT(*) FROM Object GROUP BY objectId HAVING COUNT(*) > 1", + []() -> shared_ptr { + return SelectStmt( + SelectList( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr("COUNT", + ValueExpr("", + FactorOp(ValueFactor(STAR, ""), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + nullptr, // WhereClause + nullptr, // OrderByClause + GroupByClause(GroupByTerm( + ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE)), + "")), + HavingClause(OrTerm(AndTerm(BoolFactor( + IS, + CompPredicate( + ValueExpr( + "", + FactorOp( + ValueFactor( + query::ValueFactor::AGGFUNC, + FuncExpr( + "COUNT", + ValueExpr( + "", + FactorOp( + ValueFactor(STAR, + ""), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::CompPredicate::GREATER_THAN_OP, + ValueExpr("", FactorOp(ValueFactor("1"), + query::ValueExpr::NONE))))))), + 0, -1); + }, + "SELECT `objectId`,COUNT(*) FROM `Object` GROUP BY `objectId` HAVING COUNT(*)>1"), + + // test a function nested inside an ORDER BY expression. A bare "ORDER BY f(x)" is rejected, but a + // function within a larger expression is allowed. + Antlr4TestQueries( + "SELECT objectId FROM Object ORDER BY ra_PS + scisql_fluxToAbMag(gFlux_PS)", + []() -> shared_ptr { + return SelectStmt( + SelectList(ValueExpr("", FactorOp(ValueFactor(ColumnRef("", "", "objectId")), + query::ValueExpr::NONE))), + FromList(TableRef("", "Object", "")), + nullptr, // WhereClause + OrderByClause(OrderByTerm( + ValueExpr( + "", + FactorOp(ValueFactor(ColumnRef("", "", "ra_PS")), + query::ValueExpr::PLUS), + FactorOp( + ValueFactor( + query::ValueFactor::FUNCTION, + FuncExpr("scisql_fluxToAbMag", + ValueExpr("", + FactorOp(ValueFactor(ColumnRef( + "", "", + "gFlux_PS")), + query::ValueExpr:: + NONE)))), + query::ValueExpr::NONE)), + query::OrderByTerm::DEFAULT, "")), + nullptr, // GroupByClause + nullptr, 0, -1); + }, + "SELECT `objectId` FROM `Object` ORDER BY(`ra_PS`+scisql_fluxToAbMag(`gFlux_PS`)) ASC"), }; BOOST_DATA_TEST_CASE(hyrise_test, ANTLR4_TEST_QUERIES, queryInfo) { @@ -2301,4 +2384,50 @@ BOOST_AUTO_TEST_CASE(set_session_var_test) { parser::adapter_order_error); } +// OFFSET is not supported by qserv. +BOOST_AUTO_TEST_CASE(offset_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT objectId FROM Object LIMIT 10 OFFSET 5"), + parser::ParseException); +} + +// DISTINCT inside an aggregate function is not supported by qserv. +BOOST_AUTO_TEST_CASE(aggregate_distinct_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT COUNT(DISTINCT objectId) FROM Object"), + parser::ParseException); +} + +// Window functions (OVER clause) are not supported by qserv. +BOOST_AUTO_TEST_CASE(window_function_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt( + "SELECT SUM(ra_PS) OVER (PARTITION BY objectId) FROM Object"), + parser::ParseException); +} + +// Aggregate functions outside the supported set (COUNT/MIN/MAX/SUM/AVG) are not supported by qserv. +BOOST_AUTO_TEST_CASE(unsupported_aggregate_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT STDDEV(ra_PS) FROM Object"), + parser::ParseException); +} + +// Row locking clauses (FOR UPDATE / LOCK IN SHARE MODE) are not supported by qserv. +BOOST_AUTO_TEST_CASE(row_locking_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt("SELECT objectId FROM Object FOR UPDATE"), + parser::ParseException); +} + +// NULLS FIRST/LAST ordering is not supported by qserv. +BOOST_AUTO_TEST_CASE(nulls_ordering_not_supported) { + BOOST_CHECK_THROW( + ccontrol::ParseRunner::makeSelectStmt("SELECT objectId FROM Object ORDER BY objectId NULLS LAST"), + parser::ParseException); +} + +// A qserv area restrictor may appear bare or compared against an integer literal ("= 1"). Comparing it +// against a column must be rejected. +BOOST_AUTO_TEST_CASE(area_restrictor_against_column_not_supported) { + BOOST_CHECK_THROW(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) = objectId"), + parser::ParseException); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/ccontrol/testParserCorpus.cc b/src/ccontrol/testParserCorpus.cc index 2afbf3a08f..917ea154ba 100644 --- a/src/ccontrol/testParserCorpus.cc +++ b/src/ccontrol/testParserCorpus.cc @@ -59,6 +59,9 @@ string readFile(fs::path const& path) { BOOST_AUTO_TEST_SUITE(Suite) +// This test case reads files from QSERV_PARSER_CORPUS_DIR, runs them through the parser, +// and converts them to Qserv IR. It serves as both a stress test for the parser/adapter +// and also will highlight any performance regressions in either. BOOST_AUTO_TEST_CASE(parseCorpus) { auto corpusDir = QSERV_PARSER_CORPUS_DIR; BOOST_REQUIRE_MESSAGE(fs::exists(corpusDir), "Parser corpus directory does not exist: " << corpusDir); From a4f1613cd315e0aa0fd9b744afca85f3e709307f Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Thu, 18 Jun 2026 18:08:40 -0700 Subject: [PATCH 09/19] Add alternate non-ANTLR SET / CALL implementation --- src/ccontrol/UserQueryFactory.cc | 36 ++++++++++++++++++++++++++---- src/ccontrol/UserQueryType.cc | 31 ++++++++++++++++++++++++++ src/ccontrol/UserQueryType.h | 12 ++++++++++ src/ccontrol/testUserQueryType.cc | 37 +++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 4 deletions(-) diff --git a/src/ccontrol/UserQueryFactory.cc b/src/ccontrol/UserQueryFactory.cc index 3ede5d752c..d6f36fae41 100644 --- a/src/ccontrol/UserQueryFactory.cc +++ b/src/ccontrol/UserQueryFactory.cc @@ -45,6 +45,7 @@ #include "ccontrol/UserQueryProcessList.h" #include "ccontrol/UserQueryQueries.h" #include "ccontrol/UserQueryResources.h" +#include "ccontrol/UserQueryResultDelete.h" #include "ccontrol/UserQuerySelect.h" #include "ccontrol/UserQuerySelectCountStar.h" #include "ccontrol/UserQuerySet.h" @@ -289,15 +290,14 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st // Parse SELECT - ParseRunner::Ptr parser; + query::SelectStmt::Ptr stmt; try { - parser = std::make_shared(query); + stmt = ParseRunner::makeSelectStmt(query); } catch (parser::ParseException& e) { return std::make_shared(std::string("ParseException:") + e.what()); } - auto stmt = parser->getSelectStmt(); - std::lock_guard focatoryLock(_factoryMtx); + std::lock_guard factoryLock(_factoryMtx); // handle special database/table names if (_stmtRefersToProcessListTable(stmt, defaultDb)) { return _makeUserQueryProcessList(stmt, _userQuerySharedResources, userQueryId, resultDb, aQuery, @@ -399,10 +399,37 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st } } else if (UserQueryType::isCall(query)) { std::lock_guard factoryLock(_factoryMtx); +#ifdef QSERV_USE_HYRISE_SQL_PARSER + std::string resultDeleteQueryId; + if (!UserQueryType::isResultDelete(query, resultDeleteQueryId)) { + return std::make_shared("Only CALL QSERV_RESULT_DELETE is supported: " + query); + } + return std::make_shared( + _userQuerySharedResources->makeUserQueryResources(userQueryId, resultDb), + resultDeleteQueryId); +#else auto parser = std::make_shared( query, _userQuerySharedResources->makeUserQueryResources(userQueryId, resultDb)); return parser->getUserQuery(); +#endif } else if (UserQueryType::isSet(query)) { +#ifdef QSERV_USE_HYRISE_SQL_PARSER + std::string varName, varValue; + if (!UserQueryType::isSet(query, varName, varValue)) { + return std::make_shared("Unsupported SET statement: " + query); + } + std::lock_guard factoryLock(_factoryMtx); + auto uq = std::make_shared(varName, varValue); + if (varName == "QSERV_ROW_COUNTER_OPTIMIZATION") { + _useQservRowCounterOptimization = varValue != "0"; + LOGS(_log, LOG_LVL_WARN, + "QSERV_ROW_COUNTER_OPTIMIZATION=" << (_useQservRowCounterOptimization ? "1" : "0")); + } else if (varName == "QSERV_DEBUG_CZAR_NO_MERGE") { + _debugNoMerge = varValue != "0"; + LOGS(_log, LOG_LVL_WARN, "QSERV_DEBUG_CZAR_NO_MERGE=" << (_debugNoMerge ? "1" : "0")); + } + return uq; +#else ParseRunner::Ptr parser; try { parser = std::make_shared(query); @@ -421,6 +448,7 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st LOGS(_log, LOG_LVL_WARN, "QSERV_DEBUG_CZAR_NO_MERGE=" << (_debugNoMerge ? "1" : "0")); } return uq; +#endif } else { std::lock_guard factoryLock(_factoryMtx); // something that we don't recognize diff --git a/src/ccontrol/UserQueryType.cc b/src/ccontrol/UserQueryType.cc index e49c2c312b..f9c05b10f0 100644 --- a/src/ccontrol/UserQueryType.cc +++ b/src/ccontrol/UserQueryType.cc @@ -85,6 +85,14 @@ boost::regex _callRe(R"(^call\s+.+$)", // Note that parens around whole string are not part of the regex but raw string literal boost::regex _setRe(R"(^set\s+.+$)", boost::regex::ECMAScript | boost::regex::icase | boost::regex::optimize); +// regex extracting `SET GLOBAL = ` (GLOBAL required; integer value only) +boost::regex _setGlobalRe(R"(^set\s+global\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*([-+]?\d+)\s*;?\s*$)", + boost::regex::ECMAScript | boost::regex::icase | boost::regex::optimize); + +// regex extracting the argument of `CALL QSERV_RESULT_DELETE()` +boost::regex _resultDeleteRe(R"(^call\s+qserv_result_delete\s*\(\s*(.*?)\s*\)\s*;?\s*$)", + boost::regex::ECMAScript | boost::regex::icase | boost::regex::optimize); + } // namespace namespace lsst::qserv::ccontrol { @@ -180,6 +188,17 @@ bool UserQueryType::isCall(std::string const& query) { return boost::regex_match(query, _callRe); } +bool UserQueryType::isResultDelete(std::string const& query, std::string& queryId) { + LOGS(_log, LOG_LVL_TRACE, "isResultDelete: " << query); + boost::smatch sm; + bool match = boost::regex_match(query, sm, _resultDeleteRe); + if (match) { + queryId = sm.str(1); + LOGS(_log, LOG_LVL_TRACE, "isResultDelete: queryId: " << queryId); + } + return match; +} + bool UserQueryType::isSimpleCountStar(std::shared_ptr const& stmt, std::string& spelling) { if (stmt->hasWhereClause() || stmt->hasOrderBy() || stmt->hasGroupBy() || stmt->hasHaving()) { return false; @@ -209,4 +228,16 @@ bool UserQueryType::isSet(std::string const& query) { return match; } +bool UserQueryType::isSet(std::string const& query, std::string& varName, std::string& varValue) { + LOGS(_log, LOG_LVL_TRACE, "isSet (extract): " << query); + boost::smatch sm; + bool match = boost::regex_match(query, sm, _setGlobalRe); + if (match) { + varName = sm.str(1); + varValue = sm.str(2); + LOGS(_log, LOG_LVL_TRACE, "isSet: " << varName << "=" << varValue); + } + return match; +} + } // namespace lsst::qserv::ccontrol diff --git a/src/ccontrol/UserQueryType.h b/src/ccontrol/UserQueryType.h index a4105e43b7..3dc26a996a 100644 --- a/src/ccontrol/UserQueryType.h +++ b/src/ccontrol/UserQueryType.h @@ -101,6 +101,12 @@ class UserQueryType { */ static bool isCall(std::string const& query); + /** + * Returns true if query is `CALL QSERV_RESULT_DELETE()` + * On a match, sets @p queryId to the raw, unvalidated argument string. + */ + static bool isResultDelete(std::string const& query, std::string& queryId); + /** * * @param stmt the statement to check @@ -116,6 +122,12 @@ class UserQueryType { /// Returns true if query is SET (for variable assignment) static bool isSet(std::string const& query); + + /** + * Returns true if query is `SET GLOBAL = `. On a match, sets @p varName and + * @p varValue. The value must be an integer literal. + */ + static bool isSet(std::string const& query, std::string& varName, std::string& varValue); }; } // namespace lsst::qserv::ccontrol diff --git a/src/ccontrol/testUserQueryType.cc b/src/ccontrol/testUserQueryType.cc index 0c6c56add2..4b6896084c 100644 --- a/src/ccontrol/testUserQueryType.cc +++ b/src/ccontrol/testUserQueryType.cc @@ -39,4 +39,41 @@ BOOST_AUTO_TEST_CASE(testCallQueryType) { BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isCall("submit call QSERV_RESULT_DELETE foo"), false); } +BOOST_AUTO_TEST_CASE(testResultDelete) { + std::string queryId; + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isResultDelete("CALL QSERV_RESULT_DELETE(1)", queryId), true); + BOOST_CHECK_EQUAL(queryId, "1"); + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isResultDelete("call qserv_result_delete( 42 ) ;", queryId), + true); + BOOST_CHECK_EQUAL(queryId, "42"); + // Not QSERV_RESULT_DELETE: must not match (only supported CALL form). + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isResultDelete("CALL SOMETHING_ELSE(1)", queryId), false); +} + +BOOST_AUTO_TEST_CASE(testSetQueryType) { + std::string varName, varValue; + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 0", varName, + varValue), + true); + BOOST_CHECK_EQUAL(varName, "QSERV_ROW_COUNTER_OPTIMIZATION"); + BOOST_CHECK_EQUAL(varValue, "0"); + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isSet("set global QSERV_ROW_COUNTER_OPTIMIZATION = 1;", + varName, varValue), + true); + BOOST_CHECK_EQUAL(varValue, "1"); + + // Boolean values are rejected + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = FALSE", + varName, varValue), + false); + BOOST_CHECK_EQUAL(ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = TRUE", + varName, varValue), + false); + + // GLOBAL is required + BOOST_CHECK_EQUAL( + ccontrol::UserQueryType::isSet("SET QSERV_ROW_COUNTER_OPTIMIZATION = 0", varName, varValue), + false); +} + BOOST_AUTO_TEST_SUITE_END() From a68f3fcbdc45b924a318172a4df21908a26cb90d Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Fri, 19 Jun 2026 10:21:47 -0700 Subject: [PATCH 10/19] Remove QueryAnaHelper::getParser This was previously unused and consolidates paths into the SQL parser so it can be easily toggled between implementations (ANTLR/Hyrise in this case) --- src/tests/QueryAnaHelper.cc | 7 ------- src/tests/QueryAnaHelper.h | 3 --- 2 files changed, 10 deletions(-) diff --git a/src/tests/QueryAnaHelper.cc b/src/tests/QueryAnaHelper.cc index 036147f7da..989766d07b 100644 --- a/src/tests/QueryAnaHelper.cc +++ b/src/tests/QueryAnaHelper.cc @@ -40,7 +40,6 @@ #include "lsst/log/Log.h" // Qserv headers -#include "ccontrol/ParseRunner.h" #include "parser/ParseException.h" #include "qproc/ChunkSpec.h" #include "query/AreaRestrictor.h" @@ -48,7 +47,6 @@ #include "query/SecIdxRestrictor.h" #include "query/SelectStmt.h" -using lsst::qserv::ccontrol::ParseRunner; using lsst::qserv::qproc::ChunkQuerySpec; using lsst::qserv::qproc::ChunkSpec; using lsst::qserv::qproc::QuerySession; @@ -61,11 +59,6 @@ LOG_LOGGER _log = LOG_GET("lsst.qserv.tests.QueryAnaHelper"); namespace lsst::qserv::tests { -ParseRunner::Ptr QueryAnaHelper::getParser(std::string const& stmt) { - auto p = std::make_shared(stmt); - return p; -} - std::shared_ptr QueryAnaHelper::buildQuerySession(QuerySession::Test qsTest, std::string const& stmt, bool expectError) { querySession = std::make_shared(qsTest); diff --git a/src/tests/QueryAnaHelper.h b/src/tests/QueryAnaHelper.h index 639fddb5d6..e934736c7d 100644 --- a/src/tests/QueryAnaHelper.h +++ b/src/tests/QueryAnaHelper.h @@ -36,7 +36,6 @@ #include // Qserv headers -#include "ccontrol/ParseRunner.h" #include "qproc/QuerySession.h" #include "util/IterableFormatter.h" @@ -46,8 +45,6 @@ namespace lsst::qserv::tests { * @brief Test tools used by qproc::testQueryAna* units tests */ struct QueryAnaHelper { - static ccontrol::ParseRunner::Ptr getParser(const std::string& stmt); - /** * @brief Prepare the query session used to process SQL queries * issued from MySQL client. From 9becc724cb32173546eb525f57234a59295ce9a5 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Fri, 19 Jun 2026 19:13:18 -0700 Subject: [PATCH 11/19] Remove hyrise source tree --- extern/hyrise_sql_parser/.clang-format | 87 - .../.github/workflows/ci.yml | 111 - extern/hyrise_sql_parser/.gitignore | 53 - extern/hyrise_sql_parser/CMakeLists.txt | 42 - extern/hyrise_sql_parser/LICENSE | 21 - extern/hyrise_sql_parser/Makefile | 172 - extern/hyrise_sql_parser/README.md | 63 - extern/hyrise_sql_parser/benchmark/README.md | 14 - .../hyrise_sql_parser/benchmark/benchmark.cpp | 28 - .../benchmark/benchmark_utils.cpp | 44 - .../benchmark/benchmark_utils.h | 41 - .../benchmark/parser_benchmark.cpp | 87 - .../hyrise_sql_parser/benchmark/queries.cpp | 47 - extern/hyrise_sql_parser/benchmark/queries.h | 56 - extern/hyrise_sql_parser/docs/.gitignore | 1 - extern/hyrise_sql_parser/docs/README.md | 14 - extern/hyrise_sql_parser/docs/basic-usage.md | 70 - extern/hyrise_sql_parser/docs/dev-docs.md | 63 - .../docs/known-limitations.md | 18 - .../hyrise_sql_parser/docs/syntax-support.md | 53 - .../docs/technical_documentation.pdf | Bin 284530 -> 0 bytes extern/hyrise_sql_parser/example/.gitignore | 1 - extern/hyrise_sql_parser/example/Makefile | 6 - extern/hyrise_sql_parser/example/example.cpp | 41 - extern/hyrise_sql_parser/format.sh | 24 - extern/hyrise_sql_parser/src/SQLParser.cpp | 74 - extern/hyrise_sql_parser/src/SQLParser.h | 35 - .../hyrise_sql_parser/src/SQLParserResult.cpp | 82 - .../hyrise_sql_parser/src/SQLParserResult.h | 94 - .../hyrise_sql_parser/src/parser/.gitignore | 2 - extern/hyrise_sql_parser/src/parser/Makefile | 39 - .../src/parser/bison_parser.cpp | 6300 ----------------- .../src/parser/bison_parser.h | 386 - .../src/parser/bison_parser.y | 1552 ---- .../src/parser/flex_lexer.cpp | 4620 ------------ .../hyrise_sql_parser/src/parser/flex_lexer.h | 733 -- .../hyrise_sql_parser/src/parser/flex_lexer.l | 308 - .../src/parser/keywordlist_generator.py | 46 - .../src/parser/parser_typedef.h | 33 - .../src/parser/sql_keywords.txt | 163 - .../src/sql/AlterStatement.h | 40 - extern/hyrise_sql_parser/src/sql/ColumnType.h | 43 - .../src/sql/CreateStatement.cpp | 152 - .../src/sql/CreateStatement.h | 103 - .../src/sql/DeleteStatement.h | 23 - .../hyrise_sql_parser/src/sql/DropStatement.h | 25 - .../src/sql/ExecuteStatement.h | 20 - .../src/sql/ExportStatement.h | 26 - extern/hyrise_sql_parser/src/sql/Expr.cpp | 339 - extern/hyrise_sql_parser/src/sql/Expr.h | 253 - .../src/sql/ImportExportOptions.h | 46 - .../src/sql/ImportStatement.h | 25 - .../src/sql/InsertStatement.h | 26 - .../src/sql/PrepareStatement.cpp | 12 - .../src/sql/PrepareStatement.h | 22 - .../src/sql/SQLStatement.cpp | 24 - .../hyrise_sql_parser/src/sql/SQLStatement.h | 51 - .../src/sql/SelectStatement.h | 116 - .../hyrise_sql_parser/src/sql/ShowStatement.h | 23 - extern/hyrise_sql_parser/src/sql/Table.h | 70 - .../src/sql/TransactionStatement.h | 21 - .../src/sql/UpdateStatement.h | 27 - .../hyrise_sql_parser/src/sql/statements.cpp | 442 -- extern/hyrise_sql_parser/src/sql/statements.h | 18 - .../hyrise_sql_parser/src/util/sqlhelper.cpp | 509 -- extern/hyrise_sql_parser/src/util/sqlhelper.h | 40 - .../test/auto_query_file_test.cpp | 97 - .../hyrise_sql_parser/test/prepare_tests.cpp | 84 - .../test/queries/queries-bad.sql | 112 - .../test/queries/queries-good.sql | 122 - .../test/queries/tpc-h-01.sql | 9 - .../test/queries/tpc-h-02.sql | 10 - .../test/queries/tpc-h-03.sql | 7 - .../test/queries/tpc-h-04.sql | 6 - .../test/queries/tpc-h-05.sql | 9 - .../test/queries/tpc-h-06.sql | 5 - .../test/queries/tpc-h-07.sql | 11 - .../test/queries/tpc-h-08.sql | 10 - .../test/queries/tpc-h-09.sql | 10 - .../test/queries/tpc-h-10.sql | 9 - .../test/queries/tpc-h-11.sql | 10 - .../test/queries/tpc-h-12.sql | 10 - .../test/queries/tpc-h-13.sql | 8 - .../test/queries/tpc-h-14.sql | 5 - .../test/queries/tpc-h-15.sql | 15 - .../test/queries/tpc-h-16.sql | 9 - .../test/queries/tpc-h-17.sql | 4 - .../test/queries/tpc-h-18.sql | 7 - .../test/queries/tpc-h-19.sql | 9 - .../test/queries/tpc-h-20.sql | 8 - .../test/queries/tpc-h-21.sql | 11 - .../test/queries/tpc-h-22.sql | 9 - .../hyrise_sql_parser/test/select_tests.cpp | 1322 ---- extern/hyrise_sql_parser/test/sql_asserts.h | 19 - extern/hyrise_sql_parser/test/sql_parser.cpp | 44 - extern/hyrise_sql_parser/test/sql_tests.cpp | 793 --- extern/hyrise_sql_parser/test/test.sh | 102 - .../test/thirdparty/microtest/microtest.h | 207 - extern/hyrise_sql_parser/test/tpc_h_tests.cpp | 111 - 99 files changed, 21324 deletions(-) delete mode 100644 extern/hyrise_sql_parser/.clang-format delete mode 100644 extern/hyrise_sql_parser/.github/workflows/ci.yml delete mode 100644 extern/hyrise_sql_parser/.gitignore delete mode 100644 extern/hyrise_sql_parser/CMakeLists.txt delete mode 100644 extern/hyrise_sql_parser/LICENSE delete mode 100644 extern/hyrise_sql_parser/Makefile delete mode 100644 extern/hyrise_sql_parser/README.md delete mode 100644 extern/hyrise_sql_parser/benchmark/README.md delete mode 100644 extern/hyrise_sql_parser/benchmark/benchmark.cpp delete mode 100644 extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp delete mode 100644 extern/hyrise_sql_parser/benchmark/benchmark_utils.h delete mode 100644 extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp delete mode 100644 extern/hyrise_sql_parser/benchmark/queries.cpp delete mode 100644 extern/hyrise_sql_parser/benchmark/queries.h delete mode 100644 extern/hyrise_sql_parser/docs/.gitignore delete mode 100644 extern/hyrise_sql_parser/docs/README.md delete mode 100644 extern/hyrise_sql_parser/docs/basic-usage.md delete mode 100644 extern/hyrise_sql_parser/docs/dev-docs.md delete mode 100644 extern/hyrise_sql_parser/docs/known-limitations.md delete mode 100644 extern/hyrise_sql_parser/docs/syntax-support.md delete mode 100644 extern/hyrise_sql_parser/docs/technical_documentation.pdf delete mode 100644 extern/hyrise_sql_parser/example/.gitignore delete mode 100644 extern/hyrise_sql_parser/example/Makefile delete mode 100644 extern/hyrise_sql_parser/example/example.cpp delete mode 100644 extern/hyrise_sql_parser/format.sh delete mode 100644 extern/hyrise_sql_parser/src/SQLParser.cpp delete mode 100644 extern/hyrise_sql_parser/src/SQLParser.h delete mode 100644 extern/hyrise_sql_parser/src/SQLParserResult.cpp delete mode 100644 extern/hyrise_sql_parser/src/SQLParserResult.h delete mode 100644 extern/hyrise_sql_parser/src/parser/.gitignore delete mode 100644 extern/hyrise_sql_parser/src/parser/Makefile delete mode 100644 extern/hyrise_sql_parser/src/parser/bison_parser.cpp delete mode 100644 extern/hyrise_sql_parser/src/parser/bison_parser.h delete mode 100644 extern/hyrise_sql_parser/src/parser/bison_parser.y delete mode 100644 extern/hyrise_sql_parser/src/parser/flex_lexer.cpp delete mode 100644 extern/hyrise_sql_parser/src/parser/flex_lexer.h delete mode 100644 extern/hyrise_sql_parser/src/parser/flex_lexer.l delete mode 100644 extern/hyrise_sql_parser/src/parser/keywordlist_generator.py delete mode 100644 extern/hyrise_sql_parser/src/parser/parser_typedef.h delete mode 100644 extern/hyrise_sql_parser/src/parser/sql_keywords.txt delete mode 100644 extern/hyrise_sql_parser/src/sql/AlterStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/ColumnType.h delete mode 100644 extern/hyrise_sql_parser/src/sql/CreateStatement.cpp delete mode 100644 extern/hyrise_sql_parser/src/sql/CreateStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/DeleteStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/DropStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/ExecuteStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/ExportStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/Expr.cpp delete mode 100644 extern/hyrise_sql_parser/src/sql/Expr.h delete mode 100644 extern/hyrise_sql_parser/src/sql/ImportExportOptions.h delete mode 100644 extern/hyrise_sql_parser/src/sql/ImportStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/InsertStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp delete mode 100644 extern/hyrise_sql_parser/src/sql/PrepareStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/SQLStatement.cpp delete mode 100644 extern/hyrise_sql_parser/src/sql/SQLStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/SelectStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/ShowStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/Table.h delete mode 100644 extern/hyrise_sql_parser/src/sql/TransactionStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/UpdateStatement.h delete mode 100644 extern/hyrise_sql_parser/src/sql/statements.cpp delete mode 100644 extern/hyrise_sql_parser/src/sql/statements.h delete mode 100644 extern/hyrise_sql_parser/src/util/sqlhelper.cpp delete mode 100644 extern/hyrise_sql_parser/src/util/sqlhelper.h delete mode 100644 extern/hyrise_sql_parser/test/auto_query_file_test.cpp delete mode 100644 extern/hyrise_sql_parser/test/prepare_tests.cpp delete mode 100644 extern/hyrise_sql_parser/test/queries/queries-bad.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/queries-good.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-01.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-02.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-03.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-04.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-05.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-06.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-07.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-08.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-09.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-10.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-11.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-12.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-13.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-14.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-15.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-16.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-17.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-18.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-19.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-20.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-21.sql delete mode 100644 extern/hyrise_sql_parser/test/queries/tpc-h-22.sql delete mode 100644 extern/hyrise_sql_parser/test/select_tests.cpp delete mode 100644 extern/hyrise_sql_parser/test/sql_asserts.h delete mode 100644 extern/hyrise_sql_parser/test/sql_parser.cpp delete mode 100644 extern/hyrise_sql_parser/test/sql_tests.cpp delete mode 100644 extern/hyrise_sql_parser/test/test.sh delete mode 100644 extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h delete mode 100644 extern/hyrise_sql_parser/test/tpc_h_tests.cpp diff --git a/extern/hyrise_sql_parser/.clang-format b/extern/hyrise_sql_parser/.clang-format deleted file mode 100644 index 685d73a054..0000000000 --- a/extern/hyrise_sql_parser/.clang-format +++ /dev/null @@ -1,87 +0,0 @@ ---- -Language: Cpp -AccessModifierOffset: -1 -AlignAfterOpenBracket: Align -AlignConsecutiveAssignments: false -AlignConsecutiveDeclarations: false -AlignEscapedNewlinesLeft: true -AlignOperands: true -AlignTrailingComments: true -AllowAllParametersOfDeclarationOnNextLine: true -AllowShortBlocksOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: All -AllowShortIfStatementsOnASingleLine: true -AllowShortLoopsOnASingleLine: true -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: true -AlwaysBreakTemplateDeclarations: true -BinPackArguments: true -BinPackParameters: true -BraceWrapping: - AfterClass: false - AfterControlStatement: false - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - BeforeCatch: false - BeforeElse: false - IndentBraces: false -BreakBeforeBinaryOperators: None -BreakBeforeBraces: Attach -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -ColumnLimit: 120 -ConstructorInitializerAllOnOneLineOrOnePerLine: true -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DerivePointerAlignment: false -DisableFormat: false -ExperimentalAutoDetectBinPacking: false -ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] -IncludeCategories: - - Regex: '^<.*\.h>' - Priority: 1 - - Regex: '^<.*' - Priority: 2 - - Regex: '.*' - Priority: 3 -IndentCaseLabels: true -IndentWidth: 2 -IndentWrappedFunctionNames: false -KeepEmptyLinesAtTheStartOfBlocks: false -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCBlockIndentWidth: 2 -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: false -PenaltyBreakBeforeFirstCallParameter: 1 -PenaltyBreakComment: 300 -PenaltyBreakFirstLessLess: 120 -PenaltyBreakString: 1000 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 200 -PointerAlignment: Left -ReflowComments: false -SortIncludes: true -SpaceAfterCStyleCast: false -SpaceBeforeAssignmentOperators: true -SpaceBeforeParens: ControlStatements -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 2 -SpacesInAngles: false -SpacesInContainerLiterals: true -SpacesInCStyleCastParentheses: false -SpacesInParentheses: false -SpacesInSquareBrackets: false -Standard: Auto -TabWidth: 8 -UseTab: Never -... diff --git a/extern/hyrise_sql_parser/.github/workflows/ci.yml b/extern/hyrise_sql_parser/.github/workflows/ci.yml deleted file mode 100644 index d9122e3b5d..0000000000 --- a/extern/hyrise_sql_parser/.github/workflows/ci.yml +++ /dev/null @@ -1,111 +0,0 @@ -name: CI - -on: - pull_request: - push: - branches: - - main - -jobs: - build: - name: ${{matrix.name}} - runs-on: ${{matrix.os}} - container: ${{matrix.container}} - env: - CC: ${{matrix.cc}} - CXX: ${{matrix.cxx}} - defaults: - run: - shell: bash - strategy: - fail-fast: false - matrix: - include: - - name: gcc-6 - cc: gcc-6 - cxx: g++-6 - os: ubuntu-latest - container: ubuntu:18.04 - - - name: gcc-14 - cc: gcc-14 - cxx: g++-14 - os: ubuntu-latest - container: ubuntu:24.04 - # We need relaxed builds for debug mode with current GCC versions, see #218. - build_options: "relaxed_build=on" - - - name: clang-19 - cc: clang-19 - cxx: clang++-19 - os: ubuntu-latest - container: ubuntu:24.04 - - - name: clang-macOS - cc: clang - cxx: clang++ - os: macos-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - if: matrix.name != 'gcc-6' - - - name: Checkout (Ubuntu 18.04) - if: matrix.name == 'gcc-6' - # Recent versions of Github's checkout action do not run on older Ubuntu versions because they use a too recent - # Node.js version. Thus, we have to checkout the code manually. - # Doing so is a bit tricky when it comes to PRs from forks (see #249 for details). The general idea here is that - # we access Github's context information for the event triggering the action's execution and use some details on - # the PR's HEAD if given. Otherwise (for executions due to main branch updates), we still use the provided - # environment variables. - run: | - apt-get update - apt-get install -y git - git config --global --add safe.directory '*' - git clone $(awk -v a=${{github.event.pull_request.head.repo.clone_url}} -v b="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}" 'BEGIN { if (a == "") { print b } else { print a } }') . - git checkout $GITHUB_HEAD_REF - - - name: Setup (macOS) - if: matrix.name == 'clang-macOS' - run: | - brew install bison flex - echo "BISON=$(brew --prefix bison)/bin/bison" >> $GITHUB_ENV - echo "FLEX=$(brew --prefix flex)/bin/flex" >> $GITHUB_ENV - - - name: Setup (Ubuntu) - if: matrix.name != 'clang-macOS' - run: | - apt-get update - apt-get install --no-install-recommends -y bison flex ${CC} ${CXX} make valgrind - echo "BISON=bison" >> $GITHUB_ENV - echo "FLEX=flex" >> $GITHUB_ENV - - - name: System Information - run: | - awk -v a=$(uname) 'BEGIN { a == "Linux" ? system("cat /etc/issue") : system("sw_vers") }' - ${CC} --version - ${CXX} --version - ${BISON} --version - ${FLEX} --version - awk -v a=$(uname) 'BEGIN { if (a == "Linux") system("valgrind --version") }' - - - name: Build Parser - run: | - make -j $(nproc) - BISON=${BISON} FLEX=${FLEX} make test - make test_example - - - name: Build Parser and Lexer from Scratch - run: | - BISON=${BISON} FLEX=${FLEX} make cleanall - BISON=${BISON} FLEX=${FLEX} make -j $(nproc) - BISON=${BISON} FLEX=${FLEX} make test - make test_example - - - name: Build Parser and Lexer from Scratch (Debug) - run: | - BISON=${BISON} FLEX=${FLEX} make cleanall - BISON=${BISON} FLEX=${FLEX} make -j $(nproc) mode=debug ${{matrix.build_options}} - BISON=${BISON} FLEX=${FLEX} make test - make test_example diff --git a/extern/hyrise_sql_parser/.gitignore b/extern/hyrise_sql_parser/.gitignore deleted file mode 100644 index 489d517475..0000000000 --- a/extern/hyrise_sql_parser/.gitignore +++ /dev/null @@ -1,53 +0,0 @@ -build/ -utils/ -bin/ -lib-test/ - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - -# IDE -.idea/ - -# CMAKE -cmake-build-debug/ - -*.cpp.orig -*.h.orig - -# Vim Swap Files -*.swp - -*.csv - -# macOS compilation dirs -*.dSYM -.DS_STORE - -.vscode/* diff --git a/extern/hyrise_sql_parser/CMakeLists.txt b/extern/hyrise_sql_parser/CMakeLists.txt deleted file mode 100644 index 1ac66bff1f..0000000000 --- a/extern/hyrise_sql_parser/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -project(hyrise_sql_parser - LANGUAGES CXX -) - -add_library(sqlparser STATIC) -add_library(hyrise_sql_parser::sqlparser ALIAS sqlparser) - -target_compile_features(sqlparser PUBLIC cxx_std_17) -set_target_properties(sqlparser PROPERTIES - POSITION_INDEPENDENT_CODE ON -) - -target_include_directories(sqlparser PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/src -) - -target_sources(sqlparser PRIVATE - src/SQLParser.cpp - src/SQLParserResult.cpp - src/parser/bison_parser.cpp - src/parser/flex_lexer.cpp - src/sql/CreateStatement.cpp - src/sql/Expr.cpp - src/sql/PrepareStatement.cpp - src/sql/SQLStatement.cpp - src/sql/statements.cpp - src/util/sqlhelper.cpp -) - -set_source_files_properties( - src/parser/bison_parser.cpp - PROPERTIES COMPILE_OPTIONS "-Wno-unused-but-set-variable;-Wno-free-nonheap-object" -) - -set_source_files_properties( - src/parser/flex_lexer.cpp - PROPERTIES COMPILE_OPTIONS "-Wno-sign-compare;-Wno-register" -) - -install(TARGETS sqlparser) diff --git a/extern/hyrise_sql_parser/LICENSE b/extern/hyrise_sql_parser/LICENSE deleted file mode 100644 index 92b3a42844..0000000000 --- a/extern/hyrise_sql_parser/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2012-2017 Hasso-Plattner-Institut - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/extern/hyrise_sql_parser/Makefile b/extern/hyrise_sql_parser/Makefile deleted file mode 100644 index 4b036045a9..0000000000 --- a/extern/hyrise_sql_parser/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -all: library - -####################################### -############# Directories ############# -####################################### -BIN = bin -SRC = src -SRCPARSER = src/parser - -INSTALL = /usr/local - -###################################### -############ Compile Mode ############ -###################################### -# Set compile mode to -g or -O3. -# Debug mode: make mode=debug - -mode ?= release -MODE_LOG = "" -OPT_FLAG = -ifeq ($(mode), debug) - OPT_FLAG = -g - MODE_LOG = "Building in \033[1;31mdebug\033[0m mode" -else - OPT_FLAG = -O3 - MODE_LOG = "Building in \033[0;32mrelease\033[0m mode ('make mode=debug' for debug mode)" -endif - -GMAKE = make mode=$(mode) - - - -####################################### -############### Library ############### -####################################### -NAME := sqlparser -PARSER_CPP = $(SRCPARSER)/bison_parser.cpp $(SRCPARSER)/flex_lexer.cpp -PARSER_H = $(SRCPARSER)/bison_parser.h $(SRCPARSER)/flex_lexer.h -LIB_CFLAGS = -std=c++17 $(OPT_FLAG) - -relaxed_build ?= "off" -ifeq ($(relaxed_build), on) - $(warning $(NAME) will be built with most compiler warnings deactivated. This is fine if you want to test $(NAME) but will become an issue when you want to contribute code.) -else - LIB_CFLAGS += -Wall -Werror - # Clang: ensure files end with newline. Missing final newlines here triggered - # -Wnewline-eof warnings in downstream projects (e.g., Hyrise). - ifneq (,$(findstring clang,$(shell $(CXX) --version 2>/dev/null))) - LIB_CFLAGS += -Wnewline-eof - endif -endif - -static ?= no -ifeq ($(static), yes) - LIB_BUILD = lib$(NAME).a - LIBLINKER = $(AR) - LIB_LFLAGS = rs -else - LIB_BUILD = lib$(NAME).so - LIBLINKER = $(CXX) - LIB_CFLAGS += -fPIC - LIB_LFLAGS = -shared -o -endif -LIB_CPP = $(sort $(shell find $(SRC) -name '*.cpp' -not -path "$(SRCPARSER)/*") $(PARSER_CPP)) -LIB_H = $(shell find $(SRC) -name '*.h' -not -path "$(SRCPARSER)/*") $(PARSER_H) -LIB_ALL = $(shell find $(SRC) -name '*.cpp' -not -path "$(SRCPARSER)/*") $(shell find $(SRC) -name '*.h' -not -path "$(SRCPARSER)/*") -LIB_OBJ = $(LIB_CPP:%.cpp=%.o) - -library: $(LIB_BUILD) - -$(LIB_BUILD): $(LIB_OBJ) - $(LIBLINKER) $(LIB_LFLAGS) $(LIB_BUILD) $(LIB_OBJ) - -# The auto-generated code from bison and flex contains some parts the compiler complains about with -Wall. -$(SRCPARSER)/flex_lexer.o: $(SRCPARSER)/flex_lexer.cpp $(SRCPARSER)/bison_parser.cpp - $(CXX) $(LIB_CFLAGS) -c -o $@ $< -Wno-sign-compare -Wno-unneeded-internal-declaration -Wno-register -$(SRCPARSER)/bison_parser.o: $(SRCPARSER)/bison_parser.cpp - $(CXX) $(LIB_CFLAGS) -c -o $@ $< -Wno-unused-but-set-variable - -%.o: %.cpp $(PARSER_CPP) $(LIB_H) - $(CXX) $(LIB_CFLAGS) -c -o $@ $< - -$(SRCPARSER)/bison_parser.cpp: $(SRCPARSER)/bison_parser.y - $(GMAKE) -C $(SRCPARSER)/ bison_parser.cpp - -$(SRCPARSER)/flex_lexer.cpp: $(SRCPARSER)/flex_lexer.l - $(GMAKE) -C $(SRCPARSER)/ flex_lexer.cpp - -$(SRCPARSER)/bison_parser.h: $(SRCPARSER)/bison_parser.cpp -$(SRCPARSER)/flex_lexer.h: $(SRCPARSER)/flex_lexer.cpp - -clean: - rm -f lib$(NAME).a lib$(NAME).so - rm -rf $(BIN) - find $(SRC) -type f -name '*.o' -delete - -cleanparser: - $(GMAKE) -C $(SRCPARSER)/ clean - -cleanall: clean cleanparser - -install: - cp $(LIB_BUILD) $(INSTALL)/lib/$(LIB_BUILD) - rm -rf $(INSTALL)/include/hsql - cp -r src $(INSTALL)/include/hsql - find $(INSTALL)/include/hsql -not -name '*.h' -type f | xargs rm - - - -####################################### -############## Benchmark ############## -####################################### -BM_BUILD = $(BIN)/benchmark -BM_CFLAGS = -std=c++17 -Wall -Isrc/ -L./ $(OPT_FLAG) -BM_PATH = benchmark -BM_CPP = $(shell find $(BM_PATH)/ -name '*.cpp') -BM_ALL = $(shell find $(BM_PATH)/ -name '*.cpp' -or -name '*.h') - -benchmark: $(BM_BUILD) - -run_benchmarks: benchmark - ./$(BM_BUILD) --benchmark_counters_tabular=true - # --benchmark_filter="abc - -save_benchmarks: benchmark - ./$(BM_BUILD) --benchmark_format=csv > benchmarks.csv - -$(BM_BUILD): $(BM_ALL) $(LIB_BUILD) - @mkdir -p $(BIN)/ - $(CXX) $(BM_CFLAGS) $(BM_CPP) -o $(BM_BUILD) -lbenchmark -lpthread -lsqlparser -lstdc++ -lstdc++fs - - - -######################################## -############ Test & Example ############ -######################################## -TEST_BUILD = $(BIN)/tests -TEST_CFLAGS = -std=c++1z -Wall -Werror -Isrc/ -Itest/ -L./ $(OPT_FLAG) -TEST_CPP = $(shell find test/ -name '*.cpp') -TEST_ALL = $(shell find test/ -name '*.cpp') $(shell find test/ -name '*.h') -EXAMPLE_SRC = $(shell find example/ -name '*.cpp') $(shell find example/ -name '*.h') - -test: $(TEST_BUILD) - bash test/test.sh - -$(TEST_BUILD): $(TEST_ALL) $(LIB_BUILD) - @mkdir -p $(BIN)/ - $(CXX) $(TEST_CFLAGS) $(TEST_CPP) -o $(TEST_BUILD) -lsqlparser -lstdc++ - -test_example: - $(GMAKE) -C example/ - LD_LIBRARY_PATH=./ \ - ./example/example "SELECT * FROM students WHERE name = 'Max Mustermann';" - -test_format: - @! astyle --options=astyle.options $(LIB_ALL) | grep -q "Formatted" - @! astyle --options=astyle.options $(TEST_ALL) | grep -q "Formatted" - - - -######################################## -################# Misc ################# -######################################## - -format: - astyle --options=astyle.options $(LIB_ALL) - astyle --options=astyle.options $(TEST_ALL) - astyle --options=astyle.options $(EXAMPLE_SRC) - -log_mode: - @echo $(MODE_LOG) - diff --git a/extern/hyrise_sql_parser/README.md b/extern/hyrise_sql_parser/README.md deleted file mode 100644 index dde5724673..0000000000 --- a/extern/hyrise_sql_parser/README.md +++ /dev/null @@ -1,63 +0,0 @@ -C++ SQL Parser -========================= -[![Build Status](https://github.com/hyrise/sql-parser/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/hyrise/sql-parser/actions?query=branch%3Amain) - - -This is a SQL Parser for C++. It parses the given SQL query into C++ objects. -It has been developed for integration in [Hyrise](https://github.com/hyrise/hyrise), but can be used perfectly well in other environments as well. - -In March 2015 we've also written a short paper outlining discussing some development details and the integration into our database Hyrise. You can find the paper [here](docs/technical_documentation.pdf). - - -## Usage - -**Note:** You can also find a detailed usage description [here](docs/basic-usage.md). - -To use the SQL parser in your own projects you simply have to follow these few steps. - - 1. Download the [latest release here](https://github.com/hyrise/sql-parser/releases) - 2. Compile the library `make` to create `libsqlparser.so` - 3. *(Optional, Recommended)* Run `make install` to copy the library to `/usr/local/lib/` - 4. Run the tests `make test` to make sure everything worked - 5. Include the `SQLParser.h` from `src/` (or from `/usr/local/lib/hsql/` if you installed it) and link the library in your project - 6. Take a look at the [example project here](https://github.com/hyrise/sql-parser/tree/main/example) - -```cpp -#include "hsql/SQLParser.h" - -/* ... */ - -{ - // Basic Usage Example - - const std::string query = "..."; - hsql::SQLParserResult result; - hsql::SQLParser::parse(query, &result); - - if (result.isValid() && result.size() > 0) { - const hsql::SQLStatement* statement = result.getStatement(0); - - if (statement->isType(hsql::kStmtSelect)) { - const auto* select = static_cast(statement); - /* ... */ - } - } -} -``` - -Quick Links: - - * [SQLParser.h](src/SQLParser.h) - * [SQLParserResult.h](src/SQLParserResult.h) - * [SelectStatement.h](src/sql/SelectStatement.h) - -## How to Contribute - -**[Developer Documentation](docs/)** - -We strongly encourage you to contribute to this project! If you want to contribute to this project there are several options. If you've noticed a bug or would like an improvement let us know by creating a [new issue](https://github.com/hyrise/sql-parser/issues). If you want to develop a new feature yourself or just improve the quality of the system, feel free to fork the reposistory and implement your changes. Open a pull request as soon as your done and we will look over it. If we think it's good then your pull request will be merged into this repository. - - -## License - -HYRISE sql-parser is licensed as open source after the MIT License which is declared in the LICENSE file of this project. diff --git a/extern/hyrise_sql_parser/benchmark/README.md b/extern/hyrise_sql_parser/benchmark/README.md deleted file mode 100644 index 6c038baa0c..0000000000 --- a/extern/hyrise_sql_parser/benchmark/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Benchmark - -This directory contains the scripts to execute benchmarks of the parser. We use [Google Benchmark](https://github.com/google/benchmark) to define and run benchmarks. - -## Install Google Benchmark - -```bash -cmake -DCMAKE_BUILD_TYPE=Release - -make - -make install -``` - diff --git a/extern/hyrise_sql_parser/benchmark/benchmark.cpp b/extern/hyrise_sql_parser/benchmark/benchmark.cpp deleted file mode 100644 index e1435504b8..0000000000 --- a/extern/hyrise_sql_parser/benchmark/benchmark.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "benchmark/benchmark.h" - -#include "benchmark_utils.h" -#include "queries.h" - -int main(int argc, char** argv) { - // Create parse and tokenize benchmarks for TPC-H queries. - const auto tpch_queries = getTPCHQueries(); - for (const auto& query : tpch_queries) { - std::string p_name = query.first + "-parse"; - benchmark::RegisterBenchmark(p_name.c_str(), &BM_ParseBenchmark, query.second); - std::string t_name = query.first + "-tokenize"; - benchmark::RegisterBenchmark(t_name.c_str(), &BM_TokenizeBenchmark, query.second); - } - - // Create parse and tokenize benchmarks for all queries in sql_queries array. - for (unsigned i = 0; i < sql_queries.size(); ++i) { - const auto& query = sql_queries[i]; - std::string p_name = getQueryName(i) + "-parse"; - benchmark::RegisterBenchmark(p_name.c_str(), &BM_ParseBenchmark, query.second); - - std::string t_name = getQueryName(i) + "-tokenize"; - benchmark::RegisterBenchmark(t_name.c_str(), &BM_TokenizeBenchmark, query.second); - } - - benchmark::Initialize(&argc, argv); - benchmark::RunSpecifiedBenchmarks(); -} diff --git a/extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp b/extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp deleted file mode 100644 index 27fb66c4ee..0000000000 --- a/extern/hyrise_sql_parser/benchmark/benchmark_utils.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "benchmark_utils.h" - -#include -#include - -#include "SQLParser.h" - -size_t getNumTokens(const std::string& query) { - std::vector tokens; - hsql::SQLParser::tokenize(query, &tokens); - return tokens.size(); -} - -void BM_TokenizeBenchmark(benchmark::State& st, const std::string& query) { - st.counters["num_tokens"] = getNumTokens(query); - st.counters["num_chars"] = query.size(); - - while (st.KeepRunning()) { - std::vector tokens(512); - hsql::SQLParser::tokenize(query, &tokens); - } -} - -void BM_ParseBenchmark(benchmark::State& st, const std::string& query) { - st.counters["num_tokens"] = getNumTokens(query); - st.counters["num_chars"] = query.size(); - - while (st.KeepRunning()) { - hsql::SQLParserResult result; - hsql::SQLParser::parse(query, &result); - if (!result.isValid()) { - std::cout << query << std::endl; - std::cout << result.errorMsg() << std::endl; - st.SkipWithError("Parsing failed!"); - } - } -} - -std::string readFileContents(const std::string& file_path) { - std::ifstream t(file_path.c_str()); - std::string text((std::istreambuf_iterator(t)), - std::istreambuf_iterator()); - return text; -} diff --git a/extern/hyrise_sql_parser/benchmark/benchmark_utils.h b/extern/hyrise_sql_parser/benchmark/benchmark_utils.h deleted file mode 100644 index 7eb54d8090..0000000000 --- a/extern/hyrise_sql_parser/benchmark/benchmark_utils.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __BENCHMARK_UTILS_H__ -#define __BENCHMARK_UTILS_H__ - -#include "benchmark/benchmark.h" - -size_t getNumTokens(const std::string& query); - -void BM_TokenizeBenchmark(benchmark::State& st, const std::string& query); - -void BM_ParseBenchmark(benchmark::State& st, const std::string& query); - -std::string readFileContents(const std::string& file_path); - - - - -#define TIME_DIFF(end, start)\ - std::chrono::duration_cast>(end - start); - -#define NOW()\ - std::chrono::high_resolution_clock::now(); - -#define PARSE_QUERY_BENCHMARK(name, query)\ - static void name(benchmark::State& st) {\ - BM_ParseBenchmark(st, query);\ - }\ - BENCHMARK(name); - -#define TOKENIZE_QUERY_BENCHMARK(name, query)\ - static void name(benchmark::State& st) {\ - BM_TokenizeBenchmark(st, query);\ - }\ - BENCHMARK(name); - - -#define BENCHMARK_QUERY(test_name, query)\ - TOKENIZE_QUERY_BENCHMARK(test_name##Tokenize, query)\ - PARSE_QUERY_BENCHMARK(test_name##Parse, query) - - -#endif \ No newline at end of file diff --git a/extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp b/extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp deleted file mode 100644 index 47928f0a7b..0000000000 --- a/extern/hyrise_sql_parser/benchmark/parser_benchmark.cpp +++ /dev/null @@ -1,87 +0,0 @@ - -#include -#include -#include "benchmark/benchmark.h" - -#include "SQLParser.h" -#include "parser/bison_parser.h" -#include "parser/flex_lexer.h" - -#include "benchmark_utils.h" - -// Benchmark the influence of increasing size of the query, while -// the number of tokens remains unchanged. -static void BM_CharacterCount(benchmark::State& st) { - const size_t querySize = st.range(0); - - // Base query has size of 18 characters. - std::string query = "SELECT %name% FROM test;"; - - const uint pad = querySize - 18; - const std::string filler = std::string(pad, 'a'); - query.replace(7, 6, filler); - - st.counters["num_tokens"] = getNumTokens(query); - st.counters["num_chars"] = query.size(); - while (st.KeepRunning()) { - hsql::SQLParserResult result; - hsql::SQLParser::parse(query, &result); - } -} -BENCHMARK(BM_CharacterCount) - ->RangeMultiplier(1 << 2) - ->Ranges({{1 << 5, 1 << 15}, - {5, 5}}); - -// Benchmark the influence of increasing number of tokens, while -// the number of characters remains unchanged. -static void BM_ConditionalTokens(benchmark::State& st) { - const size_t targetSize = st.range(0); - const size_t numTokens = st.range(1); - - // Base query contains 6 tokens. - std::string query = "SELECT * FROM test"; - - // Create conditional. - std::stringstream condStream; - size_t missingTokens = numTokens - 4; - if (missingTokens > 0) { - condStream << " WHERE a"; - missingTokens -= 2; - - while (missingTokens > 0) { - condStream << " AND a"; - missingTokens -= 2; - } - } - - query += condStream.str(); - - if (targetSize >= query.size()) { - const size_t pad = targetSize - query.size(); - const std::string filler = std::string(pad, 'a'); - query.replace(7, 1, filler); - - } else { - // Query can't be the same length as in the other benchmarks. - // Running this will result in unusable data. - fprintf(stderr, "Too many tokens. Query too long for benchmark char limit (%lu > %lu).\n", - query.size(), targetSize); - return; - } - - st.counters["num_tokens"] = getNumTokens(query); - st.counters["num_chars"] = query.size(); - while (st.KeepRunning()) { - hsql::SQLParserResult result; - hsql::SQLParser::parse(query, &result); - if (!result.isValid()) st.SkipWithError("Parsing failed!"); - } -} -BENCHMARK(BM_ConditionalTokens) - ->RangeMultiplier(1 << 2) - ->Ranges({{1 << 14, 1 << 14}, - {1 << 2, 1 << 11}}); - - - diff --git a/extern/hyrise_sql_parser/benchmark/queries.cpp b/extern/hyrise_sql_parser/benchmark/queries.cpp deleted file mode 100644 index f26187d4d3..0000000000 --- a/extern/hyrise_sql_parser/benchmark/queries.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "queries.h" - -#include -#include -#include -#include - -#include "benchmark_utils.h" - -namespace filesystem = std::filesystem; - -std::string getQueryName(unsigned i) { - if (sql_queries[i].first.empty()) { - std::string name = "#" + std::to_string(i + 1); - return name; - } - return std::string("") + sql_queries[i].first; -} - -std::vector getQueriesFromDirectory(const std::string& dir_path) { - std::regex query_file_regex("\\.sql$"); - std::vector files; - - for (auto& entry : filesystem::directory_iterator(dir_path)) { - if (filesystem::is_regular_file(entry)) { - std::string path_str = filesystem::path(entry); - - if (std::regex_search(path_str, query_file_regex)) { - files.push_back(path_str); - } - } - } - - std::sort(files.begin(), files.end()); - - std::vector queries; - for (const std::string& file_path : files) { - const filesystem::path p(file_path); - const std::string query = readFileContents(file_path); - queries.emplace_back(p.filename(), query); - } - return queries; -} - -std::vector getTPCHQueries() { - return getQueriesFromDirectory("test/queries/"); -} diff --git a/extern/hyrise_sql_parser/benchmark/queries.h b/extern/hyrise_sql_parser/benchmark/queries.h deleted file mode 100644 index 357bee61fc..0000000000 --- a/extern/hyrise_sql_parser/benchmark/queries.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __QUERIES_H__ -#define __QUERIES_H__ - -#include -#include - -typedef std::pair SQLQuery; - -// name, query -static std::vector sql_queries = { - {"Q1", "SELECT * FROM test;"}, - {"Q2", "SELECT a, b AS address FROM (SELECT * FROM test WHERE c < 100 AND b > 3) t1 WHERE a < 10 AND b < 100;"}, - {"Q3", "SELECT \"left\".a, \"left\".b, \"right\".a, \"right\".b FROM table_a AS \"left\" JOIN table_b AS \"right\" ON \"left\".a = \"right\".a;"}, - {"Q4", "" -"SELECT" -" l_orderkey," -" SUM(l_extendedprice * (1 - l_discount)) AS revenue," -" o_orderdate," -" o_shippriority" -" FROM" -" customer," -" orders," -" lineitem" -" WHERE" -" c_mktsegment = '%s'" -" and c_custkey = o_custkey" -" and l_orderkey = o_orderkey" -" and o_orderdate < '%s'" -" and l_shipdate > '%s'" -" GROUP BY" -" l_orderkey," -" o_orderdate," -" o_shippriority" -" ORDER BY" -" revenue DESC," -" o_orderdate;" -}, - - {"LongSelectList26", "SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;"}, - {"LongSelectElement26", "SELECT abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy FROM test;"}, - {"LongSelectList52", "SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;"}, - {"LongSelectElement52", "SELECT abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy FROM test;"}, - {"TwoSelects", "SELECT * FROM test; SELECT age, street AS address FROM data;"}, - {"ExecuteNoParams", "EXECUTE procedure;"}, - {"Execute2Params", "EXECUTE procedure(11, 'test');"}, - {"Execute10Params", "EXECUTE procedure(11, 'test', 5.6, 4.2, 'abc', 6, 7, 8, 9, 10000);"}, - // {"name", "query"}, -}; - -std::string getQueryName(unsigned i); - -std::vector getQueriesFromDirectory(const std::string& dir_path); - -std::vector getTPCHQueries(); - -#endif diff --git a/extern/hyrise_sql_parser/docs/.gitignore b/extern/hyrise_sql_parser/docs/.gitignore deleted file mode 100644 index a3925495ee..0000000000 --- a/extern/hyrise_sql_parser/docs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -__doxygen__/ \ No newline at end of file diff --git a/extern/hyrise_sql_parser/docs/README.md b/extern/hyrise_sql_parser/docs/README.md deleted file mode 100644 index 81d1e117c9..0000000000 --- a/extern/hyrise_sql_parser/docs/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Documentation -============= - -Internal Links: - - * [Developer Documentation](dev-docs.md) - * [Supported SQL Queries](syntax-support.md) - * [Known Limitations & Missing Features](known-limitations.md) - * [Basic Usage](basic-usage.md) - - -External Resources: - - * [Original Dev-Paper (2015)](http://torpedro.com/paper/HyriseSQL-03-2015.pdf) diff --git a/extern/hyrise_sql_parser/docs/basic-usage.md b/extern/hyrise_sql_parser/docs/basic-usage.md deleted file mode 100644 index 350ff59b22..0000000000 --- a/extern/hyrise_sql_parser/docs/basic-usage.md +++ /dev/null @@ -1,70 +0,0 @@ -Using the Library -======================= - -Using the SQL parser library is very simple. First step will be to download and build the library. Either get the latest sources from the repository or download the latest release. The only requirement is a modern C++ compiler. Versions that are definitely working are gcc 4.8 and clang 3.4, but older versions might work also or only need small modifications. To build it simply go into the directory and run - -``` -make # creates libsqlparser.so -make install # copies the library to /usr/local/lib/ -``` -To include it in your own code you only need to include one header file: SQLParser.h. The entire framework is wrapped in the namespace hsql. To parse a SQL string you have to call the static method `hsql::SQLParser::parseSQLString(std::string query)`. - -The `parseSQLString` method will return an object of type `SQLParserResult*`. When the query was valid SQL the result will contain a list of `SQLStatement` objects that represent the statements in your query. To check whether the query was valid, you can check the `result->isValid` flag. The successfully parsed statements are stored at `result->statements` which is of type `std::vector`. - -This is a list of the currently available statement types, each being a subclass of `SQLStatement`: - -``` -CreateStatement -DeleteStatement -DropStatement -ExecuteStatement -ImportStatement -PrepareStatement -SelectStatement -UpdateStatement -``` - -To find out what type of statement a certain `SQLStatement` is, you can check the `stmt->type()`, which will return an enum value. This `enum StatementType` is defined in `SQLStatement.h`. There you can see all the available values. Some of these do not match to statement classes though, because they are not implemented yet. - -Probably the best way to get familiar with the properties is to look at the class definitions itself in the repository here. The statement definitions are simply structs holding the data from the query. You could also take a look at the utility code in `sqlhelper.cpp` which contains code that prints information about statements to the console. - -## Example Code - -example.cpp - -``` -// include the sql parser -#include "SQLParser.h" - -int main(int argc, char *argv[]) { - if (argc <= 1) { - fprintf(stderr, "Usage: ./example \"SELECT * FROM test;\"\n"); - return -1; - } - std::string query = argv[1]; - - // parse a given query - hsql::SQLParserResult* result = hsql::SQLParser::parseSQLString(query); - - // check whether the parsing was successful - if (result->isValid) { - printf("Parsed successfully!\n"); - printf("Number of statements: %lu\n", result->size()); - // process the statements... - } else { - printf("The SQL string is invalid!\n"); - return -1; - } - - return 0; -} -``` - -Makefile - -``` -CFLAGS = -std=c++11 -lstdc++ -Wall -I../src/ -L../ - -all: - $(CXX) $(CFLAGS) example.cpp -o example -lsqlparser -``` diff --git a/extern/hyrise_sql_parser/docs/dev-docs.md b/extern/hyrise_sql_parser/docs/dev-docs.md deleted file mode 100644 index 00050dd065..0000000000 --- a/extern/hyrise_sql_parser/docs/dev-docs.md +++ /dev/null @@ -1,63 +0,0 @@ -Developer Documentation -======================= - -## Basic Requirements - -**Requirements for development:** - * gcc 4.8+ (or clang 3.4+) - * [bison](https://www.gnu.org/software/bison/) (v3.0.2+) - * [flex](http://flex.sourceforge.net/) (v2.5.5+) - -First step to extending this parser is cloning the repository `git clone git@github.com:hyrise/sql-parser.git` and making sure everything works by running the following steps: - -```bash -make parser # builds the bison parser and flex lexer -make library # builds the libsqlparser.so -make test # runs the tests with the library -``` - -Rerun these steps whenever you change part of the parse. To execute the entire pipeline automatically you can run: - -```bash -make cleanall # cleans the parser build and library build -make test # build parser, library and runs the tests -``` - - -## Developing New Functionality - -This section contains information about how to extend this parser with new functionalities. - - -### Implementing a new Statement - -Create a new file and class in `src/sql/` or extend any of the existing Statements. Every statement needs to have the base class SQLStatement and needs to call its super constructor with its type. If you're defining a new statement type, you need to define a new StatementType in `SQLStatement.h`. - -It is important that you create an appropriate constructor for your statement that zero-initializes all its pointer variables and that you create an appropriate destructor. - -Finally you will need to include your new file in `src/sql/statements.h`. - - -### Extending the Grammar - -Related files: -``` -src/parser/bison_parser.y -src/parser/flex_lexer.l -src/parser/keywordlist_generator.py -src/parser/sql_keywords.txt -``` - -To extend the grammar the file you will mostly have to deal with is the bison grammar definition in `src/parser/bison_parser.y`. - -If you're extending an existing statement, skip to the non-terminal definition for that statement. I.e. for an InsertStatement the non-terminal insert_statement. - -If you're defining a new statement, you will need to define your type in the \%union directive `hsql::ExampleStatement example_stmt`. Next you need to associate this type with a non-terminal `\%type example_statement`. Then you have to define the non-terminal `example_statement`. Look the other non-terminals for statements to figure out how. - - - -## Implementing Tests - -All test related files are in `test/`. Take a look to see how tests are implemented. - - diff --git a/extern/hyrise_sql_parser/docs/known-limitations.md b/extern/hyrise_sql_parser/docs/known-limitations.md deleted file mode 100644 index 0c91b044ab..0000000000 --- a/extern/hyrise_sql_parser/docs/known-limitations.md +++ /dev/null @@ -1,18 +0,0 @@ -Known Limitations & Missing Features -==================================== - -This page contains an overview of known missing limitations and missing features in our SQL parser project. In general, we would like to see all of these features being supported at some point. If you are particularly interested in a specific feature, feel free to contribute to this project through a pull request. - -### Completely Missing Statement Types - - * EXPLAIN - * EXPORT - * RENAME - * ALTER - -Additionally, there are a lot of statement types that are specific to certain database systems. Supporting all of these is not on our roadmap, but if someone implements support for such a statement, we can also integrate it. - -### Other SQL Limitations - - * Tables names ignore the schema name (see grammar rule `table_name`). This affects, for example, `INSERT, IMPORT, DROP, DELETE`. - * Column data types only support `INT, DOUBLE, TEXT`. diff --git a/extern/hyrise_sql_parser/docs/syntax-support.md b/extern/hyrise_sql_parser/docs/syntax-support.md deleted file mode 100644 index 59d08b9404..0000000000 --- a/extern/hyrise_sql_parser/docs/syntax-support.md +++ /dev/null @@ -1,53 +0,0 @@ -Supported SQL Queries -===================== - -This page contains a short list of queries that can be correctly parsed with our parser. If you are interested in finding out if a certain feature is supported, it is probably the easiest to checkout the repository and try the example project or check our [list of known limitations](known-limitations.md). Also the file [queries-good.sql](../test/queries/queries-good.sql) shows a list of queries which are parsable with the current version. - - -## Select Statements - -We implement a broad support for the most common elements for `SELECT` statements. Following are a few examples of basic constructs that are supported. - -```sql -SELECT name, city, * - FROM students AS t1 JOIN students AS t2 ON t1.city = t2.city - WHERE t1.grade < 2.0 AND - t2.grade > 2.0 AND - t1.city = 'Frohnau' - ORDER BY t1.grade DESC; - -SELECT city, AVG(grade) AS average, - MIN(grade) AS best, MAX(grade) AS worst - FROM students - GROUP BY city; -``` - -## Data Definition & Modification - -**Create Tables** -```sql -CREATE TABLE students ( - name TEXT, - student_number INTEGER, - city TEXT, - grade DOUBLE -); -``` - -**Update and Delete** -```sql -UPDATE students SET name='Max Mustermann' WHERE name = 'Ralf Mustermann'; - -DELETE FROM students WHERE name = 'Max Mustermann'; -``` - - -## Prepared Statements - -The definition and execution of prepared statements is supported using the following syntax. - -```sql -PREPARE select_test FROM 'SELECT * FROM customer WHERE c_name = ?;'; - -EXECUTE select_test('Max Mustermann'); -``` diff --git a/extern/hyrise_sql_parser/docs/technical_documentation.pdf b/extern/hyrise_sql_parser/docs/technical_documentation.pdf deleted file mode 100644 index 1a3cf62263a90d12e1f589e47b71be82460a5786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284530 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%0DI0x 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 z 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 LSXI^4-;E0ZvpzGV diff --git a/extern/hyrise_sql_parser/example/.gitignore b/extern/hyrise_sql_parser/example/.gitignore deleted file mode 100644 index 96236f8158..0000000000 --- a/extern/hyrise_sql_parser/example/.gitignore +++ /dev/null @@ -1 +0,0 @@ -example \ No newline at end of file diff --git a/extern/hyrise_sql_parser/example/Makefile b/extern/hyrise_sql_parser/example/Makefile deleted file mode 100644 index 387b553efb..0000000000 --- a/extern/hyrise_sql_parser/example/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -CFLAGS = -std=c++1z -lstdc++ -Wall -Werror -I../src/ -L../ - -all: - $(CXX) $(CFLAGS) example.cpp -o example -lsqlparser - diff --git a/extern/hyrise_sql_parser/example/example.cpp b/extern/hyrise_sql_parser/example/example.cpp deleted file mode 100644 index 943de4b259..0000000000 --- a/extern/hyrise_sql_parser/example/example.cpp +++ /dev/null @@ -1,41 +0,0 @@ - -#include -#include - -// include the sql parser -#include "SQLParser.h" - -// contains printing utilities -#include "util/sqlhelper.h" - -int main(int argc, char* argv[]) { - if (argc <= 1) { - fprintf(stderr, "Usage: ./example \"SELECT * FROM test;\"\n"); - return -1; - } - std::string query = argv[1]; - - // parse a given query - hsql::SQLParserResult result; - hsql::SQLParser::parse(query, &result); - - // check whether the parsing was successful - - if (result.isValid()) { - printf("Parsed successfully!\n"); - printf("Number of statements: %lu\n", result.size()); - - for (auto i = 0u; i < result.size(); ++i) { - // Print a statement summary. - hsql::printStatementInfo(result.getStatement(i)); - } - return 0; - } else { - fprintf(stderr, "Given string is not a valid SQL query.\n"); - fprintf(stderr, "%s (L%d:%d)\n", - result.errorMsg(), - result.errorLine(), - result.errorColumn()); - return -1; - } -} diff --git a/extern/hyrise_sql_parser/format.sh b/extern/hyrise_sql_parser/format.sh deleted file mode 100644 index 2d6d545bdf..0000000000 --- a/extern/hyrise_sql_parser/format.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -unamestr=$(uname) -if [[ "$unamestr" == 'Darwin' ]]; then - clang_format="$(brew --prefix llvm)/bin/clang-format" - format_cmd="$clang_format -i -style=file '{}'" -elif [[ "$unamestr" == 'Linux' ]]; then - format_cmd="clang-format -i -style=file '{}'" -fi - -source_regex="^(src|test).*\.(cpp|h|y)" - -if [ "${1}" = "all" ]; then - find src test | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" -elif [ "$1" = "modified" ]; then - # Run on all changed as well as untracked cpp/hpp files, as compared to the current HEAD. Skip deleted files. - { git diff --diff-filter=d --name-only & git ls-files --others --exclude-standard; } | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" -elif [ "$1" = "staged" ]; then - # Run on all files that are staged to be committed. - git diff --diff-filter=d --cached --name-only | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" -else - # Run on all changed as well as untracked cpp/hpp files, as compared to the current main. Skip deleted files. - { git diff --diff-filter=d --name-only main & git ls-files --others --exclude-standard; } | grep -E "$source_regex" | xargs -I{} sh -c "${format_cmd}" -fi diff --git a/extern/hyrise_sql_parser/src/SQLParser.cpp b/extern/hyrise_sql_parser/src/SQLParser.cpp deleted file mode 100644 index b3bf0dfe11..0000000000 --- a/extern/hyrise_sql_parser/src/SQLParser.cpp +++ /dev/null @@ -1,74 +0,0 @@ - -#include "SQLParser.h" -#include -#include -#include "parser/bison_parser.h" -#include "parser/flex_lexer.h" - -namespace hsql { - -SQLParser::SQLParser() { fprintf(stderr, "SQLParser only has static methods atm! Do not initialize!\n"); } - -// static -bool SQLParser::parse(const std::string& sql, SQLParserResult* result) { - yyscan_t scanner; - YY_BUFFER_STATE state; - - if (hsql_lex_init(&scanner)) { - // Couldn't initialize the lexer. - fprintf(stderr, "SQLParser: Error when initializing lexer!\n"); - return false; - } - const char* text = sql.c_str(); - state = hsql__scan_string(text, scanner); - - // Parse the tokens. - // If parsing fails, the result will contain an error object. - int ret = hsql_parse(result, scanner); - bool success = (ret == 0); - result->setIsValid(success); - - hsql__delete_buffer(state, scanner); - hsql_lex_destroy(scanner); - - return true; -} - -// static -bool SQLParser::parseSQLString(const char* sql, SQLParserResult* result) { return parse(sql, result); } - -bool SQLParser::parseSQLString(const std::string& sql, SQLParserResult* result) { return parse(sql, result); } - -// static -bool SQLParser::tokenize(const std::string& sql, std::vector* tokens) { - // Initialize the scanner. - yyscan_t scanner; - if (hsql_lex_init(&scanner)) { - fprintf(stderr, "SQLParser: Error when initializing lexer!\n"); - return false; - } - - YY_BUFFER_STATE state; - state = hsql__scan_string(sql.c_str(), scanner); - - YYSTYPE yylval; - YYLTYPE yylloc; - - // Step through the string until EOF is read. - // Note: hsql_lex returns int, but we know that its range is within 16 bit. - int16_t token = hsql_lex(&yylval, &yylloc, scanner); - while (token != 0) { - tokens->push_back(token); - token = hsql_lex(&yylval, &yylloc, scanner); - - if (token == SQL_IDENTIFIER || token == SQL_STRING) { - free(yylval.sval); - } - } - - hsql__delete_buffer(state, scanner); - hsql_lex_destroy(scanner); - return true; -} - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/SQLParser.h b/extern/hyrise_sql_parser/src/SQLParser.h deleted file mode 100644 index 707ba8ea34..0000000000 --- a/extern/hyrise_sql_parser/src/SQLParser.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef SQLPARSER_SQLPARSER_H -#define SQLPARSER_SQLPARSER_H - -#include "SQLParserResult.h" -#include "sql/statements.h" - -namespace hsql { - -// Static methods used to parse SQL strings. -class SQLParser { - public: - // Parses a given constant character SQL string into the result object. - // Returns true if the lexer and parser could run without internal errors. - // This does NOT mean that the SQL string was valid SQL. To check that - // you need to check result->isValid(); - static bool parse(const std::string& sql, SQLParserResult* result); - - // Run tokenization on the given string and store the tokens in the output vector. - static bool tokenize(const std::string& sql, std::vector* tokens); - - // Deprecated. - // Old method to parse SQL strings. Replaced by parse(). - static bool parseSQLString(const char* sql, SQLParserResult* result); - - // Deprecated. - // Old method to parse SQL strings. Replaced by parse(). - static bool parseSQLString(const std::string& sql, SQLParserResult* result); - - private: - SQLParser(); -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/SQLParserResult.cpp b/extern/hyrise_sql_parser/src/SQLParserResult.cpp deleted file mode 100644 index b8a43430ef..0000000000 --- a/extern/hyrise_sql_parser/src/SQLParserResult.cpp +++ /dev/null @@ -1,82 +0,0 @@ - -#include "SQLParserResult.h" -#include - -namespace hsql { - -SQLParserResult::SQLParserResult() : isValid_(false), errorMsg_(nullptr) {} - -SQLParserResult::SQLParserResult(SQLStatement* stmt) : isValid_(false), errorMsg_(nullptr) { addStatement(stmt); } - -// Move constructor. -SQLParserResult::SQLParserResult(SQLParserResult&& moved) { *this = std::forward(moved); } - -SQLParserResult& SQLParserResult::operator=(SQLParserResult&& moved) { - isValid_ = moved.isValid_; - errorMsg_ = moved.errorMsg_; - statements_ = std::move(moved.statements_); - - moved.errorMsg_ = nullptr; - moved.reset(); - return *this; -} - -SQLParserResult::~SQLParserResult() { reset(); } - -void SQLParserResult::addStatement(SQLStatement* stmt) { statements_.push_back(stmt); } - -const SQLStatement* SQLParserResult::getStatement(size_t index) const { return statements_[index]; } - -SQLStatement* SQLParserResult::getMutableStatement(size_t index) { return statements_[index]; } - -size_t SQLParserResult::size() const { return statements_.size(); } - -bool SQLParserResult::isValid() const { return isValid_; } - -const char* SQLParserResult::errorMsg() const { return errorMsg_; } - -int SQLParserResult::errorLine() const { return errorLine_; } - -int SQLParserResult::errorColumn() const { return errorColumn_; } - -void SQLParserResult::setIsValid(bool isValid) { isValid_ = isValid; } - -void SQLParserResult::setErrorDetails(char* errorMsg, int errorLine, int errorColumn) { - errorMsg_ = errorMsg; - errorLine_ = errorLine; - errorColumn_ = errorColumn; -} - -const std::vector& SQLParserResult::getStatements() const { return statements_; } - -std::vector SQLParserResult::releaseStatements() { - std::vector copy = statements_; - - statements_.clear(); - - return copy; -} - -void SQLParserResult::reset() { - for (SQLStatement* statement : statements_) { - delete statement; - } - statements_.clear(); - - isValid_ = false; - - free(errorMsg_); - errorMsg_ = nullptr; - errorLine_ = -1; - errorColumn_ = -1; -} - -// Does NOT take ownership. -void SQLParserResult::addParameter(Expr* parameter) { - parameters_.push_back(parameter); - std::sort(parameters_.begin(), parameters_.end(), [](const Expr* a, const Expr* b) { return a->ival < b->ival; }); -} - -const std::vector& SQLParserResult::parameters() { return parameters_; } - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/SQLParserResult.h b/extern/hyrise_sql_parser/src/SQLParserResult.h deleted file mode 100644 index c33bc3d00b..0000000000 --- a/extern/hyrise_sql_parser/src/SQLParserResult.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef SQLPARSER_SQLPARSER_RESULT_H -#define SQLPARSER_SQLPARSER_RESULT_H - -#include "sql/SQLStatement.h" - -namespace hsql { -// Represents the result of the SQLParser. -// If parsing was successful it contains a list of SQLStatement. -class SQLParserResult { - public: - // Initialize with empty statement list. - SQLParserResult(); - - // Initialize with a single statement. - // Takes ownership of the statement. - SQLParserResult(SQLStatement* stmt); - - // Move constructor. - SQLParserResult(SQLParserResult&& moved); - SQLParserResult& operator=(SQLParserResult&& moved); - - // Deletes all statements in the result. - virtual ~SQLParserResult(); - - // Set whether parsing was successful. - void setIsValid(bool isValid); - - // Returns true if parsing was successful. - bool isValid() const; - - // Returns the number of statements in the result. - size_t size() const; - - // Set the details of the error, if available. - // Takes ownership of errorMsg. - void setErrorDetails(char* errorMsg, int errorLine, int errorColumn); - - // Returns the error message, if an error occurred. - const char* errorMsg() const; - - // Returns the line number of the occurrance of the error in the query. - int errorLine() const; - - // Returns the column number of the occurrance of the error in the query. - int errorColumn() const; - - // Adds a statement to the result list of statements. - // SQLParserResult takes ownership of the statement. - void addStatement(SQLStatement* stmt); - - // Gets the SQL statement with the given index. - const SQLStatement* getStatement(size_t index) const; - - // Gets the non const SQL statement with the given index. - SQLStatement* getMutableStatement(size_t index); - - // Get the list of all statements. - const std::vector& getStatements() const; - - // Returns a copy of the list of all statements in this result. - // Removes them from this result. - std::vector releaseStatements(); - - // Deletes all statements and other data within the result. - void reset(); - - // Does NOT take ownership. - void addParameter(Expr* parameter); - - const std::vector& parameters(); - - private: - // List of statements within the result. - std::vector statements_; - - // Flag indicating the parsing was successful. - bool isValid_; - - // Error message, if an error occurred. - char* errorMsg_; - - // Line number of the occurrance of the error in the query. - int errorLine_; - - // Column number of the occurrance of the error in the query. - int errorColumn_; - - // Does NOT have ownership. - std::vector parameters_; -}; - -} // namespace hsql - -#endif // SQLPARSER_SQLPARSER_RESULT_H diff --git a/extern/hyrise_sql_parser/src/parser/.gitignore b/extern/hyrise_sql_parser/src/parser/.gitignore deleted file mode 100644 index 1c0c561385..0000000000 --- a/extern/hyrise_sql_parser/src/parser/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.output -conflict_test.cpp \ No newline at end of file diff --git a/extern/hyrise_sql_parser/src/parser/Makefile b/extern/hyrise_sql_parser/src/parser/Makefile deleted file mode 100644 index 1a9d70d6cc..0000000000 --- a/extern/hyrise_sql_parser/src/parser/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# bison's version is too old on OSX, allow user to pass in custom path -BISON?=bison -FLEX?=flex - -OS_TYPE=$(shell uname) -ifeq ($(OS_TYPE), Darwin) -BREW_PREFIX=$(shell brew --prefix) -BREW_INSTALLED=$(shell echo $(BREW_PREFIX) | wc -w | xargs) -ifeq ($(BREW_INSTALLED), 0) -$(error On macOS, Homebrew (see https://brew.sh) is required to install recent Bison and Flex versions) -endif -endif - -BISON_VERSION=$(shell $(BISON) --version | head -n 1 | grep -o '[0-9]\.[0-9]\+') -BISON_VERSION_SUPPORTED=$(shell awk -v a=$(BISON_VERSION) -v b="3.0" 'BEGIN { print (a >= b) ? 1 : 0 }') -ifneq ($(BISON_VERSION_SUPPORTED), 1) -$(error Bison version $(BISON_VERSION) not supported. If you are using macOS, `bison` uses the system default instead of the brew version. Run BISON=$(BREW_PREFIX)/opt/bison/bin/bison make) -endif - -FLEX_VERSION=$(shell $(FLEX) --version | head -n 1 | grep -o '[0-9]\.[0-9]\+') -FLEX_VERSION_SUPPORTED=$(shell awk -v a=$(FLEX_VERSION) -v b="2.6" 'BEGIN { print (a >= b) ? 1 : 0 }') -ifneq ($(FLEX_VERSION_SUPPORTED), 1) -$(error Flex version $(FLEX_VERSION) not supported. If you are using macOS, `flex` uses the system default instead of the brew version. Run FLEX=$(BREW_PREFIX)/opt/flex/bin/flex make) -endif - -all: bison_parser.cpp flex_lexer.cpp - -bison_parser.cpp: bison_parser.y - $(BISON) bison_parser.y --output=bison_parser.cpp --defines=bison_parser.h --verbose - -flex_lexer.cpp: flex_lexer.l - ! $(FLEX) flex_lexer.l 2>&1 | grep "warning" - -clean: - rm -f bison_parser.cpp flex_lexer.cpp bison_parser.h flex_lexer.h *.output - -# Tests if the parser builds correctly and doesn't contain conflicts. -test: - ! $(BISON) bison_parser.y -v --output=conflict_test.cpp 2>&1 | grep "conflict" >&2 diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.cpp b/extern/hyrise_sql_parser/src/parser/bison_parser.cpp deleted file mode 100644 index 264894883c..0000000000 --- a/extern/hyrise_sql_parser/src/parser/bison_parser.cpp +++ /dev/null @@ -1,6300 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.7.4. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, - Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, - especially those whose name start with YY_ or yy_. They are - private implementation details that can be changed or removed. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output, and Bison version. */ -#define YYBISON 30704 - -/* Bison version string. */ -#define YYBISON_VERSION "3.7.4" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 2 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - -/* Substitute the type names. */ -#define YYSTYPE HSQL_STYPE -#define YYLTYPE HSQL_LTYPE -/* Substitute the variable and function names. */ -#define yyparse hsql_parse -#define yylex hsql_lex -#define yyerror hsql_error -#define yydebug hsql_debug -#define yynerrs hsql_nerrs - -/* First part of user prologue. */ -#line 2 "bison_parser.y" - -/** - * bison_parser.y - * defines bison_parser.h - * outputs bison_parser.c - * - * Grammar File Spec: http://dinosaur.compilertools.net/bison/bison_6.html - * - */ -/********************************* - ** Section 1: C Declarations - *********************************/ - -// clang-format on -#include "bison_parser.h" -#include "flex_lexer.h" - -#include -#include - -using namespace hsql; - -int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const char* msg) { - result->setIsValid(false); - result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); - return 0; -} -// clang-format off - -#line 109 "bison_parser.cpp" - -# ifndef YY_CAST -# ifdef __cplusplus -# define YY_CAST(Type, Val) static_cast (Val) -# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) -# else -# define YY_CAST(Type, Val) ((Type) (Val)) -# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) -# endif -# endif -# ifndef YY_NULLPTR -# if defined __cplusplus -# if 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# else -# define YY_NULLPTR ((void*)0) -# endif -# endif - -#include "bison_parser.h" -/* Symbol kind. */ -enum yysymbol_kind_t -{ - YYSYMBOL_YYEMPTY = -2, - YYSYMBOL_YYEOF = 0, /* "end of file" */ - YYSYMBOL_YYerror = 1, /* error */ - YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ - YYSYMBOL_IDENTIFIER = 3, /* IDENTIFIER */ - YYSYMBOL_STRING = 4, /* STRING */ - YYSYMBOL_BIGINTVAL = 5, /* BIGINTVAL */ - YYSYMBOL_FLOATVAL = 6, /* FLOATVAL */ - YYSYMBOL_INTVAL = 7, /* INTVAL */ - YYSYMBOL_NULLSAFEEQUALS = 8, /* NULLSAFEEQUALS */ - YYSYMBOL_DEALLOCATE = 9, /* DEALLOCATE */ - YYSYMBOL_PARAMETERS = 10, /* PARAMETERS */ - YYSYMBOL_INTERSECT = 11, /* INTERSECT */ - YYSYMBOL_TEMPORARY = 12, /* TEMPORARY */ - YYSYMBOL_TIMESTAMP = 13, /* TIMESTAMP */ - YYSYMBOL_DISTINCT = 14, /* DISTINCT */ - YYSYMBOL_NVARCHAR = 15, /* NVARCHAR */ - YYSYMBOL_RESTRICT = 16, /* RESTRICT */ - YYSYMBOL_TRUNCATE = 17, /* TRUNCATE */ - YYSYMBOL_ANALYZE = 18, /* ANALYZE */ - YYSYMBOL_BETWEEN = 19, /* BETWEEN */ - YYSYMBOL_CASCADE = 20, /* CASCADE */ - YYSYMBOL_COLUMNS = 21, /* COLUMNS */ - YYSYMBOL_CONTROL = 22, /* CONTROL */ - YYSYMBOL_DEFAULT = 23, /* DEFAULT */ - YYSYMBOL_EXECUTE = 24, /* EXECUTE */ - YYSYMBOL_EXPLAIN = 25, /* EXPLAIN */ - YYSYMBOL_ENCODING = 26, /* ENCODING */ - YYSYMBOL_INTEGER = 27, /* INTEGER */ - YYSYMBOL_NATURAL = 28, /* NATURAL */ - YYSYMBOL_PREPARE = 29, /* PREPARE */ - YYSYMBOL_SCHEMAS = 30, /* SCHEMAS */ - YYSYMBOL_CHARACTER_VARYING = 31, /* CHARACTER_VARYING */ - YYSYMBOL_REAL = 32, /* REAL */ - YYSYMBOL_DECIMAL = 33, /* DECIMAL */ - YYSYMBOL_SMALLINT = 34, /* SMALLINT */ - YYSYMBOL_BIGINT = 35, /* BIGINT */ - YYSYMBOL_SPATIAL = 36, /* SPATIAL */ - YYSYMBOL_VARCHAR = 37, /* VARCHAR */ - YYSYMBOL_VIRTUAL = 38, /* VIRTUAL */ - YYSYMBOL_DESCRIBE = 39, /* DESCRIBE */ - YYSYMBOL_BEFORE = 40, /* BEFORE */ - YYSYMBOL_COLUMN = 41, /* COLUMN */ - YYSYMBOL_CREATE = 42, /* CREATE */ - YYSYMBOL_DELETE = 43, /* DELETE */ - YYSYMBOL_DIRECT = 44, /* DIRECT */ - YYSYMBOL_DOUBLE = 45, /* DOUBLE */ - YYSYMBOL_ESCAPE = 46, /* ESCAPE */ - YYSYMBOL_EXCEPT = 47, /* EXCEPT */ - YYSYMBOL_EXISTS = 48, /* EXISTS */ - YYSYMBOL_EXTRACT = 49, /* EXTRACT */ - YYSYMBOL_CAST = 50, /* CAST */ - YYSYMBOL_FORMAT = 51, /* FORMAT */ - YYSYMBOL_GLOBAL = 52, /* GLOBAL */ - YYSYMBOL_HAVING = 53, /* HAVING */ - YYSYMBOL_IMPORT = 54, /* IMPORT */ - YYSYMBOL_INSERT = 55, /* INSERT */ - YYSYMBOL_ISNULL = 56, /* ISNULL */ - YYSYMBOL_OFFSET = 57, /* OFFSET */ - YYSYMBOL_RENAME = 58, /* RENAME */ - YYSYMBOL_SCHEMA = 59, /* SCHEMA */ - YYSYMBOL_SELECT = 60, /* SELECT */ - YYSYMBOL_SORTED = 61, /* SORTED */ - YYSYMBOL_TABLES = 62, /* TABLES */ - YYSYMBOL_UNLOAD = 63, /* UNLOAD */ - YYSYMBOL_UPDATE = 64, /* UPDATE */ - YYSYMBOL_VALUES = 65, /* VALUES */ - YYSYMBOL_AFTER = 66, /* AFTER */ - YYSYMBOL_ALTER = 67, /* ALTER */ - YYSYMBOL_CROSS = 68, /* CROSS */ - YYSYMBOL_DELTA = 69, /* DELTA */ - YYSYMBOL_FLOAT = 70, /* FLOAT */ - YYSYMBOL_GROUP = 71, /* GROUP */ - YYSYMBOL_INDEX = 72, /* INDEX */ - YYSYMBOL_INNER = 73, /* INNER */ - YYSYMBOL_LIMIT = 74, /* LIMIT */ - YYSYMBOL_LOCAL = 75, /* LOCAL */ - YYSYMBOL_MERGE = 76, /* MERGE */ - YYSYMBOL_MINUS = 77, /* MINUS */ - YYSYMBOL_ORDER = 78, /* ORDER */ - YYSYMBOL_OVER = 79, /* OVER */ - YYSYMBOL_OUTER = 80, /* OUTER */ - YYSYMBOL_RIGHT = 81, /* RIGHT */ - YYSYMBOL_TABLE = 82, /* TABLE */ - YYSYMBOL_UNION = 83, /* UNION */ - YYSYMBOL_USING = 84, /* USING */ - YYSYMBOL_WHERE = 85, /* WHERE */ - YYSYMBOL_CALL = 86, /* CALL */ - YYSYMBOL_CASE = 87, /* CASE */ - YYSYMBOL_CHAR = 88, /* CHAR */ - YYSYMBOL_COPY = 89, /* COPY */ - YYSYMBOL_DATE = 90, /* DATE */ - YYSYMBOL_DATETIME = 91, /* DATETIME */ - YYSYMBOL_DESC = 92, /* DESC */ - YYSYMBOL_DIV = 93, /* DIV */ - YYSYMBOL_DROP = 94, /* DROP */ - YYSYMBOL_ELSE = 95, /* ELSE */ - YYSYMBOL_FILE = 96, /* FILE */ - YYSYMBOL_FROM = 97, /* FROM */ - YYSYMBOL_FULL = 98, /* FULL */ - YYSYMBOL_HASH = 99, /* HASH */ - YYSYMBOL_HINT = 100, /* HINT */ - YYSYMBOL_INTO = 101, /* INTO */ - YYSYMBOL_JOIN = 102, /* JOIN */ - YYSYMBOL_LEFT = 103, /* LEFT */ - YYSYMBOL_LIKE = 104, /* LIKE */ - YYSYMBOL_LOAD = 105, /* LOAD */ - YYSYMBOL_LONG = 106, /* LONG */ - YYSYMBOL_NULL = 107, /* NULL */ - YYSYMBOL_PARTITION = 108, /* PARTITION */ - YYSYMBOL_PLAN = 109, /* PLAN */ - YYSYMBOL_SHOW = 110, /* SHOW */ - YYSYMBOL_TEXT = 111, /* TEXT */ - YYSYMBOL_THEN = 112, /* THEN */ - YYSYMBOL_TIME = 113, /* TIME */ - YYSYMBOL_VIEW = 114, /* VIEW */ - YYSYMBOL_WHEN = 115, /* WHEN */ - YYSYMBOL_WITH = 116, /* WITH */ - YYSYMBOL_ADD = 117, /* ADD */ - YYSYMBOL_ALL = 118, /* ALL */ - YYSYMBOL_AND = 119, /* AND */ - YYSYMBOL_ASC = 120, /* ASC */ - YYSYMBOL_END = 121, /* END */ - YYSYMBOL_FOR = 122, /* FOR */ - YYSYMBOL_INT = 123, /* INT */ - YYSYMBOL_NOT = 124, /* NOT */ - YYSYMBOL_OFF = 125, /* OFF */ - YYSYMBOL_SET = 126, /* SET */ - YYSYMBOL_TOP = 127, /* TOP */ - YYSYMBOL_AS = 128, /* AS */ - YYSYMBOL_BY = 129, /* BY */ - YYSYMBOL_IF = 130, /* IF */ - YYSYMBOL_IN = 131, /* IN */ - YYSYMBOL_IS = 132, /* IS */ - YYSYMBOL_OF = 133, /* OF */ - YYSYMBOL_ON = 134, /* ON */ - YYSYMBOL_OR = 135, /* OR */ - YYSYMBOL_TO = 136, /* TO */ - YYSYMBOL_NO = 137, /* NO */ - YYSYMBOL_ARRAY = 138, /* ARRAY */ - YYSYMBOL_CONCAT = 139, /* CONCAT */ - YYSYMBOL_ILIKE = 140, /* ILIKE */ - YYSYMBOL_MOD = 141, /* MOD */ - YYSYMBOL_SECOND = 142, /* SECOND */ - YYSYMBOL_MINUTE = 143, /* MINUTE */ - YYSYMBOL_HOUR = 144, /* HOUR */ - YYSYMBOL_DAY = 145, /* DAY */ - YYSYMBOL_MONTH = 146, /* MONTH */ - YYSYMBOL_YEAR = 147, /* YEAR */ - YYSYMBOL_SECONDS = 148, /* SECONDS */ - YYSYMBOL_MINUTES = 149, /* MINUTES */ - YYSYMBOL_HOURS = 150, /* HOURS */ - YYSYMBOL_DAYS = 151, /* DAYS */ - YYSYMBOL_MONTHS = 152, /* MONTHS */ - YYSYMBOL_YEARS = 153, /* YEARS */ - YYSYMBOL_INTERVAL = 154, /* INTERVAL */ - YYSYMBOL_TRUE = 155, /* TRUE */ - YYSYMBOL_FALSE = 156, /* FALSE */ - YYSYMBOL_BOOLEAN = 157, /* BOOLEAN */ - YYSYMBOL_TRANSACTION = 158, /* TRANSACTION */ - YYSYMBOL_BEGIN = 159, /* BEGIN */ - YYSYMBOL_COMMIT = 160, /* COMMIT */ - YYSYMBOL_ROLLBACK = 161, /* ROLLBACK */ - YYSYMBOL_NOWAIT = 162, /* NOWAIT */ - YYSYMBOL_SKIP = 163, /* SKIP */ - YYSYMBOL_LOCKED = 164, /* LOCKED */ - YYSYMBOL_SHARE = 165, /* SHARE */ - YYSYMBOL_RANGE = 166, /* RANGE */ - YYSYMBOL_ROWS = 167, /* ROWS */ - YYSYMBOL_GROUPS = 168, /* GROUPS */ - YYSYMBOL_UNBOUNDED = 169, /* UNBOUNDED */ - YYSYMBOL_FOLLOWING = 170, /* FOLLOWING */ - YYSYMBOL_PRECEDING = 171, /* PRECEDING */ - YYSYMBOL_CURRENT_ROW = 172, /* CURRENT_ROW */ - YYSYMBOL_UNIQUE = 173, /* UNIQUE */ - YYSYMBOL_PRIMARY = 174, /* PRIMARY */ - YYSYMBOL_FOREIGN = 175, /* FOREIGN */ - YYSYMBOL_KEY = 176, /* KEY */ - YYSYMBOL_REFERENCES = 177, /* REFERENCES */ - YYSYMBOL_BITSHIFTLEFT = 178, /* BITSHIFTLEFT */ - YYSYMBOL_BITSHIFTRIGHT = 179, /* BITSHIFTRIGHT */ - YYSYMBOL_LOGICALAND = 180, /* LOGICALAND */ - YYSYMBOL_LOGICALOR = 181, /* LOGICALOR */ - YYSYMBOL_182_ = 182, /* '=' */ - YYSYMBOL_EQUALS = 183, /* EQUALS */ - YYSYMBOL_NOTEQUALS = 184, /* NOTEQUALS */ - YYSYMBOL_185_ = 185, /* '<' */ - YYSYMBOL_186_ = 186, /* '>' */ - YYSYMBOL_LESS = 187, /* LESS */ - YYSYMBOL_GREATER = 188, /* GREATER */ - YYSYMBOL_LESSEQ = 189, /* LESSEQ */ - YYSYMBOL_GREATEREQ = 190, /* GREATEREQ */ - YYSYMBOL_NOTNULL = 191, /* NOTNULL */ - YYSYMBOL_192_ = 192, /* '|' */ - YYSYMBOL_193_ = 193, /* '^' */ - YYSYMBOL_194_ = 194, /* '&' */ - YYSYMBOL_195_ = 195, /* '+' */ - YYSYMBOL_196_ = 196, /* '-' */ - YYSYMBOL_197_ = 197, /* '*' */ - YYSYMBOL_198_ = 198, /* '/' */ - YYSYMBOL_199_ = 199, /* '%' */ - YYSYMBOL_UMINUS = 200, /* UMINUS */ - YYSYMBOL_201_ = 201, /* '[' */ - YYSYMBOL_202_ = 202, /* ']' */ - YYSYMBOL_203_ = 203, /* '(' */ - YYSYMBOL_204_ = 204, /* ')' */ - YYSYMBOL_205_ = 205, /* '.' */ - YYSYMBOL_206_ = 206, /* ';' */ - YYSYMBOL_207_ = 207, /* ',' */ - YYSYMBOL_208_ = 208, /* '?' */ - YYSYMBOL_YYACCEPT = 209, /* $accept */ - YYSYMBOL_input = 210, /* input */ - YYSYMBOL_statement_list = 211, /* statement_list */ - YYSYMBOL_statement = 212, /* statement */ - YYSYMBOL_preparable_statement = 213, /* preparable_statement */ - YYSYMBOL_opt_hints = 214, /* opt_hints */ - YYSYMBOL_hint_list = 215, /* hint_list */ - YYSYMBOL_hint = 216, /* hint */ - YYSYMBOL_transaction_statement = 217, /* transaction_statement */ - YYSYMBOL_opt_transaction_keyword = 218, /* opt_transaction_keyword */ - YYSYMBOL_prepare_statement = 219, /* prepare_statement */ - YYSYMBOL_prepare_target_query = 220, /* prepare_target_query */ - YYSYMBOL_execute_statement = 221, /* execute_statement */ - YYSYMBOL_import_statement = 222, /* import_statement */ - YYSYMBOL_file_type = 223, /* file_type */ - YYSYMBOL_file_path = 224, /* file_path */ - YYSYMBOL_opt_import_export_options = 225, /* opt_import_export_options */ - YYSYMBOL_import_export_options = 226, /* import_export_options */ - YYSYMBOL_csv_option = 227, /* csv_option */ - YYSYMBOL_export_statement = 228, /* export_statement */ - YYSYMBOL_show_statement = 229, /* show_statement */ - YYSYMBOL_create_statement = 230, /* create_statement */ - YYSYMBOL_opt_not_exists = 231, /* opt_not_exists */ - YYSYMBOL_table_elem_commalist = 232, /* table_elem_commalist */ - YYSYMBOL_table_elem = 233, /* table_elem */ - YYSYMBOL_column_def = 234, /* column_def */ - YYSYMBOL_column_type = 235, /* column_type */ - YYSYMBOL_opt_time_precision = 236, /* opt_time_precision */ - YYSYMBOL_opt_decimal_specification = 237, /* opt_decimal_specification */ - YYSYMBOL_opt_column_constraints = 238, /* opt_column_constraints */ - YYSYMBOL_column_constraints = 239, /* column_constraints */ - YYSYMBOL_column_constraint = 240, /* column_constraint */ - YYSYMBOL_table_constraint = 241, /* table_constraint */ - YYSYMBOL_references_spec = 242, /* references_spec */ - YYSYMBOL_drop_statement = 243, /* drop_statement */ - YYSYMBOL_opt_exists = 244, /* opt_exists */ - YYSYMBOL_alter_statement = 245, /* alter_statement */ - YYSYMBOL_alter_action = 246, /* alter_action */ - YYSYMBOL_drop_action = 247, /* drop_action */ - YYSYMBOL_delete_statement = 248, /* delete_statement */ - YYSYMBOL_truncate_statement = 249, /* truncate_statement */ - YYSYMBOL_insert_statement = 250, /* insert_statement */ - YYSYMBOL_opt_column_list = 251, /* opt_column_list */ - YYSYMBOL_update_statement = 252, /* update_statement */ - YYSYMBOL_update_clause_commalist = 253, /* update_clause_commalist */ - YYSYMBOL_update_clause = 254, /* update_clause */ - YYSYMBOL_select_statement = 255, /* select_statement */ - YYSYMBOL_select_within_set_operation = 256, /* select_within_set_operation */ - YYSYMBOL_select_within_set_operation_no_parentheses = 257, /* select_within_set_operation_no_parentheses */ - YYSYMBOL_select_with_paren = 258, /* select_with_paren */ - YYSYMBOL_select_no_paren = 259, /* select_no_paren */ - YYSYMBOL_set_operator = 260, /* set_operator */ - YYSYMBOL_set_type = 261, /* set_type */ - YYSYMBOL_opt_all = 262, /* opt_all */ - YYSYMBOL_select_clause = 263, /* select_clause */ - YYSYMBOL_opt_distinct = 264, /* opt_distinct */ - YYSYMBOL_select_list = 265, /* select_list */ - YYSYMBOL_opt_from_clause = 266, /* opt_from_clause */ - YYSYMBOL_from_clause = 267, /* from_clause */ - YYSYMBOL_opt_where = 268, /* opt_where */ - YYSYMBOL_opt_group = 269, /* opt_group */ - YYSYMBOL_opt_having = 270, /* opt_having */ - YYSYMBOL_opt_order = 271, /* opt_order */ - YYSYMBOL_order_list = 272, /* order_list */ - YYSYMBOL_order_desc = 273, /* order_desc */ - YYSYMBOL_opt_order_type = 274, /* opt_order_type */ - YYSYMBOL_opt_null_ordering = 275, /* opt_null_ordering */ - YYSYMBOL_opt_top = 276, /* opt_top */ - YYSYMBOL_opt_limit = 277, /* opt_limit */ - YYSYMBOL_expr_list = 278, /* expr_list */ - YYSYMBOL_opt_extended_literal_list = 279, /* opt_extended_literal_list */ - YYSYMBOL_extended_literal_list = 280, /* extended_literal_list */ - YYSYMBOL_casted_extended_literal = 281, /* casted_extended_literal */ - YYSYMBOL_extended_literal = 282, /* extended_literal */ - YYSYMBOL_expr_alias = 283, /* expr_alias */ - YYSYMBOL_expr = 284, /* expr */ - YYSYMBOL_operand = 285, /* operand */ - YYSYMBOL_scalar_expr = 286, /* scalar_expr */ - YYSYMBOL_unary_expr = 287, /* unary_expr */ - YYSYMBOL_binary_expr = 288, /* binary_expr */ - YYSYMBOL_logic_expr = 289, /* logic_expr */ - YYSYMBOL_in_expr = 290, /* in_expr */ - YYSYMBOL_case_expr = 291, /* case_expr */ - YYSYMBOL_case_list = 292, /* case_list */ - YYSYMBOL_exists_expr = 293, /* exists_expr */ - YYSYMBOL_comp_expr = 294, /* comp_expr */ - YYSYMBOL_function_expr = 295, /* function_expr */ - YYSYMBOL_opt_window = 296, /* opt_window */ - YYSYMBOL_opt_partition = 297, /* opt_partition */ - YYSYMBOL_opt_frame_clause = 298, /* opt_frame_clause */ - YYSYMBOL_frame_type = 299, /* frame_type */ - YYSYMBOL_frame_bound = 300, /* frame_bound */ - YYSYMBOL_extract_expr = 301, /* extract_expr */ - YYSYMBOL_cast_expr = 302, /* cast_expr */ - YYSYMBOL_datetime_field = 303, /* datetime_field */ - YYSYMBOL_datetime_field_plural = 304, /* datetime_field_plural */ - YYSYMBOL_duration_field = 305, /* duration_field */ - YYSYMBOL_array_expr = 306, /* array_expr */ - YYSYMBOL_array_index = 307, /* array_index */ - YYSYMBOL_between_expr = 308, /* between_expr */ - YYSYMBOL_column_name = 309, /* column_name */ - YYSYMBOL_literal = 310, /* literal */ - YYSYMBOL_string_literal = 311, /* string_literal */ - YYSYMBOL_bool_literal = 312, /* bool_literal */ - YYSYMBOL_num_literal = 313, /* num_literal */ - YYSYMBOL_int_literal = 314, /* int_literal */ - YYSYMBOL_null_literal = 315, /* null_literal */ - YYSYMBOL_date_literal = 316, /* date_literal */ - YYSYMBOL_interval_literal = 317, /* interval_literal */ - YYSYMBOL_param_expr = 318, /* param_expr */ - YYSYMBOL_table_ref = 319, /* table_ref */ - YYSYMBOL_table_ref_atomic = 320, /* table_ref_atomic */ - YYSYMBOL_nonjoin_table_ref_atomic = 321, /* nonjoin_table_ref_atomic */ - YYSYMBOL_table_ref_commalist = 322, /* table_ref_commalist */ - YYSYMBOL_table_ref_name = 323, /* table_ref_name */ - YYSYMBOL_table_ref_name_no_alias = 324, /* table_ref_name_no_alias */ - YYSYMBOL_table_name = 325, /* table_name */ - YYSYMBOL_opt_index_name = 326, /* opt_index_name */ - YYSYMBOL_table_alias = 327, /* table_alias */ - YYSYMBOL_opt_table_alias = 328, /* opt_table_alias */ - YYSYMBOL_alias = 329, /* alias */ - YYSYMBOL_opt_alias = 330, /* opt_alias */ - YYSYMBOL_opt_locking_clause = 331, /* opt_locking_clause */ - YYSYMBOL_opt_locking_clause_list = 332, /* opt_locking_clause_list */ - YYSYMBOL_locking_clause = 333, /* locking_clause */ - YYSYMBOL_row_lock_mode = 334, /* row_lock_mode */ - YYSYMBOL_opt_row_lock_policy = 335, /* opt_row_lock_policy */ - YYSYMBOL_opt_with_clause = 336, /* opt_with_clause */ - YYSYMBOL_with_clause = 337, /* with_clause */ - YYSYMBOL_with_description_list = 338, /* with_description_list */ - YYSYMBOL_with_description = 339, /* with_description */ - YYSYMBOL_join_clause = 340, /* join_clause */ - YYSYMBOL_opt_join_type = 341, /* opt_join_type */ - YYSYMBOL_natural_join_type = 342, /* natural_join_type */ - YYSYMBOL_join_condition = 343, /* join_condition */ - YYSYMBOL_ident_commalist = 344 /* ident_commalist */ -}; -typedef enum yysymbol_kind_t yysymbol_kind_t; - - - - -#ifdef short -# undef short -#endif - -/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure - and (if available) are included - so that the code can choose integer types of a good width. */ - -#ifndef __PTRDIFF_MAX__ -# include /* INFRINGES ON USER NAME SPACE */ -# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_STDINT_H -# endif -#endif - -/* Narrow types that promote to a signed type and that can represent a - signed or unsigned integer of at least N bits. In tables they can - save space and decrease cache pressure. Promoting to a signed type - helps avoid bugs in integer arithmetic. */ - -#ifdef __INT_LEAST8_MAX__ -typedef __INT_LEAST8_TYPE__ yytype_int8; -#elif defined YY_STDINT_H -typedef int_least8_t yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef __INT_LEAST16_MAX__ -typedef __INT_LEAST16_TYPE__ yytype_int16; -#elif defined YY_STDINT_H -typedef int_least16_t yytype_int16; -#else -typedef short yytype_int16; -#endif - -#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ -typedef __UINT_LEAST8_TYPE__ yytype_uint8; -#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ - && UINT_LEAST8_MAX <= INT_MAX) -typedef uint_least8_t yytype_uint8; -#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX -typedef unsigned char yytype_uint8; -#else -typedef short yytype_uint8; -#endif - -#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ -typedef __UINT_LEAST16_TYPE__ yytype_uint16; -#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ - && UINT_LEAST16_MAX <= INT_MAX) -typedef uint_least16_t yytype_uint16; -#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX -typedef unsigned short yytype_uint16; -#else -typedef int yytype_uint16; -#endif - -#ifndef YYPTRDIFF_T -# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ -# define YYPTRDIFF_T __PTRDIFF_TYPE__ -# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ -# elif defined PTRDIFF_MAX -# ifndef ptrdiff_t -# include /* INFRINGES ON USER NAME SPACE */ -# endif -# define YYPTRDIFF_T ptrdiff_t -# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX -# else -# define YYPTRDIFF_T long -# define YYPTRDIFF_MAXIMUM LONG_MAX -# endif -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned -# endif -#endif - -#define YYSIZE_MAXIMUM \ - YY_CAST (YYPTRDIFF_T, \ - (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ - ? YYPTRDIFF_MAXIMUM \ - : YY_CAST (YYSIZE_T, -1))) - -#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) - - -/* Stored state numbers (used for stacks). */ -typedef yytype_int16 yy_state_t; - -/* State numbers in computations. */ -typedef int yy_state_fast_t; - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - - -#ifndef YY_ATTRIBUTE_PURE -# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) -# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) -# else -# define YY_ATTRIBUTE_PURE -# endif -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) -# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -# else -# define YY_ATTRIBUTE_UNUSED -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - -#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ -# define YY_IGNORE_USELESS_CAST_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") -# define YY_IGNORE_USELESS_CAST_END \ - _Pragma ("GCC diagnostic pop") -#endif -#ifndef YY_IGNORE_USELESS_CAST_BEGIN -# define YY_IGNORE_USELESS_CAST_BEGIN -# define YY_IGNORE_USELESS_CAST_END -#endif - - -#define YY_ASSERT(E) ((void) (0 && (E))) - -#if 1 - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* 1 */ - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined HSQL_LTYPE_IS_TRIVIAL && HSQL_LTYPE_IS_TRIVIAL \ - && defined HSQL_STYPE_IS_TRIVIAL && HSQL_STYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yy_state_t yyss_alloc; - YYSTYPE yyvs_alloc; - YYLTYPE yyls_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE) \ - + YYSIZEOF (YYLTYPE)) \ - + 2 * YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYPTRDIFF_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / YYSIZEOF (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYPTRDIFF_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 69 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1248 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 209 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 136 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 377 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 693 - -/* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 444 - - -/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, with out-of-bounds checking. */ -#define YYTRANSLATE(YYX) \ - (0 <= (YYX) && (YYX) <= YYMAXUTOK \ - ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ - : YYSYMBOL_YYUNDEF) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 199, 194, 2, - 203, 204, 197, 195, 207, 196, 205, 198, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 206, - 185, 182, 186, 208, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 201, 2, 202, 193, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 192, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 183, 184, 187, - 188, 189, 190, 191, 200 -}; - -#if HSQL_DEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_int16 yyrline[] = -{ - 0, 349, 349, 368, 374, 378, 385, 389, 393, 394, - 395, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 412, 413, 415, 419, 424, 428, 438, 439, 440, - 442, 442, 448, 454, 456, 460, 472, 478, 495, 510, - 512, 513, 514, 516, 530, 534, 544, 548, 572, 580, - 593, 600, 615, 635, 636, 641, 652, 665, 677, 684, - 691, 700, 701, 703, 707, 712, 713, 715, 723, 724, - 725, 726, 727, 728, 729, 733, 734, 735, 736, 737, - 738, 739, 740, 741, 742, 743, 745, 746, 748, 749, - 750, 752, 753, 755, 759, 763, 768, 776, 777, 778, - 779, 781, 782, 783, 785, 793, 799, 805, 811, 817, - 818, 825, 831, 833, 843, 850, 861, 868, 876, 877, - 884, 891, 895, 900, 910, 914, 918, 930, 930, 932, - 933, 942, 943, 945, 959, 971, 976, 980, 984, 989, - 990, 992, 1007, 1008, 1010, 1012, 1013, 1015, 1017, 1018, - 1020, 1024, 1026, 1027, 1029, 1030, 1032, 1036, 1041, 1043, - 1044, 1045, 1047, 1048, 1070, 1071, 1073, 1074, 1075, 1076, - 1077, 1078, 1083, 1087, 1093, 1094, 1096, 1100, 1105, 1105, - 1109, 1117, 1118, 1120, 1129, 1129, 1129, 1129, 1129, 1131, - 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1133, - 1137, 1137, 1139, 1140, 1141, 1142, 1143, 1145, 1145, 1146, - 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, - 1157, 1158, 1159, 1160, 1162, 1163, 1164, 1165, 1167, 1168, - 1169, 1170, 1174, 1175, 1176, 1177, 1179, 1180, 1182, 1183, - 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1196, 1197, - 1198, 1199, 1203, 1204, 1206, 1207, 1212, 1213, 1214, 1218, - 1219, 1220, 1222, 1223, 1224, 1225, 1226, 1228, 1230, 1232, - 1233, 1234, 1235, 1236, 1237, 1239, 1240, 1241, 1242, 1243, - 1244, 1246, 1246, 1248, 1250, 1252, 1253, 1255, 1256, 1257, - 1258, 1259, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, - 1264, 1266, 1267, 1269, 1270, 1272, 1273, 1275, 1277, 1288, - 1289, 1300, 1332, 1341, 1341, 1348, 1348, 1350, 1350, 1357, - 1361, 1366, 1374, 1380, 1384, 1389, 1390, 1392, 1392, 1394, - 1394, 1396, 1397, 1399, 1399, 1405, 1406, 1408, 1412, 1417, - 1423, 1430, 1431, 1432, 1433, 1435, 1436, 1437, 1443, 1443, - 1445, 1447, 1451, 1456, 1466, 1474, 1482, 1489, 1497, 1506, - 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1516, 1517, - 1518, 1519, 1520, 1521, 1522, 1524, 1530, 1534 -}; -#endif - -/** Accessing symbol of state STATE. */ -#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) - -#if 1 -/* The user-facing name of the symbol whose (internal) number is - YYSYMBOL. No bounds checking. */ -static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; - -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "\"end of file\"", "error", "\"invalid token\"", "IDENTIFIER", "STRING", - "BIGINTVAL", "FLOATVAL", "INTVAL", "NULLSAFEEQUALS", "DEALLOCATE", - "PARAMETERS", "INTERSECT", "TEMPORARY", "TIMESTAMP", "DISTINCT", - "NVARCHAR", "RESTRICT", "TRUNCATE", "ANALYZE", "BETWEEN", "CASCADE", - "COLUMNS", "CONTROL", "DEFAULT", "EXECUTE", "EXPLAIN", "ENCODING", - "INTEGER", "NATURAL", "PREPARE", "SCHEMAS", "CHARACTER_VARYING", "REAL", - "DECIMAL", "SMALLINT", "BIGINT", "SPATIAL", "VARCHAR", "VIRTUAL", - "DESCRIBE", "BEFORE", "COLUMN", "CREATE", "DELETE", "DIRECT", "DOUBLE", - "ESCAPE", "EXCEPT", "EXISTS", "EXTRACT", "CAST", "FORMAT", "GLOBAL", - "HAVING", "IMPORT", "INSERT", "ISNULL", "OFFSET", "RENAME", "SCHEMA", - "SELECT", "SORTED", "TABLES", "UNLOAD", "UPDATE", "VALUES", "AFTER", - "ALTER", "CROSS", "DELTA", "FLOAT", "GROUP", "INDEX", "INNER", "LIMIT", - "LOCAL", "MERGE", "MINUS", "ORDER", "OVER", "OUTER", "RIGHT", "TABLE", - "UNION", "USING", "WHERE", "CALL", "CASE", "CHAR", "COPY", "DATE", - "DATETIME", "DESC", "DIV", "DROP", "ELSE", "FILE", "FROM", "FULL", - "HASH", "HINT", "INTO", "JOIN", "LEFT", "LIKE", "LOAD", "LONG", "NULL", - "PARTITION", "PLAN", "SHOW", "TEXT", "THEN", "TIME", "VIEW", "WHEN", - "WITH", "ADD", "ALL", "AND", "ASC", "END", "FOR", "INT", "NOT", "OFF", - "SET", "TOP", "AS", "BY", "IF", "IN", "IS", "OF", "ON", "OR", "TO", "NO", - "ARRAY", "CONCAT", "ILIKE", "MOD", "SECOND", "MINUTE", "HOUR", "DAY", - "MONTH", "YEAR", "SECONDS", "MINUTES", "HOURS", "DAYS", "MONTHS", - "YEARS", "INTERVAL", "TRUE", "FALSE", "BOOLEAN", "TRANSACTION", "BEGIN", - "COMMIT", "ROLLBACK", "NOWAIT", "SKIP", "LOCKED", "SHARE", "RANGE", - "ROWS", "GROUPS", "UNBOUNDED", "FOLLOWING", "PRECEDING", "CURRENT_ROW", - "UNIQUE", "PRIMARY", "FOREIGN", "KEY", "REFERENCES", "BITSHIFTLEFT", - "BITSHIFTRIGHT", "LOGICALAND", "LOGICALOR", "'='", "EQUALS", "NOTEQUALS", - "'<'", "'>'", "LESS", "GREATER", "LESSEQ", "GREATEREQ", "NOTNULL", "'|'", - "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "UMINUS", "'['", "']'", - "'('", "')'", "'.'", "';'", "','", "'?'", "$accept", "input", - "statement_list", "statement", "preparable_statement", "opt_hints", - "hint_list", "hint", "transaction_statement", "opt_transaction_keyword", - "prepare_statement", "prepare_target_query", "execute_statement", - "import_statement", "file_type", "file_path", - "opt_import_export_options", "import_export_options", "csv_option", - "export_statement", "show_statement", "create_statement", - "opt_not_exists", "table_elem_commalist", "table_elem", "column_def", - "column_type", "opt_time_precision", "opt_decimal_specification", - "opt_column_constraints", "column_constraints", "column_constraint", - "table_constraint", "references_spec", "drop_statement", "opt_exists", - "alter_statement", "alter_action", "drop_action", "delete_statement", - "truncate_statement", "insert_statement", "opt_column_list", - "update_statement", "update_clause_commalist", "update_clause", - "select_statement", "select_within_set_operation", - "select_within_set_operation_no_parentheses", "select_with_paren", - "select_no_paren", "set_operator", "set_type", "opt_all", - "select_clause", "opt_distinct", "select_list", "opt_from_clause", - "from_clause", "opt_where", "opt_group", "opt_having", "opt_order", - "order_list", "order_desc", "opt_order_type", "opt_null_ordering", - "opt_top", "opt_limit", "expr_list", "opt_extended_literal_list", - "extended_literal_list", "casted_extended_literal", "extended_literal", - "expr_alias", "expr", "operand", "scalar_expr", "unary_expr", - "binary_expr", "logic_expr", "in_expr", "case_expr", "case_list", - "exists_expr", "comp_expr", "function_expr", "opt_window", - "opt_partition", "opt_frame_clause", "frame_type", "frame_bound", - "extract_expr", "cast_expr", "datetime_field", "datetime_field_plural", - "duration_field", "array_expr", "array_index", "between_expr", - "column_name", "literal", "string_literal", "bool_literal", - "num_literal", "int_literal", "null_literal", "date_literal", - "interval_literal", "param_expr", "table_ref", "table_ref_atomic", - "nonjoin_table_ref_atomic", "table_ref_commalist", "table_ref_name", - "table_ref_name_no_alias", "table_name", "opt_index_name", "table_alias", - "opt_table_alias", "alias", "opt_alias", "opt_locking_clause", - "opt_locking_clause_list", "locking_clause", "row_lock_mode", - "opt_row_lock_policy", "opt_with_clause", "with_clause", - "with_description_list", "with_description", "join_clause", - "opt_join_type", "natural_join_type", "join_condition", - "ident_commalist", YY_NULLPTR -}; - -static const char * -yysymbol_name (yysymbol_kind_t yysymbol) -{ - return yytname[yysymbol]; -} -#endif - -#ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 61, 437, 438, 60, 62, 439, 440, 441, - 442, 443, 124, 94, 38, 43, 45, 42, 47, 37, - 444, 91, 93, 40, 41, 46, 59, 44, 63 -}; -#endif - -#define YYPACT_NINF (-614) - -#define yypact_value_is_default(Yyn) \ - ((Yyn) == YYPACT_NINF) - -#define YYTABLE_NINF (-368) - -#define yytable_value_is_error(Yyn) \ - ((Yyn) == YYTABLE_NINF) - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int16 yypact[] = -{ - 1017, 68, 66, 77, 142, 66, 140, 81, 96, 104, - 66, 173, 20, 159, 42, 266, 129, 129, 129, 289, - 88, -614, 195, -614, 195, -614, -614, -614, -614, -614, - -614, -614, -614, -614, -614, -614, -614, -24, -614, 315, - 115, -614, 127, 235, -614, 207, 207, 207, 66, 336, - 66, 220, -614, 250, -24, 255, 51, 250, 250, 250, - 66, -614, 222, 179, -614, -614, -614, -614, -614, -614, - 552, 293, -614, -614, 294, 60, -614, 341, -614, 409, - 48, 412, 305, 433, 66, 66, 369, -614, 388, 244, - 483, 440, 66, 300, 304, 489, 489, 489, 495, 66, - 66, -614, 310, 266, -614, 316, 83, 521, -614, -614, - -614, -24, 402, 411, -24, 0, -614, -614, -614, -614, - 765, 343, 540, -614, 541, -614, -614, 32, -614, 346, - 344, -614, -614, -614, -614, -614, -614, -614, -614, -614, - -614, -614, -614, -614, 508, -614, 423, -52, 244, 446, - -614, 489, 555, 24, 380, -43, -614, -614, 471, -614, - -614, -614, -66, -66, -66, -614, -614, -614, -614, -614, - 564, -614, -614, -614, 446, 490, -614, -614, 60, -614, - -614, 446, 490, 446, 210, 457, -614, -614, -614, -614, - -614, -614, -614, -614, -614, -614, -614, -614, -614, -614, - -614, 356, -614, 488, -614, -614, -614, 48, -614, 66, - 579, 467, 23, 460, -14, 386, 387, 395, -614, 229, - 473, 391, 568, -614, 351, 337, 547, -614, -614, -614, - -614, -614, -614, -614, -614, -614, -614, -614, -614, -614, - -614, -614, -614, 503, -614, -32, 405, -614, 446, 483, - -614, 572, -614, -614, 417, 144, -614, 369, -614, 419, - 46, -614, 527, 398, -614, 57, 0, -24, 429, -614, - 285, 0, 337, 569, 133, 4, -614, 457, -614, 481, - -614, -614, 435, 543, -614, 1091, 441, 472, 474, 59, - -614, -614, -614, 467, 16, 22, 592, 488, 446, 446, - 216, 73, 450, 568, 802, 446, -45, 452, 279, 446, - 446, 446, 446, 568, 568, -614, 568, 568, 40, 454, - -41, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 83, 66, -614, 656, 48, 337, -614, 250, 144, - 657, 659, 336, 660, 76, -614, -614, 48, -614, 564, - 21, 369, -614, 446, -614, 662, -614, -614, -614, -614, - 446, -614, -614, 664, 457, 446, 446, -614, 484, -614, - 507, -71, -614, 1091, 555, 489, -614, -614, 470, -614, - 477, -614, -614, 486, -614, -614, 491, -614, -614, -614, - -614, 492, -614, -614, 201, 555, 493, 494, -614, 23, - -614, 595, 446, 90, -614, 487, 580, 214, 362, 86, - 446, 446, -614, 592, 589, -120, -614, -614, -614, -38, - -614, -38, 826, 658, -67, 826, 568, 568, 505, 351, - -614, 591, 509, 826, -67, 106, 106, 826, 826, 826, - 897, 897, 897, 897, 506, 691, 961, -45, -45, -67, - -67, -67, 513, -614, -614, 84, 706, 120, -614, -614, - -614, -614, -614, 174, 134, -614, 467, -614, 342, -614, - 510, -614, 38, -614, 645, -614, -614, -614, 715, -614, - -614, 337, 337, 655, -614, 555, -614, 556, -614, 517, - 164, -614, 720, 721, -614, 727, 728, 740, -614, -614, - 642, -614, 574, 66, -614, 201, -614, -614, 183, 555, - 555, -614, 549, -614, 223, 26, 750, -614, 446, 1091, - 446, 446, -614, 406, 397, 550, -614, 568, 682, 826, - 351, 553, 224, -614, -614, -614, -614, -614, 752, 336, - -614, -614, 554, 512, 661, -614, -614, 679, 680, 681, - 665, 21, 763, -614, -614, -614, 639, 716, -614, -614, - 102, -614, -614, -614, 566, 260, 570, 575, 576, -614, - -614, 244, -614, -614, -614, 264, 278, 670, 595, 595, - 446, -614, 320, 577, 337, 502, -614, 446, -614, 802, - 568, 581, 295, -614, -614, -614, -614, 38, -614, 692, - 693, 21, 703, 685, 21, -614, -614, -614, 21, 389, - 585, 446, 446, -614, -614, -614, -614, 782, -614, -614, - -614, -614, -614, 614, 663, 490, -614, -614, 322, -614, - -614, -614, 337, 802, -614, -614, -614, -614, -614, -614, - -614, 21, -614, 242, 555, 398, 337, 590, -614, 446, - 108, 595, -614, 593, 446, 324, -614, 398, -614, -614, - -614, 596, 37, -614, 555, 337, -614, -614, -614, 91, - 39, 232, -614, -614, 330, -614, -614, 674, -614, -614, - -614, 39, -614 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_int16 yydefact[] = -{ - 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 31, 31, 0, - 2, 3, 22, 20, 22, 19, 9, 10, 8, 12, - 17, 18, 14, 15, 13, 16, 11, 0, 348, 0, - 323, 115, 34, 0, 55, 62, 62, 62, 0, 0, - 0, 0, 322, 110, 0, 0, 0, 110, 110, 110, - 0, 53, 0, 350, 351, 30, 27, 29, 28, 1, - 4, 0, 7, 6, 165, 124, 125, 155, 107, 0, - 175, 0, 0, 326, 0, 0, 149, 38, 0, 119, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 0, 0, 143, 137, 138, - 136, 0, 140, 0, 0, 171, 324, 300, 306, 303, - 305, 0, 0, 307, 0, 301, 302, 0, 312, 0, - 174, 176, 178, 180, 293, 294, 295, 304, 296, 297, - 298, 299, 33, 32, 0, 325, 0, 0, 119, 0, - 114, 0, 0, 0, 0, 149, 121, 109, 0, 132, - 131, 39, 42, 42, 42, 108, 105, 106, 353, 352, - 0, 305, 164, 142, 0, 155, 128, 127, 129, 139, - 135, 0, 155, 0, 0, 336, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 309, 0, 308, 311, 181, 182, 35, 0, 61, 0, - 0, 349, 0, 0, 287, 0, 0, 0, 288, 0, - 0, 0, 0, 291, 0, 148, 184, 191, 192, 193, - 186, 188, 194, 187, 207, 195, 196, 197, 198, 190, - 185, 200, 201, 0, 376, 0, 0, 117, 0, 0, - 120, 0, 111, 112, 0, 0, 52, 149, 51, 25, - 0, 23, 146, 144, 172, 334, 171, 0, 154, 156, - 161, 171, 167, 169, 166, 0, 133, 335, 337, 0, - 310, 177, 0, 0, 58, 0, 0, 0, 0, 0, - 63, 65, 66, 349, 143, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 203, 0, 202, 0, 0, 0, - 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 0, 0, 123, 122, 110, 0, - 0, 0, 0, 0, 0, 48, 37, 0, 21, 0, - 0, 149, 145, 0, 332, 0, 333, 183, 126, 130, - 0, 160, 159, 162, 336, 0, 0, 341, 0, 343, - 0, 347, 338, 0, 0, 0, 84, 78, 0, 80, - 90, 81, 68, 0, 75, 76, 0, 72, 73, 79, - 82, 87, 77, 69, 92, 0, 0, 0, 57, 0, - 60, 253, 0, 289, 292, 0, 0, 0, 0, 0, - 0, 0, 234, 0, 0, 0, 199, 189, 224, 226, - 225, 227, 242, 0, 214, 220, 0, 0, 0, 0, - 205, 0, 223, 222, 213, 218, 219, 240, 241, 243, - 244, 245, 246, 247, 217, 215, 216, 209, 208, 211, - 210, 212, 0, 36, 377, 0, 0, 0, 49, 46, - 44, 50, 41, 0, 0, 24, 349, 147, 313, 315, - 0, 317, 330, 316, 151, 173, 331, 157, 0, 158, - 134, 170, 168, 0, 344, 0, 346, 0, 339, 0, - 0, 56, 0, 0, 74, 0, 0, 0, 83, 99, - 0, 98, 0, 0, 67, 91, 93, 95, 0, 0, - 0, 64, 0, 248, 0, 143, 0, 238, 0, 0, - 0, 0, 232, 0, 0, 0, 283, 0, 0, 221, - 0, 0, 0, 206, 284, 116, 113, 40, 0, 0, - 47, 26, 0, 0, 0, 359, 365, 363, 366, 361, - 0, 0, 0, 329, 321, 327, 0, 153, 163, 342, - 347, 345, 179, 59, 0, 0, 0, 0, 0, 100, - 97, 119, 94, 96, 102, 0, 0, 255, 253, 253, - 0, 290, 0, 0, 236, 0, 235, 0, 239, 285, - 0, 0, 0, 230, 228, 45, 43, 330, 368, 372, - 374, 0, 370, 0, 0, 362, 364, 360, 0, 314, - 331, 0, 0, 141, 340, 71, 89, 0, 85, 70, - 86, 104, 101, 0, 0, 155, 249, 250, 0, 267, - 268, 233, 237, 286, 231, 229, 318, 371, 373, 354, - 369, 0, 356, 367, 0, 150, 152, 0, 103, 0, - 258, 253, 355, 0, 0, 0, 88, 254, 259, 260, - 261, 0, 0, 251, 0, 375, 357, 328, 252, 0, - 0, 0, 266, 256, 0, 265, 263, 0, 264, 262, - 358, 0, 257 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -614, -614, -614, 725, -614, 778, -614, 444, -614, 416, - -614, -614, -614, -614, -331, -87, 375, 455, 332, -614, - -614, -614, 396, -614, 399, -614, -356, -614, -614, -614, - -614, 292, -614, -468, -614, -42, -614, -614, -614, -614, - -614, -614, -146, -614, -614, 560, -191, -85, -614, 245, - -50, -19, -614, -614, -83, -276, -614, -614, -614, -122, - -614, -614, -174, -614, 442, -614, -614, -614, -23, -300, - -614, -280, 604, 612, 453, -149, -208, -614, -614, -614, - -614, -614, -614, 515, -614, -614, -614, -478, -614, -614, - -614, -613, -614, -614, -130, -614, -614, -614, -614, -614, - -614, -61, -614, -614, 690, -99, -614, -614, 697, -614, - -614, -482, -242, -614, -614, -614, 1, -614, -614, 211, - 561, -614, 445, -614, 548, -614, 257, -614, -614, -614, - 717, -614, -614, -614, -614, -362 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 19, 20, 21, 22, 72, 260, 261, 23, 66, - 24, 143, 25, 26, 88, 162, 256, 354, 355, 27, - 28, 29, 83, 289, 290, 291, 404, 508, 504, 514, - 515, 516, 292, 517, 30, 92, 31, 252, 253, 32, - 33, 34, 153, 35, 155, 156, 36, 175, 176, 177, - 76, 111, 112, 180, 77, 174, 262, 361, 362, 150, - 567, 623, 115, 268, 269, 373, 489, 107, 185, 263, - 129, 130, 131, 132, 264, 265, 226, 227, 228, 229, - 230, 231, 232, 301, 233, 234, 235, 523, 635, 671, - 672, 683, 236, 237, 198, 199, 200, 238, 239, 240, - 241, 242, 134, 135, 136, 137, 138, 139, 140, 141, - 477, 478, 479, 480, 481, 51, 482, 146, 563, 564, - 565, 367, 276, 277, 278, 381, 498, 37, 38, 63, - 64, 483, 560, 613, 676, 245 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_int16 yytable[] = -{ - 225, 266, 213, 41, 94, 425, 44, 172, 271, 163, - 164, 52, 304, 56, 306, 98, 99, 100, 412, 133, - 284, 470, 500, 40, 40, 413, 285, 499, 178, 182, - 173, 178, 270, 250, 272, 274, 74, 118, 119, 120, - 173, 364, 149, 518, 679, 210, 679, 583, 316, 86, - 254, 89, 117, 118, 119, 120, 680, 183, 114, 436, - 364, 101, 495, 60, 243, 465, 440, 687, 377, 40, - 300, 108, 321, 280, 184, 308, 211, 474, 692, 619, - 42, 309, 536, 441, 74, 147, 148, 363, 118, 246, - 171, 496, 497, 158, 321, 304, 323, 39, 121, 346, - 166, 167, 410, 247, 61, 432, 433, 109, 434, 435, - 636, 637, 524, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 570, 341, 356, 653, 255, 122, 542, - 133, 378, 311, 110, 437, 43, 133, 350, 96, 417, - 418, 212, 338, 339, 340, 123, 341, 585, 586, 267, - 428, 429, 430, 431, 249, 658, 562, 416, 420, 379, - 351, 438, 343, 593, 307, 344, 309, 350, 48, 54, - 380, 531, 369, 673, 178, 365, 124, 97, 421, 294, - 376, 295, 310, 49, 422, 352, 286, 287, 288, 316, - 548, 421, 124, 125, 126, 50, 681, 532, 681, 682, - 282, 682, 45, 214, 117, 118, 119, 120, 606, 414, - 411, 270, 46, 54, 476, 549, 491, 492, 538, 539, - 589, 57, 214, 117, 118, 119, 120, 311, 312, 484, - 602, 58, 462, 368, 127, 321, 415, 323, 374, 590, - 358, 353, 309, 359, 47, 53, 128, 55, 215, 216, - 217, 685, 686, 408, 496, 497, 409, 218, 310, 62, - 553, 533, 534, 59, 668, 669, 670, 215, 216, 217, - 472, 353, 75, 473, 133, 552, 218, 65, 545, 69, - 638, 207, 665, 525, 70, 526, 133, 219, 501, 93, - 122, 336, 337, 338, 339, 340, 466, 341, 509, 344, - 554, 71, 684, 311, 312, 555, 219, 123, 78, 122, - 79, 655, 556, 557, 547, 510, 663, 473, 273, 599, - 80, 299, 81, 309, 220, 309, 123, 82, 551, 87, - 558, 207, 529, 463, 299, 559, 90, 168, 221, 310, - 102, 310, 108, 220, 214, 117, 118, 119, 120, 667, - 117, 118, 119, 120, 124, 125, 126, 221, 573, 649, - 553, 344, 652, 535, 511, 512, 664, 371, 513, 592, - 91, 594, 595, 124, 125, 126, 103, 584, 109, 541, - 344, 95, 643, 105, 311, 312, 311, 312, 309, 215, - 216, 217, 688, 689, 309, 372, 222, 223, 218, 662, - 554, 74, 116, 224, 310, 555, 142, 553, 128, 113, - 310, 106, 556, 557, 110, 222, 223, 588, 604, 144, - 363, 363, 224, 67, 68, 631, 145, 128, 219, 309, - 558, 122, 84, 85, -367, 559, 122, 152, 642, 214, - 117, 118, 119, 120, 149, 310, 309, 554, 123, 311, - 312, 660, 555, 123, 626, 311, 312, 627, 632, 556, - 557, 344, 310, 656, 530, 220, 214, 117, 118, 119, - 120, 309, 633, 427, 151, 344, 154, 558, 157, 221, - 601, -367, 559, 161, 215, 216, 217, 310, 165, 645, - 311, 312, 363, 218, 159, 124, 125, 126, 160, 597, - 124, 125, 126, 54, 581, 675, 309, 311, 312, 170, - 179, 302, 216, 217, 639, 309, 661, 596, 677, 363, - 218, 344, 310, 219, 690, 173, 122, 344, 257, 258, - 181, 310, 311, 312, 202, 203, 201, 222, 223, -319, - 206, 207, 127, 123, 224, 313, 208, 209, 244, 128, - 219, 1, 248, 122, 128, 251, 314, 259, 113, 2, - 220, 214, 117, 118, 119, 120, 3, 311, 312, 275, - 123, 4, 283, 15, 221, 608, 311, 312, 293, 296, - 297, 5, 305, 609, 6, 7, -320, 303, 298, 316, - 124, 125, 126, 315, 342, 363, 8, 9, 345, 383, - 610, 221, -349, 348, 611, 612, 10, 216, 217, 11, - 349, 309, 357, 641, 360, 218, 375, 124, 125, 126, - 186, 187, 188, 189, 190, 191, 370, 310, 384, 385, - 316, 12, 222, 223, 405, 321, 13, 323, 406, 224, - 407, 317, 74, 423, 128, 219, 426, 439, 122, 464, - 493, 468, 14, 469, 471, 486, 313, 488, 15, 222, - 223, 318, 494, 502, 522, 123, 224, 528, 319, 320, - 503, 128, 311, 312, 324, 325, 321, 322, 323, 505, - 313, 527, 303, 437, 506, 507, 519, 520, 543, 334, - 335, 336, 337, 338, 339, 340, 221, 341, 540, 546, - 341, 16, 17, 18, 315, 544, 566, 561, 568, 569, - 571, 572, 124, 125, 126, 324, 325, 574, 575, 326, - 327, 328, 329, 330, 576, 577, 331, 332, 315, 333, - 334, 335, 336, 337, 338, 339, 340, 578, 341, 579, - 580, 316, 587, 591, 598, -349, 605, 603, 607, 615, - 616, 617, 317, 614, 222, 223, 620, 618, 621, 622, - 625, 224, 647, 648, 628, 316, 128, 537, 634, 629, - 630, 640, 424, 650, 316, 644, 317, 651, 654, 657, - 320, 513, 659, 691, 666, 104, 674, 321, 322, 323, - 678, 600, 73, 475, 467, 550, 424, 582, 521, 347, - 313, 281, 487, 279, 320, 419, 485, 204, 646, 490, - 169, 321, 322, 323, 205, 382, 366, 624, 0, 0, - 321, 0, 323, 0, -368, 0, 324, 325, 0, 0, - 326, 327, 328, 329, 330, 0, 0, 331, 332, 0, - 333, 334, 335, 336, 337, 338, 339, 340, 315, 341, - 324, 325, 0, 0, 326, 327, 328, 329, 330, 324, - 325, 331, 332, 0, 333, 334, 335, 336, 337, 338, - 339, 340, 315, 341, 0, 335, 336, 337, 338, 339, - 340, 0, 341, 0, 0, 316, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 317, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 316, - 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, - -368, 0, 0, 0, 320, 0, 0, 0, 0, 0, - 0, 321, 322, 323, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 315, 0, 0, 0, 0, 320, 0, - 0, 0, 0, 0, 0, 321, -368, 323, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 324, 325, 0, 0, 326, 327, 328, 329, 330, 0, - 316, 331, 332, 0, 333, 334, 335, 336, 337, 338, - 339, 340, 0, 341, 324, 325, 0, 0, -368, -368, - -368, 329, 330, 0, 0, 331, 332, 0, 333, 334, - 335, 336, 337, 338, 339, 340, 1, 341, 0, 320, - 0, 0, 0, 0, 2, 0, 321, 0, 323, 0, - 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 316, 0, 5, 0, 0, 6, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 9, 0, 0, 324, 325, 0, 0, 0, - 0, 10, -368, -368, 11, 0, -368, -368, 0, 333, - 334, 335, 336, 337, 338, 339, 340, 0, 341, 0, - 321, 0, 323, 0, 386, 0, 12, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 387, 0, - 0, 0, 388, 389, 390, 391, 392, 14, 393, 0, - 0, 0, 0, 15, 0, 0, 394, 0, 0, 324, - 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 336, 337, 338, 339, - 340, 395, 341, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 17, 18, 396, - 0, 397, 398, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, - 0, 0, 400, 0, 401, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 403 -}; - -static const yytype_int16 yycheck[] = -{ - 149, 175, 148, 2, 54, 305, 5, 106, 182, 96, - 97, 10, 220, 12, 222, 57, 58, 59, 294, 80, - 211, 352, 384, 3, 3, 3, 3, 383, 111, 114, - 14, 114, 181, 155, 183, 184, 60, 5, 6, 7, - 14, 3, 85, 405, 7, 97, 7, 515, 93, 48, - 116, 50, 4, 5, 6, 7, 19, 57, 77, 19, - 3, 60, 133, 21, 151, 345, 107, 680, 64, 3, - 219, 11, 139, 203, 74, 224, 128, 357, 691, 561, - 3, 119, 202, 124, 60, 84, 85, 207, 5, 65, - 7, 162, 163, 92, 139, 303, 141, 29, 50, 248, - 99, 100, 293, 153, 62, 313, 314, 47, 316, 317, - 588, 589, 412, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 495, 201, 257, 618, 203, 90, 439, - 201, 137, 180, 83, 104, 3, 207, 3, 97, 298, - 299, 203, 197, 198, 199, 107, 201, 519, 520, 178, - 309, 310, 311, 312, 207, 633, 128, 297, 95, 165, - 26, 131, 204, 529, 224, 207, 119, 3, 97, 203, - 176, 95, 267, 661, 267, 128, 154, 136, 115, 203, - 57, 205, 135, 97, 121, 51, 173, 174, 175, 93, - 26, 115, 154, 155, 156, 101, 169, 121, 169, 172, - 209, 172, 72, 3, 4, 5, 6, 7, 549, 197, - 204, 370, 82, 203, 203, 51, 375, 376, 436, 437, - 204, 72, 3, 4, 5, 6, 7, 180, 181, 361, - 540, 82, 341, 266, 196, 139, 296, 141, 271, 525, - 204, 107, 119, 207, 114, 82, 208, 12, 48, 49, - 50, 170, 171, 204, 162, 163, 207, 57, 135, 3, - 28, 420, 421, 114, 166, 167, 168, 48, 49, 50, - 204, 107, 37, 207, 345, 476, 57, 158, 204, 0, - 590, 207, 654, 203, 206, 205, 357, 87, 385, 54, - 90, 195, 196, 197, 198, 199, 348, 201, 107, 207, - 68, 116, 674, 180, 181, 73, 87, 107, 3, 90, - 205, 621, 80, 81, 204, 124, 84, 207, 118, 537, - 203, 115, 97, 119, 124, 119, 107, 130, 204, 3, - 98, 207, 128, 342, 115, 103, 126, 102, 138, 135, - 128, 135, 11, 124, 3, 4, 5, 6, 7, 659, - 4, 5, 6, 7, 154, 155, 156, 138, 204, 611, - 28, 207, 614, 423, 173, 174, 134, 92, 177, 528, - 130, 530, 531, 154, 155, 156, 207, 204, 47, 439, - 207, 136, 600, 100, 180, 181, 180, 181, 119, 48, - 49, 50, 170, 171, 119, 120, 196, 197, 57, 651, - 68, 60, 3, 203, 135, 73, 4, 28, 208, 78, - 135, 127, 80, 81, 83, 196, 197, 204, 204, 124, - 207, 207, 203, 17, 18, 581, 3, 208, 87, 119, - 98, 90, 46, 47, 102, 103, 90, 203, 597, 3, - 4, 5, 6, 7, 85, 135, 119, 68, 107, 180, - 181, 635, 73, 107, 204, 180, 181, 207, 204, 80, - 81, 207, 135, 622, 112, 124, 3, 4, 5, 6, - 7, 119, 204, 204, 96, 207, 3, 98, 48, 138, - 540, 102, 103, 4, 48, 49, 50, 135, 3, 204, - 180, 181, 207, 57, 204, 154, 155, 156, 204, 112, - 154, 155, 156, 203, 513, 664, 119, 180, 181, 203, - 118, 48, 49, 50, 204, 119, 204, 121, 204, 207, - 57, 207, 135, 87, 204, 14, 90, 207, 163, 164, - 129, 135, 180, 181, 4, 4, 203, 196, 197, 207, - 204, 207, 196, 107, 203, 8, 48, 134, 3, 208, - 87, 9, 182, 90, 208, 94, 19, 3, 78, 17, - 124, 3, 4, 5, 6, 7, 24, 180, 181, 122, - 107, 29, 3, 116, 138, 73, 180, 181, 128, 203, - 203, 39, 201, 81, 42, 43, 207, 124, 203, 93, - 154, 155, 156, 56, 101, 207, 54, 55, 203, 128, - 98, 138, 60, 41, 102, 103, 64, 49, 50, 67, - 203, 119, 203, 121, 97, 57, 57, 154, 155, 156, - 142, 143, 144, 145, 146, 147, 207, 135, 203, 96, - 93, 89, 196, 197, 203, 139, 94, 141, 176, 203, - 176, 104, 60, 203, 208, 87, 204, 203, 90, 3, - 176, 4, 110, 4, 4, 3, 8, 3, 116, 196, - 197, 124, 165, 203, 79, 107, 203, 97, 131, 132, - 203, 208, 180, 181, 178, 179, 139, 140, 141, 203, - 8, 204, 124, 104, 203, 203, 203, 203, 107, 193, - 194, 195, 196, 197, 198, 199, 138, 201, 203, 3, - 201, 159, 160, 161, 56, 202, 71, 207, 3, 64, - 164, 204, 154, 155, 156, 178, 179, 7, 7, 182, - 183, 184, 185, 186, 7, 7, 189, 190, 56, 192, - 193, 194, 195, 196, 197, 198, 199, 7, 201, 107, - 176, 93, 203, 3, 204, 203, 4, 204, 204, 80, - 80, 80, 104, 102, 196, 197, 3, 102, 129, 53, - 204, 203, 80, 80, 204, 93, 208, 119, 108, 204, - 204, 204, 124, 80, 93, 204, 104, 102, 203, 7, - 132, 177, 129, 119, 204, 70, 203, 139, 140, 141, - 204, 119, 24, 359, 349, 473, 124, 515, 409, 249, - 8, 207, 370, 201, 132, 300, 363, 127, 607, 374, - 103, 139, 140, 141, 127, 277, 265, 570, -1, -1, - 139, -1, 141, -1, 8, -1, 178, 179, -1, -1, - 182, 183, 184, 185, 186, -1, -1, 189, 190, -1, - 192, 193, 194, 195, 196, 197, 198, 199, 56, 201, - 178, 179, -1, -1, 182, 183, 184, 185, 186, 178, - 179, 189, 190, -1, 192, 193, 194, 195, 196, 197, - 198, 199, 56, 201, -1, 194, 195, 196, 197, 198, - 199, -1, 201, -1, -1, 93, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 104, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 93, - -1, -1, -1, -1, -1, -1, 124, -1, -1, -1, - 104, -1, -1, -1, 132, -1, -1, -1, -1, -1, - -1, 139, 140, 141, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 56, -1, -1, -1, -1, 132, -1, - -1, -1, -1, -1, -1, 139, 140, 141, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 178, 179, -1, -1, 182, 183, 184, 185, 186, -1, - 93, 189, 190, -1, 192, 193, 194, 195, 196, 197, - 198, 199, -1, 201, 178, 179, -1, -1, 182, 183, - 184, 185, 186, -1, -1, 189, 190, -1, 192, 193, - 194, 195, 196, 197, 198, 199, 9, 201, -1, 132, - -1, -1, -1, -1, 17, -1, 139, -1, 141, -1, - -1, 24, -1, -1, -1, -1, 29, -1, -1, -1, - -1, -1, -1, -1, 93, -1, 39, -1, -1, 42, - 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 54, 55, -1, -1, 178, 179, -1, -1, -1, - -1, 64, 185, 186, 67, -1, 189, 190, -1, 192, - 193, 194, 195, 196, 197, 198, 199, -1, 201, -1, - 139, -1, 141, -1, 13, -1, 89, -1, -1, -1, - -1, 94, -1, -1, -1, -1, -1, -1, 27, -1, - -1, -1, 31, 32, 33, 34, 35, 110, 37, -1, - -1, -1, -1, 116, -1, -1, 45, -1, -1, 178, - 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 195, 196, 197, 198, - 199, 70, 201, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 159, 160, 161, 88, - -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, - -1, -1, 111, -1, 113, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 123, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 157 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_int16 yystos[] = -{ - 0, 9, 17, 24, 29, 39, 42, 43, 54, 55, - 64, 67, 89, 94, 110, 116, 159, 160, 161, 210, - 211, 212, 213, 217, 219, 221, 222, 228, 229, 230, - 243, 245, 248, 249, 250, 252, 255, 336, 337, 29, - 3, 325, 3, 3, 325, 72, 82, 114, 97, 97, - 101, 324, 325, 82, 203, 258, 325, 72, 82, 114, - 21, 62, 3, 338, 339, 158, 218, 218, 218, 0, - 206, 116, 214, 214, 60, 258, 259, 263, 3, 205, - 203, 97, 130, 231, 231, 231, 325, 3, 223, 325, - 126, 130, 244, 258, 259, 136, 97, 136, 244, 244, - 244, 325, 128, 207, 212, 100, 127, 276, 11, 47, - 83, 260, 261, 78, 260, 271, 3, 4, 5, 6, - 7, 50, 90, 107, 154, 155, 156, 196, 208, 279, - 280, 281, 282, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 4, 220, 124, 3, 326, 325, 325, 85, - 268, 96, 203, 251, 3, 253, 254, 48, 325, 204, - 204, 4, 224, 224, 224, 3, 325, 325, 258, 339, - 203, 7, 314, 14, 264, 256, 257, 258, 263, 118, - 262, 129, 256, 57, 74, 277, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 303, 304, - 305, 203, 4, 4, 313, 317, 204, 207, 48, 134, - 97, 128, 203, 251, 3, 48, 49, 50, 57, 87, - 124, 138, 196, 197, 203, 284, 285, 286, 287, 288, - 289, 290, 291, 293, 294, 295, 301, 302, 306, 307, - 308, 309, 310, 224, 3, 344, 65, 259, 182, 207, - 268, 94, 246, 247, 116, 203, 225, 225, 225, 3, - 215, 216, 265, 278, 283, 284, 271, 260, 272, 273, - 284, 271, 284, 118, 284, 122, 331, 332, 333, 282, - 303, 281, 325, 3, 255, 3, 173, 174, 175, 232, - 233, 234, 241, 128, 203, 205, 203, 203, 203, 115, - 284, 292, 48, 124, 285, 201, 285, 259, 284, 119, - 135, 180, 181, 8, 19, 56, 93, 104, 124, 131, - 132, 139, 140, 141, 178, 179, 182, 183, 184, 185, - 186, 189, 190, 192, 193, 194, 195, 196, 197, 198, - 199, 201, 101, 204, 207, 203, 284, 254, 41, 203, - 3, 26, 51, 107, 226, 227, 268, 203, 204, 207, - 97, 266, 267, 207, 3, 128, 329, 330, 277, 256, - 207, 92, 120, 274, 277, 57, 57, 64, 137, 165, - 176, 334, 333, 128, 203, 96, 13, 27, 31, 32, - 33, 34, 35, 37, 45, 70, 88, 90, 91, 106, - 111, 113, 123, 157, 235, 203, 176, 176, 204, 207, - 255, 204, 264, 3, 197, 259, 303, 284, 284, 292, - 95, 115, 121, 203, 124, 278, 204, 204, 284, 284, - 284, 284, 285, 285, 285, 285, 19, 104, 131, 203, - 107, 124, 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 314, 325, 3, 280, 244, 226, 4, 4, - 223, 4, 204, 207, 280, 216, 203, 319, 320, 321, - 322, 323, 325, 340, 268, 283, 3, 273, 3, 275, - 331, 284, 284, 176, 165, 133, 162, 163, 335, 235, - 344, 224, 203, 203, 237, 203, 203, 203, 236, 107, - 124, 173, 174, 177, 238, 239, 240, 242, 344, 203, - 203, 233, 79, 296, 278, 203, 205, 204, 97, 128, - 112, 95, 121, 284, 284, 259, 202, 119, 285, 285, - 203, 259, 278, 107, 202, 204, 3, 204, 26, 51, - 227, 204, 255, 28, 68, 73, 80, 81, 98, 103, - 341, 207, 128, 327, 328, 329, 71, 269, 3, 64, - 344, 164, 204, 204, 7, 7, 7, 7, 7, 107, - 176, 325, 240, 242, 204, 344, 344, 203, 204, 204, - 264, 3, 284, 235, 284, 284, 121, 112, 204, 285, - 119, 259, 278, 204, 204, 4, 223, 204, 73, 81, - 98, 102, 103, 342, 102, 80, 80, 80, 102, 320, - 3, 129, 53, 270, 335, 204, 204, 207, 204, 204, - 204, 251, 204, 204, 108, 297, 296, 296, 278, 204, - 204, 121, 284, 285, 204, 204, 328, 80, 80, 321, - 80, 102, 321, 320, 203, 278, 284, 7, 242, 129, - 271, 204, 321, 84, 134, 344, 204, 278, 166, 167, - 168, 298, 299, 296, 203, 284, 343, 204, 204, 7, - 19, 169, 172, 300, 344, 170, 171, 300, 170, 171, - 204, 119, 300 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_int16 yyr1[] = -{ - 0, 209, 210, 211, 211, 211, 212, 212, 212, 212, - 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, - 218, 218, 219, 220, 221, 221, 222, 222, 223, 224, - 225, 225, 225, 226, 226, 226, 226, 226, 226, 227, - 227, 228, 228, 229, 229, 229, 230, 230, 230, 230, - 230, 231, 231, 232, 232, 233, 233, 234, 235, 235, - 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 235, 235, 236, 236, 237, 237, - 237, 238, 238, 239, 239, 239, 239, 240, 240, 240, - 240, 241, 241, 241, 242, 243, 243, 243, 243, 244, - 244, 245, 246, 247, 248, 249, 250, 250, 251, 251, - 252, 253, 253, 254, 255, 255, 255, 256, 256, 257, - 257, 258, 258, 259, 259, 260, 261, 261, 261, 262, - 262, 263, 264, 264, 265, 266, 266, 267, 268, 268, - 269, 269, 270, 270, 271, 271, 272, 272, 273, 274, - 274, 274, 275, 275, 276, 276, 277, 277, 277, 277, - 277, 277, 278, 278, 279, 279, 280, 280, 281, 281, - 282, 282, 282, 283, 284, 284, 284, 284, 284, 285, - 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, - 286, 286, 287, 287, 287, 287, 287, 288, 288, 288, - 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 288, 288, 288, 289, 289, 289, 289, 290, 290, - 290, 290, 291, 291, 291, 291, 292, 292, 293, 293, - 294, 294, 294, 294, 294, 294, 294, 294, 295, 295, - 295, 295, 296, 296, 297, 297, 298, 298, 298, 299, - 299, 299, 300, 300, 300, 300, 300, 301, 302, 303, - 303, 303, 303, 303, 303, 304, 304, 304, 304, 304, - 304, 305, 305, 306, 307, 308, 308, 309, 309, 309, - 309, 309, 309, 310, 310, 310, 310, 310, 310, 310, - 311, 312, 312, 313, 313, 314, 314, 315, 316, 317, - 317, 317, 318, 319, 319, 320, 320, 321, 321, 322, - 322, 323, 324, 325, 325, 326, 326, 327, 327, 328, - 328, 329, 329, 330, 330, 331, 331, 332, 332, 333, - 333, 334, 334, 334, 334, 335, 335, 335, 336, 336, - 337, 338, 338, 339, 340, 340, 340, 340, 340, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 342, 342, - 342, 342, 342, 342, 342, 343, 344, 344 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_int8 yyr2[] = -{ - 0, 2, 1, 1, 2, 3, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 5, 0, 1, 3, 1, 4, 2, 2, 2, - 1, 0, 4, 1, 2, 5, 7, 6, 1, 1, - 4, 3, 0, 4, 2, 4, 2, 3, 1, 2, - 2, 5, 5, 2, 3, 2, 8, 7, 6, 9, - 7, 3, 0, 1, 3, 1, 1, 3, 1, 1, - 4, 4, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 1, 4, 3, 0, 5, 3, - 0, 1, 0, 1, 2, 1, 2, 2, 1, 1, - 2, 5, 4, 6, 3, 4, 4, 3, 4, 2, - 0, 5, 1, 4, 4, 2, 8, 5, 3, 0, - 5, 1, 3, 3, 2, 2, 6, 1, 1, 1, - 3, 3, 3, 4, 6, 2, 1, 1, 1, 1, - 0, 8, 1, 0, 1, 1, 0, 2, 2, 0, - 3, 0, 2, 0, 3, 0, 1, 3, 3, 1, - 1, 0, 0, 2, 2, 0, 2, 2, 4, 2, - 4, 0, 1, 3, 1, 0, 1, 3, 1, 6, - 1, 2, 2, 2, 1, 1, 1, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 1, 2, 2, 2, 3, 4, 1, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 4, 3, 3, 3, 3, 3, 3, 5, 6, - 5, 6, 4, 6, 3, 5, 4, 5, 4, 5, - 3, 3, 3, 3, 3, 3, 3, 3, 4, 6, - 6, 8, 6, 0, 3, 0, 2, 5, 0, 1, - 1, 1, 2, 2, 2, 2, 1, 6, 6, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 4, 4, 5, 6, 1, 1, 3, - 5, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 3, 2, 1, 1, 3, 1, 1, 1, 4, 1, - 3, 2, 1, 1, 3, 1, 0, 1, 5, 1, - 0, 2, 1, 1, 0, 1, 0, 1, 2, 3, - 5, 1, 3, 1, 2, 2, 1, 0, 1, 0, - 2, 1, 3, 3, 4, 5, 4, 6, 8, 1, - 2, 1, 2, 1, 2, 1, 1, 0, 1, 2, - 1, 2, 1, 2, 1, 1, 1, 3 -}; - - -enum { YYENOMEM = -2 }; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = SQL_HSQL_EMPTY) - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ - do \ - if (yychar == SQL_HSQL_EMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (&yylloc, result, scanner, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ - while (0) - -/* Backward compatibility with an undocumented macro. - Use SQL_HSQL_error or SQL_HSQL_UNDEF. */ -#define YYERRCODE SQL_HSQL_UNDEF - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (0) -#endif - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) - - -/* Enable debugging if requested. */ -#if HSQL_DEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -# ifndef YY_LOCATION_PRINT -# if defined HSQL_LTYPE_IS_TRIVIAL && HSQL_LTYPE_IS_TRIVIAL - -/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ - -YY_ATTRIBUTE_UNUSED -static int -yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) -{ - int res = 0; - int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; - if (0 <= yylocp->first_line) - { - res += YYFPRINTF (yyo, "%d", yylocp->first_line); - if (0 <= yylocp->first_column) - res += YYFPRINTF (yyo, ".%d", yylocp->first_column); - } - if (0 <= yylocp->last_line) - { - if (yylocp->first_line < yylocp->last_line) - { - res += YYFPRINTF (yyo, "-%d", yylocp->last_line); - if (0 <= end_col) - res += YYFPRINTF (yyo, ".%d", end_col); - } - else if (0 <= end_col && yylocp->first_column < end_col) - res += YYFPRINTF (yyo, "-%d", end_col); - } - return res; - } - -# define YY_LOCATION_PRINT(File, Loc) \ - yy_location_print_ (File, &(Loc)) - -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -# endif /* !defined YY_LOCATION_PRINT */ - - -# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Kind, Value, Location, result, scanner); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*-----------------------------------. -| Print this symbol's value on YYO. | -`-----------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyo, - yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) -{ - FILE *yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (yylocationp); - YYUSE (result); - YYUSE (scanner); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yykind < YYNTOKENS) - YYPRINT (yyo, yytoknum[yykind], *yyvaluep); -# endif - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yykind); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - -/*---------------------------. -| Print this symbol on YYO. | -`---------------------------*/ - -static void -yy_symbol_print (FILE *yyo, - yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) -{ - YYFPRINTF (yyo, "%s %s (", - yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); - - YY_LOCATION_PRINT (yyo, *yylocationp); - YYFPRINTF (yyo, ": "); - yy_symbol_value_print (yyo, yykind, yyvaluep, yylocationp, result, scanner); - YYFPRINTF (yyo, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, - int yyrule, hsql::SQLParserResult* result, yyscan_t scanner) -{ - int yylno = yyrline[yyrule]; - int yynrhs = yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), - &yyvsp[(yyi + 1) - (yynrhs)], - &(yylsp[(yyi + 1) - (yynrhs)]), result, scanner); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, yylsp, Rule, result, scanner); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !HSQL_DEBUG */ -# define YYDPRINTF(Args) ((void) 0) -# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !HSQL_DEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -/* Context of a parse error. */ -typedef struct -{ - yy_state_t *yyssp; - yysymbol_kind_t yytoken; - YYLTYPE *yylloc; -} yypcontext_t; - -/* Put in YYARG at most YYARGN of the expected tokens given the - current YYCTX, and return the number of tokens stored in YYARG. If - YYARG is null, return the number of expected tokens (guaranteed to - be less than YYNTOKENS). Return YYENOMEM on memory exhaustion. - Return 0 if there are more than YYARGN expected tokens, yet fill - YYARG up to YYARGN. */ -static int -yypcontext_expected_tokens (const yypcontext_t *yyctx, - yysymbol_kind_t yyarg[], int yyargn) -{ - /* Actual size of YYARG. */ - int yycount = 0; - int yyn = yypact[+*yyctx->yyssp]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (!yyarg) - ++yycount; - else if (yycount == yyargn) - return 0; - else - yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx); - } - } - if (yyarg && yycount == 0 && 0 < yyargn) - yyarg[0] = YYSYMBOL_YYEMPTY; - return yycount; -} - - - - -#ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) -# else -/* Return the length of YYSTR. */ -static YYPTRDIFF_T -yystrlen (const char *yystr) -{ - YYPTRDIFF_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -#endif - -#ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -#endif - -#ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYPTRDIFF_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYPTRDIFF_T yyn = 0; - char const *yyp = yystr; - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - else - goto append; - - append: - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (yyres) - return yystpcpy (yyres, yystr) - yyres; - else - return yystrlen (yystr); -} -#endif - - -static int -yy_syntax_error_arguments (const yypcontext_t *yyctx, - yysymbol_kind_t yyarg[], int yyargn) -{ - /* Actual size of YYARG. */ - int yycount = 0; - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yyctx->yytoken != YYSYMBOL_YYEMPTY) - { - int yyn; - if (yyarg) - yyarg[yycount] = yyctx->yytoken; - ++yycount; - yyn = yypcontext_expected_tokens (yyctx, - yyarg ? yyarg + 1 : yyarg, yyargn - 1); - if (yyn == YYENOMEM) - return YYENOMEM; - else - yycount += yyn; - } - return yycount; -} - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return -1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return YYENOMEM if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, - const yypcontext_t *yyctx) -{ - enum { YYARGS_MAX = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; - /* Arguments of yyformat: reported tokens (one for the "unexpected", - one per "expected"). */ - yysymbol_kind_t yyarg[YYARGS_MAX]; - /* Cumulated lengths of YYARG. */ - YYPTRDIFF_T yysize = 0; - - /* Actual size of YYARG. */ - int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX); - if (yycount == YYENOMEM) - return YYENOMEM; - - switch (yycount) - { -#define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - default: /* Avoid compiler warnings. */ - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -#undef YYCASE_ - } - - /* Compute error message size. Don't count the "%s"s, but reserve - room for the terminator. */ - yysize = yystrlen (yyformat) - 2 * yycount + 1; - { - int yyi; - for (yyi = 0; yyi < yycount; ++yyi) - { - YYPTRDIFF_T yysize1 - = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]); - if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) - yysize = yysize1; - else - return YYENOMEM; - } - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return -1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]); - yyformat += 2; - } - else - { - ++yyp; - ++yyformat; - } - } - return 0; -} - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, - yysymbol_kind_t yykind, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, hsql::SQLParserResult* result, yyscan_t scanner) -{ - YYUSE (yyvaluep); - YYUSE (yylocationp); - YYUSE (result); - YYUSE (scanner); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - switch (yykind) - { - case YYSYMBOL_IDENTIFIER: /* IDENTIFIER */ -#line 194 "bison_parser.y" - { free(((*yyvaluep).sval)); } -#line 2204 "bison_parser.cpp" - break; - - case YYSYMBOL_STRING: /* STRING */ -#line 194 "bison_parser.y" - { free(((*yyvaluep).sval)); } -#line 2210 "bison_parser.cpp" - break; - - case YYSYMBOL_BIGINTVAL: /* BIGINTVAL */ -#line 194 "bison_parser.y" - { free(((*yyvaluep).sval)); } -#line 2216 "bison_parser.cpp" - break; - - case YYSYMBOL_FLOATVAL: /* FLOATVAL */ -#line 181 "bison_parser.y" - { } -#line 2222 "bison_parser.cpp" - break; - - case YYSYMBOL_INTVAL: /* INTVAL */ -#line 181 "bison_parser.y" - { } -#line 2228 "bison_parser.cpp" - break; - - case YYSYMBOL_statement_list: /* statement_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).stmt_vec)) { - for (auto ptr : *(((*yyvaluep).stmt_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).stmt_vec)); -} -#line 2241 "bison_parser.cpp" - break; - - case YYSYMBOL_statement: /* statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).statement)); } -#line 2247 "bison_parser.cpp" - break; - - case YYSYMBOL_preparable_statement: /* preparable_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).statement)); } -#line 2253 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_hints: /* opt_hints */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2266 "bison_parser.cpp" - break; - - case YYSYMBOL_hint_list: /* hint_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2279 "bison_parser.cpp" - break; - - case YYSYMBOL_hint: /* hint */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2285 "bison_parser.cpp" - break; - - case YYSYMBOL_transaction_statement: /* transaction_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).transaction_stmt)); } -#line 2291 "bison_parser.cpp" - break; - - case YYSYMBOL_prepare_statement: /* prepare_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).prep_stmt)); } -#line 2297 "bison_parser.cpp" - break; - - case YYSYMBOL_prepare_target_query: /* prepare_target_query */ -#line 194 "bison_parser.y" - { free(((*yyvaluep).sval)); } -#line 2303 "bison_parser.cpp" - break; - - case YYSYMBOL_execute_statement: /* execute_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).exec_stmt)); } -#line 2309 "bison_parser.cpp" - break; - - case YYSYMBOL_import_statement: /* import_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).import_stmt)); } -#line 2315 "bison_parser.cpp" - break; - - case YYSYMBOL_file_type: /* file_type */ -#line 181 "bison_parser.y" - { } -#line 2321 "bison_parser.cpp" - break; - - case YYSYMBOL_file_path: /* file_path */ -#line 194 "bison_parser.y" - { free(((*yyvaluep).sval)); } -#line 2327 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_import_export_options: /* opt_import_export_options */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).import_export_option_t)); } -#line 2333 "bison_parser.cpp" - break; - - case YYSYMBOL_import_export_options: /* import_export_options */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).import_export_option_t)); } -#line 2339 "bison_parser.cpp" - break; - - case YYSYMBOL_csv_option: /* csv_option */ -#line 203 "bison_parser.y" - { - free(((*yyvaluep).csv_option_t)->second); - delete (((*yyvaluep).csv_option_t)); -} -#line 2348 "bison_parser.cpp" - break; - - case YYSYMBOL_export_statement: /* export_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).export_stmt)); } -#line 2354 "bison_parser.cpp" - break; - - case YYSYMBOL_show_statement: /* show_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).show_stmt)); } -#line 2360 "bison_parser.cpp" - break; - - case YYSYMBOL_create_statement: /* create_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).create_stmt)); } -#line 2366 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_not_exists: /* opt_not_exists */ -#line 181 "bison_parser.y" - { } -#line 2372 "bison_parser.cpp" - break; - - case YYSYMBOL_table_elem_commalist: /* table_elem_commalist */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).table_element_vec)) { - for (auto ptr : *(((*yyvaluep).table_element_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).table_element_vec)); -} -#line 2385 "bison_parser.cpp" - break; - - case YYSYMBOL_table_elem: /* table_elem */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table_element_t)); } -#line 2391 "bison_parser.cpp" - break; - - case YYSYMBOL_column_def: /* column_def */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).column_t)); } -#line 2397 "bison_parser.cpp" - break; - - case YYSYMBOL_column_type: /* column_type */ -#line 181 "bison_parser.y" - { } -#line 2403 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_time_precision: /* opt_time_precision */ -#line 181 "bison_parser.y" - { } -#line 2409 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_decimal_specification: /* opt_decimal_specification */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).ival_pair)); } -#line 2415 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_column_constraints: /* opt_column_constraints */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).column_constraints_t)); } -#line 2421 "bison_parser.cpp" - break; - - case YYSYMBOL_column_constraints: /* column_constraints */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).column_constraints_t)); } -#line 2427 "bison_parser.cpp" - break; - - case YYSYMBOL_column_constraint: /* column_constraint */ -#line 181 "bison_parser.y" - { } -#line 2433 "bison_parser.cpp" - break; - - case YYSYMBOL_table_constraint: /* table_constraint */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table_constraint_t)); } -#line 2439 "bison_parser.cpp" - break; - - case YYSYMBOL_references_spec: /* references_spec */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).references_spec_t)); } -#line 2445 "bison_parser.cpp" - break; - - case YYSYMBOL_drop_statement: /* drop_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).drop_stmt)); } -#line 2451 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_exists: /* opt_exists */ -#line 181 "bison_parser.y" - { } -#line 2457 "bison_parser.cpp" - break; - - case YYSYMBOL_alter_statement: /* alter_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).alter_stmt)); } -#line 2463 "bison_parser.cpp" - break; - - case YYSYMBOL_alter_action: /* alter_action */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).alter_action_t)); } -#line 2469 "bison_parser.cpp" - break; - - case YYSYMBOL_drop_action: /* drop_action */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).drop_action_t)); } -#line 2475 "bison_parser.cpp" - break; - - case YYSYMBOL_delete_statement: /* delete_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).delete_stmt)); } -#line 2481 "bison_parser.cpp" - break; - - case YYSYMBOL_truncate_statement: /* truncate_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).delete_stmt)); } -#line 2487 "bison_parser.cpp" - break; - - case YYSYMBOL_insert_statement: /* insert_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).insert_stmt)); } -#line 2493 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_column_list: /* opt_column_list */ -#line 186 "bison_parser.y" - { - if (((*yyvaluep).str_vec)) { - for (auto ptr : *(((*yyvaluep).str_vec))) { - free(ptr); - } - } - delete (((*yyvaluep).str_vec)); -} -#line 2506 "bison_parser.cpp" - break; - - case YYSYMBOL_update_statement: /* update_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).update_stmt)); } -#line 2512 "bison_parser.cpp" - break; - - case YYSYMBOL_update_clause_commalist: /* update_clause_commalist */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).update_vec)) { - for (auto ptr : *(((*yyvaluep).update_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).update_vec)); -} -#line 2525 "bison_parser.cpp" - break; - - case YYSYMBOL_update_clause: /* update_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).update_t)); } -#line 2531 "bison_parser.cpp" - break; - - case YYSYMBOL_select_statement: /* select_statement */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } -#line 2537 "bison_parser.cpp" - break; - - case YYSYMBOL_select_within_set_operation: /* select_within_set_operation */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } -#line 2543 "bison_parser.cpp" - break; - - case YYSYMBOL_select_within_set_operation_no_parentheses: /* select_within_set_operation_no_parentheses */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } -#line 2549 "bison_parser.cpp" - break; - - case YYSYMBOL_select_with_paren: /* select_with_paren */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } -#line 2555 "bison_parser.cpp" - break; - - case YYSYMBOL_select_no_paren: /* select_no_paren */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } -#line 2561 "bison_parser.cpp" - break; - - case YYSYMBOL_set_operator: /* set_operator */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).set_operator_t)); } -#line 2567 "bison_parser.cpp" - break; - - case YYSYMBOL_set_type: /* set_type */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).set_operator_t)); } -#line 2573 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_all: /* opt_all */ -#line 181 "bison_parser.y" - { } -#line 2579 "bison_parser.cpp" - break; - - case YYSYMBOL_select_clause: /* select_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } -#line 2585 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_distinct: /* opt_distinct */ -#line 181 "bison_parser.y" - { } -#line 2591 "bison_parser.cpp" - break; - - case YYSYMBOL_select_list: /* select_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2604 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_from_clause: /* opt_from_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2610 "bison_parser.cpp" - break; - - case YYSYMBOL_from_clause: /* from_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2616 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_where: /* opt_where */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2622 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_group: /* opt_group */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).group_t)); } -#line 2628 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_having: /* opt_having */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2634 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_order: /* opt_order */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).order_vec)) { - for (auto ptr : *(((*yyvaluep).order_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).order_vec)); -} -#line 2647 "bison_parser.cpp" - break; - - case YYSYMBOL_order_list: /* order_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).order_vec)) { - for (auto ptr : *(((*yyvaluep).order_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).order_vec)); -} -#line 2660 "bison_parser.cpp" - break; - - case YYSYMBOL_order_desc: /* order_desc */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).order)); } -#line 2666 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_order_type: /* opt_order_type */ -#line 181 "bison_parser.y" - { } -#line 2672 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_null_ordering: /* opt_null_ordering */ -#line 181 "bison_parser.y" - { } -#line 2678 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_top: /* opt_top */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).limit)); } -#line 2684 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_limit: /* opt_limit */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).limit)); } -#line 2690 "bison_parser.cpp" - break; - - case YYSYMBOL_expr_list: /* expr_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2703 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_extended_literal_list: /* opt_extended_literal_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2716 "bison_parser.cpp" - break; - - case YYSYMBOL_extended_literal_list: /* extended_literal_list */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2729 "bison_parser.cpp" - break; - - case YYSYMBOL_casted_extended_literal: /* casted_extended_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2735 "bison_parser.cpp" - break; - - case YYSYMBOL_extended_literal: /* extended_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2741 "bison_parser.cpp" - break; - - case YYSYMBOL_expr_alias: /* expr_alias */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2747 "bison_parser.cpp" - break; - - case YYSYMBOL_expr: /* expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2753 "bison_parser.cpp" - break; - - case YYSYMBOL_operand: /* operand */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2759 "bison_parser.cpp" - break; - - case YYSYMBOL_scalar_expr: /* scalar_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2765 "bison_parser.cpp" - break; - - case YYSYMBOL_unary_expr: /* unary_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2771 "bison_parser.cpp" - break; - - case YYSYMBOL_binary_expr: /* binary_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2777 "bison_parser.cpp" - break; - - case YYSYMBOL_logic_expr: /* logic_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2783 "bison_parser.cpp" - break; - - case YYSYMBOL_in_expr: /* in_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2789 "bison_parser.cpp" - break; - - case YYSYMBOL_case_expr: /* case_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2795 "bison_parser.cpp" - break; - - case YYSYMBOL_case_list: /* case_list */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2801 "bison_parser.cpp" - break; - - case YYSYMBOL_exists_expr: /* exists_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2807 "bison_parser.cpp" - break; - - case YYSYMBOL_comp_expr: /* comp_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2813 "bison_parser.cpp" - break; - - case YYSYMBOL_function_expr: /* function_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2819 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_window: /* opt_window */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).window_description)); } -#line 2825 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_partition: /* opt_partition */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).expr_vec)) { - for (auto ptr : *(((*yyvaluep).expr_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).expr_vec)); -} -#line 2838 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_frame_clause: /* opt_frame_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).frame_description)); } -#line 2844 "bison_parser.cpp" - break; - - case YYSYMBOL_frame_type: /* frame_type */ -#line 181 "bison_parser.y" - { } -#line 2850 "bison_parser.cpp" - break; - - case YYSYMBOL_frame_bound: /* frame_bound */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).frame_bound)); } -#line 2856 "bison_parser.cpp" - break; - - case YYSYMBOL_extract_expr: /* extract_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2862 "bison_parser.cpp" - break; - - case YYSYMBOL_cast_expr: /* cast_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2868 "bison_parser.cpp" - break; - - case YYSYMBOL_datetime_field: /* datetime_field */ -#line 181 "bison_parser.y" - { } -#line 2874 "bison_parser.cpp" - break; - - case YYSYMBOL_datetime_field_plural: /* datetime_field_plural */ -#line 181 "bison_parser.y" - { } -#line 2880 "bison_parser.cpp" - break; - - case YYSYMBOL_duration_field: /* duration_field */ -#line 181 "bison_parser.y" - { } -#line 2886 "bison_parser.cpp" - break; - - case YYSYMBOL_array_expr: /* array_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2892 "bison_parser.cpp" - break; - - case YYSYMBOL_array_index: /* array_index */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2898 "bison_parser.cpp" - break; - - case YYSYMBOL_between_expr: /* between_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2904 "bison_parser.cpp" - break; - - case YYSYMBOL_column_name: /* column_name */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2910 "bison_parser.cpp" - break; - - case YYSYMBOL_literal: /* literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2916 "bison_parser.cpp" - break; - - case YYSYMBOL_string_literal: /* string_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2922 "bison_parser.cpp" - break; - - case YYSYMBOL_bool_literal: /* bool_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2928 "bison_parser.cpp" - break; - - case YYSYMBOL_num_literal: /* num_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2934 "bison_parser.cpp" - break; - - case YYSYMBOL_int_literal: /* int_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2940 "bison_parser.cpp" - break; - - case YYSYMBOL_null_literal: /* null_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2946 "bison_parser.cpp" - break; - - case YYSYMBOL_date_literal: /* date_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2952 "bison_parser.cpp" - break; - - case YYSYMBOL_interval_literal: /* interval_literal */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2958 "bison_parser.cpp" - break; - - case YYSYMBOL_param_expr: /* param_expr */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2964 "bison_parser.cpp" - break; - - case YYSYMBOL_table_ref: /* table_ref */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2970 "bison_parser.cpp" - break; - - case YYSYMBOL_table_ref_atomic: /* table_ref_atomic */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2976 "bison_parser.cpp" - break; - - case YYSYMBOL_nonjoin_table_ref_atomic: /* nonjoin_table_ref_atomic */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2982 "bison_parser.cpp" - break; - - case YYSYMBOL_table_ref_commalist: /* table_ref_commalist */ -#line 195 "bison_parser.y" - { - if (((*yyvaluep).table_vec)) { - for (auto ptr : *(((*yyvaluep).table_vec))) { - delete ptr; - } - } - delete (((*yyvaluep).table_vec)); -} -#line 2995 "bison_parser.cpp" - break; - - case YYSYMBOL_table_ref_name: /* table_ref_name */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 3001 "bison_parser.cpp" - break; - - case YYSYMBOL_table_ref_name_no_alias: /* table_ref_name_no_alias */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 3007 "bison_parser.cpp" - break; - - case YYSYMBOL_table_name: /* table_name */ -#line 182 "bison_parser.y" - { - free(((*yyvaluep).table_name).name); - free(((*yyvaluep).table_name).schema); -} -#line 3016 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_index_name: /* opt_index_name */ -#line 194 "bison_parser.y" - { free(((*yyvaluep).sval)); } -#line 3022 "bison_parser.cpp" - break; - - case YYSYMBOL_table_alias: /* table_alias */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } -#line 3028 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_table_alias: /* opt_table_alias */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } -#line 3034 "bison_parser.cpp" - break; - - case YYSYMBOL_alias: /* alias */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } -#line 3040 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_alias: /* opt_alias */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } -#line 3046 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_locking_clause: /* opt_locking_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).locking_clause_vec)); } -#line 3052 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_locking_clause_list: /* opt_locking_clause_list */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).locking_clause_vec)); } -#line 3058 "bison_parser.cpp" - break; - - case YYSYMBOL_locking_clause: /* locking_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).locking_t)); } -#line 3064 "bison_parser.cpp" - break; - - case YYSYMBOL_row_lock_mode: /* row_lock_mode */ -#line 181 "bison_parser.y" - { } -#line 3070 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_row_lock_policy: /* opt_row_lock_policy */ -#line 181 "bison_parser.y" - { } -#line 3076 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_with_clause: /* opt_with_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).with_description_vec)); } -#line 3082 "bison_parser.cpp" - break; - - case YYSYMBOL_with_clause: /* with_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).with_description_vec)); } -#line 3088 "bison_parser.cpp" - break; - - case YYSYMBOL_with_description_list: /* with_description_list */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).with_description_vec)); } -#line 3094 "bison_parser.cpp" - break; - - case YYSYMBOL_with_description: /* with_description */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).with_description_t)); } -#line 3100 "bison_parser.cpp" - break; - - case YYSYMBOL_join_clause: /* join_clause */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 3106 "bison_parser.cpp" - break; - - case YYSYMBOL_opt_join_type: /* opt_join_type */ -#line 181 "bison_parser.y" - { } -#line 3112 "bison_parser.cpp" - break; - - case YYSYMBOL_natural_join_type: /* natural_join_type */ -#line 181 "bison_parser.y" - { } -#line 3118 "bison_parser.cpp" - break; - - case YYSYMBOL_join_condition: /* join_condition */ -#line 207 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 3124 "bison_parser.cpp" - break; - - case YYSYMBOL_ident_commalist: /* ident_commalist */ -#line 186 "bison_parser.y" - { - if (((*yyvaluep).str_vec)) { - for (auto ptr : *(((*yyvaluep).str_vec))) { - free(ptr); - } - } - delete (((*yyvaluep).str_vec)); -} -#line 3137 "bison_parser.cpp" - break; - - default: - break; - } - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (hsql::SQLParserResult* result, yyscan_t scanner) -{ -/* Lookahead token kind. */ -int yychar; - - -/* The semantic value of the lookahead symbol. */ -/* Default value used for initialization, for pacifying older GCCs - or non-GCC compilers. */ -YY_INITIAL_VALUE (static YYSTYPE yyval_default;) -YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); - -/* Location data for the lookahead symbol. */ -static YYLTYPE yyloc_default -# if defined HSQL_LTYPE_IS_TRIVIAL && HSQL_LTYPE_IS_TRIVIAL - = { 1, 1, 1, 1 } -# endif -; -YYLTYPE yylloc = yyloc_default; - - /* Number of syntax errors so far. */ - int yynerrs = 0; - - yy_state_fast_t yystate = 0; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus = 0; - - /* Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* Their size. */ - YYPTRDIFF_T yystacksize = YYINITDEPTH; - - /* The state stack: array, bottom, top. */ - yy_state_t yyssa[YYINITDEPTH]; - yy_state_t *yyss = yyssa; - yy_state_t *yyssp = yyss; - - /* The semantic value stack: array, bottom, top. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp = yyvs; - - /* The location stack: array, bottom, top. */ - YYLTYPE yylsa[YYINITDEPTH]; - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp = yyls; - - int yyn; - /* The return value of yyparse. */ - int yyresult; - /* Lookahead symbol kind. */ - yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - YYLTYPE yyloc; - - /* The locations where the error started and ended. */ - YYLTYPE yyerror_range[3]; - - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yychar = SQL_HSQL_EMPTY; /* Cause a token to be read. */ - -/* User initialization code. */ -#line 81 "bison_parser.y" -{ - // Initialize - yylloc.first_column = 0; - yylloc.last_column = 0; - yylloc.first_line = 0; - yylloc.last_line = 0; - yylloc.total_column = 0; - yylloc.string_length = 0; -} - -#line 3244 "bison_parser.cpp" - - yylsp[0] = yylloc; - goto yysetstate; - - -/*------------------------------------------------------------. -| yynewstate -- push a new state, which is found in yystate. | -`------------------------------------------------------------*/ -yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - -/*--------------------------------------------------------------------. -| yysetstate -- set current state (the top of the stack) to yystate. | -`--------------------------------------------------------------------*/ -yysetstate: - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - YY_ASSERT (0 <= yystate && yystate < YYNSTATES); - YY_IGNORE_USELESS_CAST_BEGIN - *yyssp = YY_CAST (yy_state_t, yystate); - YY_IGNORE_USELESS_CAST_END - YY_STACK_PRINT (yyss, yyssp); - - if (yyss + yystacksize - 1 <= yyssp) -#if !defined yyoverflow && !defined YYSTACK_RELOCATE - goto yyexhaustedlab; -#else - { - /* Get the current used size of the three stacks, in elements. */ - YYPTRDIFF_T yysize = yyssp - yyss + 1; - -# if defined yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - yy_state_t *yyss1 = yyss; - YYSTYPE *yyvs1 = yyvs; - YYLTYPE *yyls1 = yyls; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * YYSIZEOF (*yyssp), - &yyvs1, yysize * YYSIZEOF (*yyvsp), - &yyls1, yysize * YYSIZEOF (*yylsp), - &yystacksize); - yyss = yyss1; - yyvs = yyvs1; - yyls = yyls1; - } -# else /* defined YYSTACK_RELOCATE */ - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yy_state_t *yyss1 = yyss; - union yyalloc *yyptr = - YY_CAST (union yyalloc *, - YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); - YYSTACK_RELOCATE (yyls_alloc, yyls); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - yylsp = yyls + yysize - 1; - - YY_IGNORE_USELESS_CAST_BEGIN - YYDPRINTF ((stderr, "Stack size increased to %ld\n", - YY_CAST (long, yystacksize))); - YY_IGNORE_USELESS_CAST_END - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } -#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ - if (yychar == SQL_HSQL_EMPTY) - { - YYDPRINTF ((stderr, "Reading a token\n")); - yychar = yylex (&yylval, &yylloc, scanner); - } - - if (yychar <= SQL_YYEOF) - { - yychar = SQL_YYEOF; - yytoken = YYSYMBOL_YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else if (yychar == SQL_HSQL_error) - { - /* The scanner already issued an error message, process directly - to error recovery. But do not keep the error token as - lookahead, it is too special and may lead us to an endless - loop in error recovery. */ - yychar = SQL_HSQL_UNDEF; - yytoken = YYSYMBOL_YYerror; - yyerror_range[1] = yylloc; - goto yyerrlab1; - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - *++yylsp = yylloc; - - /* Discard the shifted token. */ - yychar = SQL_HSQL_EMPTY; - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - /* Default location. */ - YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); - yyerror_range[1] = yyloc; - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: /* input: statement_list */ -#line 349 "bison_parser.y" - { - for (SQLStatement* stmt : *(yyvsp[0].stmt_vec)) { - // Transfers ownership of the statement. - result->addStatement(stmt); - } - - unsigned param_id = 0; - for (void* param : yyloc.param_list) { - if (param) { - Expr* expr = (Expr*)param; - expr->ival = param_id; - result->addParameter(expr); - ++param_id; - } - } - delete (yyvsp[0].stmt_vec); - } -#line 3472 "bison_parser.cpp" - break; - - case 3: /* statement_list: statement */ -#line 368 "bison_parser.y" - { - (yyvsp[0].statement)->stringLength = yylloc.string_length; - yylloc.string_length = 0; - (yyval.stmt_vec) = new std::vector(); - (yyval.stmt_vec)->push_back((yyvsp[0].statement)); -} -#line 3483 "bison_parser.cpp" - break; - - case 4: /* statement_list: statement_list ';' */ -#line 374 "bison_parser.y" - { - yylloc.string_length = 0; - (yyval.stmt_vec) = (yyvsp[-1].stmt_vec); -} -#line 3492 "bison_parser.cpp" - break; - - case 5: /* statement_list: statement_list ';' statement */ -#line 378 "bison_parser.y" - { - (yyvsp[0].statement)->stringLength = yylloc.string_length; - yylloc.string_length = 0; - (yyvsp[-2].stmt_vec)->push_back((yyvsp[0].statement)); - (yyval.stmt_vec) = (yyvsp[-2].stmt_vec); -} -#line 3503 "bison_parser.cpp" - break; - - case 6: /* statement: prepare_statement opt_hints */ -#line 385 "bison_parser.y" - { - (yyval.statement) = (yyvsp[-1].prep_stmt); - (yyval.statement)->hints = (yyvsp[0].expr_vec); -} -#line 3512 "bison_parser.cpp" - break; - - case 7: /* statement: preparable_statement opt_hints */ -#line 389 "bison_parser.y" - { - (yyval.statement) = (yyvsp[-1].statement); - (yyval.statement)->hints = (yyvsp[0].expr_vec); -} -#line 3521 "bison_parser.cpp" - break; - - case 8: /* statement: show_statement */ -#line 393 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].show_stmt); } -#line 3527 "bison_parser.cpp" - break; - - case 9: /* statement: import_statement */ -#line 394 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].import_stmt); } -#line 3533 "bison_parser.cpp" - break; - - case 10: /* statement: export_statement */ -#line 395 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].export_stmt); } -#line 3539 "bison_parser.cpp" - break; - - case 11: /* preparable_statement: select_statement */ -#line 397 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].select_stmt); } -#line 3545 "bison_parser.cpp" - break; - - case 12: /* preparable_statement: create_statement */ -#line 398 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].create_stmt); } -#line 3551 "bison_parser.cpp" - break; - - case 13: /* preparable_statement: insert_statement */ -#line 399 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].insert_stmt); } -#line 3557 "bison_parser.cpp" - break; - - case 14: /* preparable_statement: delete_statement */ -#line 400 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 3563 "bison_parser.cpp" - break; - - case 15: /* preparable_statement: truncate_statement */ -#line 401 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 3569 "bison_parser.cpp" - break; - - case 16: /* preparable_statement: update_statement */ -#line 402 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].update_stmt); } -#line 3575 "bison_parser.cpp" - break; - - case 17: /* preparable_statement: drop_statement */ -#line 403 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].drop_stmt); } -#line 3581 "bison_parser.cpp" - break; - - case 18: /* preparable_statement: alter_statement */ -#line 404 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].alter_stmt); } -#line 3587 "bison_parser.cpp" - break; - - case 19: /* preparable_statement: execute_statement */ -#line 405 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].exec_stmt); } -#line 3593 "bison_parser.cpp" - break; - - case 20: /* preparable_statement: transaction_statement */ -#line 406 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].transaction_stmt); } -#line 3599 "bison_parser.cpp" - break; - - case 21: /* opt_hints: WITH HINT '(' hint_list ')' */ -#line 412 "bison_parser.y" - { (yyval.expr_vec) = (yyvsp[-1].expr_vec); } -#line 3605 "bison_parser.cpp" - break; - - case 22: /* opt_hints: %empty */ -#line 413 "bison_parser.y" - { (yyval.expr_vec) = nullptr; } -#line 3611 "bison_parser.cpp" - break; - - case 23: /* hint_list: hint */ -#line 415 "bison_parser.y" - { - (yyval.expr_vec) = new std::vector(); - (yyval.expr_vec)->push_back((yyvsp[0].expr)); -} -#line 3620 "bison_parser.cpp" - break; - - case 24: /* hint_list: hint_list ',' hint */ -#line 419 "bison_parser.y" - { - (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); - (yyval.expr_vec) = (yyvsp[-2].expr_vec); -} -#line 3629 "bison_parser.cpp" - break; - - case 25: /* hint: IDENTIFIER */ -#line 424 "bison_parser.y" - { - (yyval.expr) = Expr::make(kExprHint); - (yyval.expr)->name = (yyvsp[0].sval); -} -#line 3638 "bison_parser.cpp" - break; - - case 26: /* hint: IDENTIFIER '(' extended_literal_list ')' */ -#line 428 "bison_parser.y" - { - (yyval.expr) = Expr::make(kExprHint); - (yyval.expr)->name = (yyvsp[-3].sval); - (yyval.expr)->exprList = (yyvsp[-1].expr_vec); -} -#line 3648 "bison_parser.cpp" - break; - - case 27: /* transaction_statement: BEGIN opt_transaction_keyword */ -#line 438 "bison_parser.y" - { (yyval.transaction_stmt) = new TransactionStatement(kBeginTransaction); } -#line 3654 "bison_parser.cpp" - break; - - case 28: /* transaction_statement: ROLLBACK opt_transaction_keyword */ -#line 439 "bison_parser.y" - { (yyval.transaction_stmt) = new TransactionStatement(kRollbackTransaction); } -#line 3660 "bison_parser.cpp" - break; - - case 29: /* transaction_statement: COMMIT opt_transaction_keyword */ -#line 440 "bison_parser.y" - { (yyval.transaction_stmt) = new TransactionStatement(kCommitTransaction); } -#line 3666 "bison_parser.cpp" - break; - - case 32: /* prepare_statement: PREPARE IDENTIFIER FROM prepare_target_query */ -#line 448 "bison_parser.y" - { - (yyval.prep_stmt) = new PrepareStatement(); - (yyval.prep_stmt)->name = (yyvsp[-2].sval); - (yyval.prep_stmt)->query = (yyvsp[0].sval); -} -#line 3676 "bison_parser.cpp" - break; - - case 34: /* execute_statement: EXECUTE IDENTIFIER */ -#line 456 "bison_parser.y" - { - (yyval.exec_stmt) = new ExecuteStatement(); - (yyval.exec_stmt)->name = (yyvsp[0].sval); -} -#line 3685 "bison_parser.cpp" - break; - - case 35: /* execute_statement: EXECUTE IDENTIFIER '(' opt_extended_literal_list ')' */ -#line 460 "bison_parser.y" - { - (yyval.exec_stmt) = new ExecuteStatement(); - (yyval.exec_stmt)->name = (yyvsp[-3].sval); - (yyval.exec_stmt)->parameters = (yyvsp[-1].expr_vec); -} -#line 3695 "bison_parser.cpp" - break; - - case 36: /* import_statement: IMPORT FROM file_type FILE file_path INTO table_name */ -#line 472 "bison_parser.y" - { - (yyval.import_stmt) = new ImportStatement((yyvsp[-4].import_type_t)); - (yyval.import_stmt)->filePath = (yyvsp[-2].sval); - (yyval.import_stmt)->schema = (yyvsp[0].table_name).schema; - (yyval.import_stmt)->tableName = (yyvsp[0].table_name).name; -} -#line 3706 "bison_parser.cpp" - break; - - case 37: /* import_statement: COPY table_name FROM file_path opt_import_export_options opt_where */ -#line 478 "bison_parser.y" - { - (yyval.import_stmt) = new ImportStatement((yyvsp[-1].import_export_option_t)->format); - (yyval.import_stmt)->filePath = (yyvsp[-2].sval); - (yyval.import_stmt)->schema = (yyvsp[-4].table_name).schema; - (yyval.import_stmt)->tableName = (yyvsp[-4].table_name).name; - (yyval.import_stmt)->whereClause = (yyvsp[0].expr); - if ((yyvsp[-1].import_export_option_t)->encoding) { - (yyval.import_stmt)->encoding = (yyvsp[-1].import_export_option_t)->encoding; - (yyvsp[-1].import_export_option_t)->encoding = nullptr; - } - if ((yyvsp[-1].import_export_option_t)->csv_options) { - (yyval.import_stmt)->csv_options = (yyvsp[-1].import_export_option_t)->csv_options; - (yyvsp[-1].import_export_option_t)->csv_options = nullptr; - } - delete (yyvsp[-1].import_export_option_t); -} -#line 3727 "bison_parser.cpp" - break; - - case 38: /* file_type: IDENTIFIER */ -#line 495 "bison_parser.y" - { - if (strcasecmp((yyvsp[0].sval), "csv") == 0) { - (yyval.import_type_t) = kImportCSV; - } else if (strcasecmp((yyvsp[0].sval), "tbl") == 0) { - (yyval.import_type_t) = kImportTbl; - } else if (strcasecmp((yyvsp[0].sval), "binary") == 0 || strcasecmp((yyvsp[0].sval), "bin") == 0) { - (yyval.import_type_t) = kImportBinary; - } else { - free((yyvsp[0].sval)); - yyerror(&yyloc, result, scanner, "File type is unknown."); - YYERROR; - } - free((yyvsp[0].sval)); -} -#line 3746 "bison_parser.cpp" - break; - - case 39: /* file_path: STRING */ -#line 510 "bison_parser.y" - { (yyval.sval) = (yyvsp[0].sval); } -#line 3752 "bison_parser.cpp" - break; - - case 40: /* opt_import_export_options: WITH '(' import_export_options ')' */ -#line 512 "bison_parser.y" - { (yyval.import_export_option_t) = (yyvsp[-1].import_export_option_t); } -#line 3758 "bison_parser.cpp" - break; - - case 41: /* opt_import_export_options: '(' import_export_options ')' */ -#line 513 "bison_parser.y" - { (yyval.import_export_option_t) = (yyvsp[-1].import_export_option_t); } -#line 3764 "bison_parser.cpp" - break; - - case 42: /* opt_import_export_options: %empty */ -#line 514 "bison_parser.y" - { (yyval.import_export_option_t) = new ImportExportOptions{}; } -#line 3770 "bison_parser.cpp" - break; - - case 43: /* import_export_options: import_export_options ',' FORMAT file_type */ -#line 516 "bison_parser.y" - { - if ((yyvsp[-3].import_export_option_t)->format != kImportAuto) { - delete (yyvsp[-3].import_export_option_t); - yyerror(&yyloc, result, scanner, "File type must only be provided once."); - YYERROR; - } - if ((yyvsp[-3].import_export_option_t)->csv_options && (yyvsp[0].import_type_t) != kImportCSV && (yyvsp[0].import_type_t) != kImportAuto) { - delete (yyvsp[-3].import_export_option_t); - yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); - YYERROR; - } - (yyvsp[-3].import_export_option_t)->format = (yyvsp[0].import_type_t); - (yyval.import_export_option_t) = (yyvsp[-3].import_export_option_t); -} -#line 3789 "bison_parser.cpp" - break; - - case 44: /* import_export_options: FORMAT file_type */ -#line 530 "bison_parser.y" - { - (yyval.import_export_option_t) = new ImportExportOptions{}; - (yyval.import_export_option_t)->format = (yyvsp[0].import_type_t); -} -#line 3798 "bison_parser.cpp" - break; - - case 45: /* import_export_options: import_export_options ',' ENCODING STRING */ -#line 534 "bison_parser.y" - { - if ((yyvsp[-3].import_export_option_t)->encoding) { - delete (yyvsp[-3].import_export_option_t); - free((yyvsp[0].sval)); - yyerror(&yyloc, result, scanner, "Encoding type must only be provided once."); - YYERROR; - } - (yyvsp[-3].import_export_option_t)->encoding = (yyvsp[0].sval); - (yyval.import_export_option_t) = (yyvsp[-3].import_export_option_t); -} -#line 3813 "bison_parser.cpp" - break; - - case 46: /* import_export_options: ENCODING STRING */ -#line 544 "bison_parser.y" - { - (yyval.import_export_option_t) = new ImportExportOptions{}; - (yyval.import_export_option_t)->encoding = (yyvsp[0].sval); -} -#line 3822 "bison_parser.cpp" - break; - - case 47: /* import_export_options: import_export_options ',' csv_option */ -#line 548 "bison_parser.y" - { - if ((yyvsp[-2].import_export_option_t)->format != kImportAuto && (yyvsp[-2].import_export_option_t)->format != kImportCSV) { - delete (yyvsp[-2].import_export_option_t); - free((yyvsp[0].csv_option_t)->second); - delete (yyvsp[0].csv_option_t); - yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); - YYERROR; - } - - if ((yyvsp[-2].import_export_option_t)->csv_options == nullptr) { - (yyvsp[-2].import_export_option_t)->csv_options = new CsvOptions{}; - } - - if (!(yyvsp[-2].import_export_option_t)->csv_options->accept_csv_option((yyvsp[0].csv_option_t))) { - free((yyvsp[0].csv_option_t)->second); - delete (yyvsp[0].csv_option_t); - delete (yyvsp[-2].import_export_option_t); - yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) cannot be provided more than once."); - YYERROR; - } - - delete (yyvsp[0].csv_option_t); - (yyval.import_export_option_t) = (yyvsp[-2].import_export_option_t); -} -#line 3851 "bison_parser.cpp" - break; - - case 48: /* import_export_options: csv_option */ -#line 572 "bison_parser.y" - { - (yyval.import_export_option_t) = new ImportExportOptions{}; - (yyval.import_export_option_t)->csv_options = new CsvOptions{}; - (yyval.import_export_option_t)->csv_options->accept_csv_option((yyvsp[0].csv_option_t)); - - delete (yyvsp[0].csv_option_t); -} -#line 3863 "bison_parser.cpp" - break; - - case 49: /* csv_option: IDENTIFIER STRING */ -#line 580 "bison_parser.y" - { - if (strcasecmp((yyvsp[-1].sval), "DELIMITER") == 0) { - (yyval.csv_option_t) = new std::pair(CsvOptionType::Delimiter, (yyvsp[0].sval)); - } else if (strcasecmp((yyvsp[-1].sval), "QUOTE") == 0) { - (yyval.csv_option_t) = new std::pair(CsvOptionType::Quote, (yyvsp[0].sval)); - } else { - free((yyvsp[-1].sval)); - free((yyvsp[0].sval)); - yyerror(&yyloc, result, scanner, "Unknown CSV option."); - YYERROR; - } - free((yyvsp[-1].sval)); -} -#line 3881 "bison_parser.cpp" - break; - - case 50: /* csv_option: NULL STRING */ -#line 593 "bison_parser.y" - { (yyval.csv_option_t) = new std::pair(CsvOptionType::Null, (yyvsp[0].sval)); } -#line 3887 "bison_parser.cpp" - break; - - case 51: /* export_statement: COPY table_name TO file_path opt_import_export_options */ -#line 600 "bison_parser.y" - { - (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_export_option_t)->format); - (yyval.export_stmt)->filePath = (yyvsp[-1].sval); - (yyval.export_stmt)->schema = (yyvsp[-3].table_name).schema; - (yyval.export_stmt)->tableName = (yyvsp[-3].table_name).name; - if ((yyvsp[0].import_export_option_t)->encoding) { - (yyval.export_stmt)->encoding = (yyvsp[0].import_export_option_t)->encoding; - (yyvsp[0].import_export_option_t)->encoding = nullptr; - } - if ((yyvsp[0].import_export_option_t)->csv_options) { - (yyval.export_stmt)->csv_options = (yyvsp[0].import_export_option_t)->csv_options; - (yyvsp[0].import_export_option_t)->csv_options = nullptr; - } - delete (yyvsp[0].import_export_option_t); -} -#line 3907 "bison_parser.cpp" - break; - - case 52: /* export_statement: COPY select_with_paren TO file_path opt_import_export_options */ -#line 615 "bison_parser.y" - { - (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_export_option_t)->format); - (yyval.export_stmt)->filePath = (yyvsp[-1].sval); - (yyval.export_stmt)->select = (yyvsp[-3].select_stmt); - if ((yyvsp[0].import_export_option_t)->encoding) { - (yyval.export_stmt)->encoding = (yyvsp[0].import_export_option_t)->encoding; - (yyvsp[0].import_export_option_t)->encoding = nullptr; - } - if ((yyvsp[0].import_export_option_t)->csv_options) { - (yyval.export_stmt)->csv_options = (yyvsp[0].import_export_option_t)->csv_options; - (yyvsp[0].import_export_option_t)->csv_options = nullptr; - } - delete (yyvsp[0].import_export_option_t); -} -#line 3926 "bison_parser.cpp" - break; - - case 53: /* show_statement: SHOW TABLES */ -#line 635 "bison_parser.y" - { (yyval.show_stmt) = new ShowStatement(kShowTables); } -#line 3932 "bison_parser.cpp" - break; - - case 54: /* show_statement: SHOW COLUMNS table_name */ -#line 636 "bison_parser.y" - { - (yyval.show_stmt) = new ShowStatement(kShowColumns); - (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; - (yyval.show_stmt)->name = (yyvsp[0].table_name).name; -} -#line 3942 "bison_parser.cpp" - break; - - case 55: /* show_statement: DESCRIBE table_name */ -#line 641 "bison_parser.y" - { - (yyval.show_stmt) = new ShowStatement(kShowColumns); - (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; - (yyval.show_stmt)->name = (yyvsp[0].table_name).name; -} -#line 3952 "bison_parser.cpp" - break; - - case 56: /* create_statement: CREATE TABLE opt_not_exists table_name FROM IDENTIFIER FILE file_path */ -#line 652 "bison_parser.y" - { - (yyval.create_stmt) = new CreateStatement(kCreateTableFromTbl); - (yyval.create_stmt)->ifNotExists = (yyvsp[-5].bval); - (yyval.create_stmt)->schema = (yyvsp[-4].table_name).schema; - (yyval.create_stmt)->tableName = (yyvsp[-4].table_name).name; - if (strcasecmp((yyvsp[-2].sval), "tbl") != 0) { - free((yyvsp[-2].sval)); - yyerror(&yyloc, result, scanner, "File type is unknown."); - YYERROR; - } - free((yyvsp[-2].sval)); - (yyval.create_stmt)->filePath = (yyvsp[0].sval); -} -#line 3970 "bison_parser.cpp" - break; - - case 57: /* create_statement: CREATE TABLE opt_not_exists table_name '(' table_elem_commalist ')' */ -#line 665 "bison_parser.y" - { - (yyval.create_stmt) = new CreateStatement(kCreateTable); - (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); - (yyval.create_stmt)->schema = (yyvsp[-3].table_name).schema; - (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; - (yyval.create_stmt)->setColumnDefsAndConstraints((yyvsp[-1].table_element_vec)); - delete (yyvsp[-1].table_element_vec); - if (result->errorMsg()) { - delete (yyval.create_stmt); - YYERROR; - } -} -#line 3987 "bison_parser.cpp" - break; - - case 58: /* create_statement: CREATE TABLE opt_not_exists table_name AS select_statement */ -#line 677 "bison_parser.y" - { - (yyval.create_stmt) = new CreateStatement(kCreateTable); - (yyval.create_stmt)->ifNotExists = (yyvsp[-3].bval); - (yyval.create_stmt)->schema = (yyvsp[-2].table_name).schema; - (yyval.create_stmt)->tableName = (yyvsp[-2].table_name).name; - (yyval.create_stmt)->select = (yyvsp[0].select_stmt); -} -#line 3999 "bison_parser.cpp" - break; - - case 59: /* create_statement: CREATE INDEX opt_not_exists opt_index_name ON table_name '(' ident_commalist ')' */ -#line 684 "bison_parser.y" - { - (yyval.create_stmt) = new CreateStatement(kCreateIndex); - (yyval.create_stmt)->indexName = (yyvsp[-5].sval); - (yyval.create_stmt)->ifNotExists = (yyvsp[-6].bval); - (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; - (yyval.create_stmt)->indexColumns = (yyvsp[-1].str_vec); -} -#line 4011 "bison_parser.cpp" - break; - - case 60: /* create_statement: CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement */ -#line 691 "bison_parser.y" - { - (yyval.create_stmt) = new CreateStatement(kCreateView); - (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); - (yyval.create_stmt)->schema = (yyvsp[-3].table_name).schema; - (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; - (yyval.create_stmt)->viewColumns = (yyvsp[-2].str_vec); - (yyval.create_stmt)->select = (yyvsp[0].select_stmt); -} -#line 4024 "bison_parser.cpp" - break; - - case 61: /* opt_not_exists: IF NOT EXISTS */ -#line 700 "bison_parser.y" - { (yyval.bval) = true; } -#line 4030 "bison_parser.cpp" - break; - - case 62: /* opt_not_exists: %empty */ -#line 701 "bison_parser.y" - { (yyval.bval) = false; } -#line 4036 "bison_parser.cpp" - break; - - case 63: /* table_elem_commalist: table_elem */ -#line 703 "bison_parser.y" - { - (yyval.table_element_vec) = new std::vector(); - (yyval.table_element_vec)->push_back((yyvsp[0].table_element_t)); -} -#line 4045 "bison_parser.cpp" - break; - - case 64: /* table_elem_commalist: table_elem_commalist ',' table_elem */ -#line 707 "bison_parser.y" - { - (yyvsp[-2].table_element_vec)->push_back((yyvsp[0].table_element_t)); - (yyval.table_element_vec) = (yyvsp[-2].table_element_vec); -} -#line 4054 "bison_parser.cpp" - break; - - case 65: /* table_elem: column_def */ -#line 712 "bison_parser.y" - { (yyval.table_element_t) = (yyvsp[0].column_t); } -#line 4060 "bison_parser.cpp" - break; - - case 66: /* table_elem: table_constraint */ -#line 713 "bison_parser.y" - { (yyval.table_element_t) = (yyvsp[0].table_constraint_t); } -#line 4066 "bison_parser.cpp" - break; - - case 67: /* column_def: IDENTIFIER column_type opt_column_constraints */ -#line 715 "bison_parser.y" - { - (yyval.column_t) = new ColumnDefinition((yyvsp[-2].sval), (yyvsp[-1].column_type_t), (yyvsp[0].column_constraints_t)->constraints, (yyvsp[0].column_constraints_t)->references); - if (!(yyval.column_t)->trySetNullableExplicit()) { - yyerror(&yyloc, result, scanner, ("Conflicting nullability constraints for " + std::string{(yyvsp[-2].sval)}).c_str()); - } - delete (yyvsp[0].column_constraints_t); -} -#line 4078 "bison_parser.cpp" - break; - - case 68: /* column_type: BIGINT */ -#line 723 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::BIGINT}; } -#line 4084 "bison_parser.cpp" - break; - - case 69: /* column_type: BOOLEAN */ -#line 724 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::BOOLEAN}; } -#line 4090 "bison_parser.cpp" - break; - - case 70: /* column_type: CHAR '(' INTVAL ')' */ -#line 725 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::CHAR, (yyvsp[-1].ival)}; } -#line 4096 "bison_parser.cpp" - break; - - case 71: /* column_type: CHARACTER_VARYING '(' INTVAL ')' */ -#line 726 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } -#line 4102 "bison_parser.cpp" - break; - - case 72: /* column_type: DATE */ -#line 727 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::DATE}; } -#line 4108 "bison_parser.cpp" - break; - - case 73: /* column_type: DATETIME */ -#line 728 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::DATETIME}; } -#line 4114 "bison_parser.cpp" - break; - - case 74: /* column_type: DECIMAL opt_decimal_specification */ -#line 729 "bison_parser.y" - { - (yyval.column_type_t) = ColumnType{DataType::DECIMAL, 0, (yyvsp[0].ival_pair)->first, (yyvsp[0].ival_pair)->second}; - delete (yyvsp[0].ival_pair); -} -#line 4123 "bison_parser.cpp" - break; - - case 75: /* column_type: DOUBLE */ -#line 733 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::DOUBLE}; } -#line 4129 "bison_parser.cpp" - break; - - case 76: /* column_type: FLOAT */ -#line 734 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::FLOAT}; } -#line 4135 "bison_parser.cpp" - break; - - case 77: /* column_type: INT */ -#line 735 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::INT}; } -#line 4141 "bison_parser.cpp" - break; - - case 78: /* column_type: INTEGER */ -#line 736 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::INT}; } -#line 4147 "bison_parser.cpp" - break; - - case 79: /* column_type: LONG */ -#line 737 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::LONG}; } -#line 4153 "bison_parser.cpp" - break; - - case 80: /* column_type: REAL */ -#line 738 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::REAL}; } -#line 4159 "bison_parser.cpp" - break; - - case 81: /* column_type: SMALLINT */ -#line 739 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::SMALLINT}; } -#line 4165 "bison_parser.cpp" - break; - - case 82: /* column_type: TEXT */ -#line 740 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::TEXT}; } -#line 4171 "bison_parser.cpp" - break; - - case 83: /* column_type: TIME opt_time_precision */ -#line 741 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::TIME, 0, (yyvsp[0].ival)}; } -#line 4177 "bison_parser.cpp" - break; - - case 84: /* column_type: TIMESTAMP */ -#line 742 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::DATETIME}; } -#line 4183 "bison_parser.cpp" - break; - - case 85: /* column_type: VARCHAR '(' INTVAL ')' */ -#line 743 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } -#line 4189 "bison_parser.cpp" - break; - - case 86: /* opt_time_precision: '(' INTVAL ')' */ -#line 745 "bison_parser.y" - { (yyval.ival) = (yyvsp[-1].ival); } -#line 4195 "bison_parser.cpp" - break; - - case 87: /* opt_time_precision: %empty */ -#line 746 "bison_parser.y" - { (yyval.ival) = 0; } -#line 4201 "bison_parser.cpp" - break; - - case 88: /* opt_decimal_specification: '(' INTVAL ',' INTVAL ')' */ -#line 748 "bison_parser.y" - { (yyval.ival_pair) = new std::pair{(yyvsp[-3].ival), (yyvsp[-1].ival)}; } -#line 4207 "bison_parser.cpp" - break; - - case 89: /* opt_decimal_specification: '(' INTVAL ')' */ -#line 749 "bison_parser.y" - { (yyval.ival_pair) = new std::pair{(yyvsp[-1].ival), 0}; } -#line 4213 "bison_parser.cpp" - break; - - case 90: /* opt_decimal_specification: %empty */ -#line 750 "bison_parser.y" - { (yyval.ival_pair) = new std::pair{0, 0}; } -#line 4219 "bison_parser.cpp" - break; - - case 91: /* opt_column_constraints: column_constraints */ -#line 752 "bison_parser.y" - { (yyval.column_constraints_t) = (yyvsp[0].column_constraints_t); } -#line 4225 "bison_parser.cpp" - break; - - case 92: /* opt_column_constraints: %empty */ -#line 753 "bison_parser.y" - { (yyval.column_constraints_t) = new ColumnConstraints(); } -#line 4231 "bison_parser.cpp" - break; - - case 93: /* column_constraints: column_constraint */ -#line 755 "bison_parser.y" - { - (yyval.column_constraints_t) = new ColumnConstraints(); - (yyval.column_constraints_t)->constraints->insert((yyvsp[0].column_constraint_t)); -} -#line 4240 "bison_parser.cpp" - break; - - case 94: /* column_constraints: column_constraints column_constraint */ -#line 759 "bison_parser.y" - { - (yyvsp[-1].column_constraints_t)->constraints->insert((yyvsp[0].column_constraint_t)); - (yyval.column_constraints_t) = (yyvsp[-1].column_constraints_t); -} -#line 4249 "bison_parser.cpp" - break; - - case 95: /* column_constraints: references_spec */ -#line 763 "bison_parser.y" - { - (yyval.column_constraints_t) = new ColumnConstraints(); - (yyval.column_constraints_t)->constraints->insert(ConstraintType::ForeignKey); - (yyval.column_constraints_t)->references->emplace_back((yyvsp[0].references_spec_t)); -} -#line 4259 "bison_parser.cpp" - break; - - case 96: /* column_constraints: column_constraints references_spec */ -#line 768 "bison_parser.y" - { - // Multiple foreign keys for the same column could be possible, so we do not raise an error in that case. - // Think of foreign keys referenced on multiple levels (returned item references sold item references items). - (yyvsp[-1].column_constraints_t)->constraints->insert(ConstraintType::ForeignKey); - (yyvsp[-1].column_constraints_t)->references->emplace_back((yyvsp[0].references_spec_t)); - (yyval.column_constraints_t) = (yyvsp[-1].column_constraints_t); -} -#line 4271 "bison_parser.cpp" - break; - - case 97: /* column_constraint: PRIMARY KEY */ -#line 776 "bison_parser.y" - { (yyval.column_constraint_t) = ConstraintType::PrimaryKey; } -#line 4277 "bison_parser.cpp" - break; - - case 98: /* column_constraint: UNIQUE */ -#line 777 "bison_parser.y" - { (yyval.column_constraint_t) = ConstraintType::Unique; } -#line 4283 "bison_parser.cpp" - break; - - case 99: /* column_constraint: NULL */ -#line 778 "bison_parser.y" - { (yyval.column_constraint_t) = ConstraintType::Null; } -#line 4289 "bison_parser.cpp" - break; - - case 100: /* column_constraint: NOT NULL */ -#line 779 "bison_parser.y" - { (yyval.column_constraint_t) = ConstraintType::NotNull; } -#line 4295 "bison_parser.cpp" - break; - - case 101: /* table_constraint: PRIMARY KEY '(' ident_commalist ')' */ -#line 781 "bison_parser.y" - { (yyval.table_constraint_t) = new TableConstraint(ConstraintType::PrimaryKey, (yyvsp[-1].str_vec)); } -#line 4301 "bison_parser.cpp" - break; - - case 102: /* table_constraint: UNIQUE '(' ident_commalist ')' */ -#line 782 "bison_parser.y" - { (yyval.table_constraint_t) = new TableConstraint(ConstraintType::Unique, (yyvsp[-1].str_vec)); } -#line 4307 "bison_parser.cpp" - break; - - case 103: /* table_constraint: FOREIGN KEY '(' ident_commalist ')' references_spec */ -#line 783 "bison_parser.y" - { (yyval.table_constraint_t) = new ForeignKeyConstraint((yyvsp[-2].str_vec), (yyvsp[0].references_spec_t)); } -#line 4313 "bison_parser.cpp" - break; - - case 104: /* references_spec: REFERENCES table_name opt_column_list */ -#line 785 "bison_parser.y" - { (yyval.references_spec_t) = new ReferencesSpecification((yyvsp[-1].table_name).schema, (yyvsp[-1].table_name).name, (yyvsp[0].str_vec)); } -#line 4319 "bison_parser.cpp" - break; - - case 105: /* drop_statement: DROP TABLE opt_exists table_name */ -#line 793 "bison_parser.y" - { - (yyval.drop_stmt) = new DropStatement(kDropTable); - (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); - (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; - (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; -} -#line 4330 "bison_parser.cpp" - break; - - case 106: /* drop_statement: DROP VIEW opt_exists table_name */ -#line 799 "bison_parser.y" - { - (yyval.drop_stmt) = new DropStatement(kDropView); - (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); - (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; - (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; -} -#line 4341 "bison_parser.cpp" - break; - - case 107: /* drop_statement: DEALLOCATE PREPARE IDENTIFIER */ -#line 805 "bison_parser.y" - { - (yyval.drop_stmt) = new DropStatement(kDropPreparedStatement); - (yyval.drop_stmt)->ifExists = false; - (yyval.drop_stmt)->name = (yyvsp[0].sval); -} -#line 4351 "bison_parser.cpp" - break; - - case 108: /* drop_statement: DROP INDEX opt_exists IDENTIFIER */ -#line 811 "bison_parser.y" - { - (yyval.drop_stmt) = new DropStatement(kDropIndex); - (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); - (yyval.drop_stmt)->indexName = (yyvsp[0].sval); -} -#line 4361 "bison_parser.cpp" - break; - - case 109: /* opt_exists: IF EXISTS */ -#line 817 "bison_parser.y" - { (yyval.bval) = true; } -#line 4367 "bison_parser.cpp" - break; - - case 110: /* opt_exists: %empty */ -#line 818 "bison_parser.y" - { (yyval.bval) = false; } -#line 4373 "bison_parser.cpp" - break; - - case 111: /* alter_statement: ALTER TABLE opt_exists table_name alter_action */ -#line 825 "bison_parser.y" - { - (yyval.alter_stmt) = new AlterStatement((yyvsp[-1].table_name).name, (yyvsp[0].alter_action_t)); - (yyval.alter_stmt)->ifTableExists = (yyvsp[-2].bval); - (yyval.alter_stmt)->schema = (yyvsp[-1].table_name).schema; -} -#line 4383 "bison_parser.cpp" - break; - - case 112: /* alter_action: drop_action */ -#line 831 "bison_parser.y" - { (yyval.alter_action_t) = (yyvsp[0].drop_action_t); } -#line 4389 "bison_parser.cpp" - break; - - case 113: /* drop_action: DROP COLUMN opt_exists IDENTIFIER */ -#line 833 "bison_parser.y" - { - (yyval.drop_action_t) = new DropColumnAction((yyvsp[0].sval)); - (yyval.drop_action_t)->ifExists = (yyvsp[-1].bval); -} -#line 4398 "bison_parser.cpp" - break; - - case 114: /* delete_statement: DELETE FROM table_name opt_where */ -#line 843 "bison_parser.y" - { - (yyval.delete_stmt) = new DeleteStatement(); - (yyval.delete_stmt)->schema = (yyvsp[-1].table_name).schema; - (yyval.delete_stmt)->tableName = (yyvsp[-1].table_name).name; - (yyval.delete_stmt)->expr = (yyvsp[0].expr); -} -#line 4409 "bison_parser.cpp" - break; - - case 115: /* truncate_statement: TRUNCATE table_name */ -#line 850 "bison_parser.y" - { - (yyval.delete_stmt) = new DeleteStatement(); - (yyval.delete_stmt)->schema = (yyvsp[0].table_name).schema; - (yyval.delete_stmt)->tableName = (yyvsp[0].table_name).name; -} -#line 4419 "bison_parser.cpp" - break; - - case 116: /* insert_statement: INSERT INTO table_name opt_column_list VALUES '(' extended_literal_list ')' */ -#line 861 "bison_parser.y" - { - (yyval.insert_stmt) = new InsertStatement(kInsertValues); - (yyval.insert_stmt)->schema = (yyvsp[-5].table_name).schema; - (yyval.insert_stmt)->tableName = (yyvsp[-5].table_name).name; - (yyval.insert_stmt)->columns = (yyvsp[-4].str_vec); - (yyval.insert_stmt)->values = (yyvsp[-1].expr_vec); -} -#line 4431 "bison_parser.cpp" - break; - - case 117: /* insert_statement: INSERT INTO table_name opt_column_list select_no_paren */ -#line 868 "bison_parser.y" - { - (yyval.insert_stmt) = new InsertStatement(kInsertSelect); - (yyval.insert_stmt)->schema = (yyvsp[-2].table_name).schema; - (yyval.insert_stmt)->tableName = (yyvsp[-2].table_name).name; - (yyval.insert_stmt)->columns = (yyvsp[-1].str_vec); - (yyval.insert_stmt)->select = (yyvsp[0].select_stmt); -} -#line 4443 "bison_parser.cpp" - break; - - case 118: /* opt_column_list: '(' ident_commalist ')' */ -#line 876 "bison_parser.y" - { (yyval.str_vec) = (yyvsp[-1].str_vec); } -#line 4449 "bison_parser.cpp" - break; - - case 119: /* opt_column_list: %empty */ -#line 877 "bison_parser.y" - { (yyval.str_vec) = nullptr; } -#line 4455 "bison_parser.cpp" - break; - - case 120: /* update_statement: UPDATE table_ref_name_no_alias SET update_clause_commalist opt_where */ -#line 884 "bison_parser.y" - { - (yyval.update_stmt) = new UpdateStatement(); - (yyval.update_stmt)->table = (yyvsp[-3].table); - (yyval.update_stmt)->updates = (yyvsp[-1].update_vec); - (yyval.update_stmt)->where = (yyvsp[0].expr); -} -#line 4466 "bison_parser.cpp" - break; - - case 121: /* update_clause_commalist: update_clause */ -#line 891 "bison_parser.y" - { - (yyval.update_vec) = new std::vector(); - (yyval.update_vec)->push_back((yyvsp[0].update_t)); -} -#line 4475 "bison_parser.cpp" - break; - - case 122: /* update_clause_commalist: update_clause_commalist ',' update_clause */ -#line 895 "bison_parser.y" - { - (yyvsp[-2].update_vec)->push_back((yyvsp[0].update_t)); - (yyval.update_vec) = (yyvsp[-2].update_vec); -} -#line 4484 "bison_parser.cpp" - break; - - case 123: /* update_clause: IDENTIFIER '=' expr */ -#line 900 "bison_parser.y" - { - (yyval.update_t) = new UpdateClause(); - (yyval.update_t)->column = (yyvsp[-2].sval); - (yyval.update_t)->value = (yyvsp[0].expr); -} -#line 4494 "bison_parser.cpp" - break; - - case 124: /* select_statement: opt_with_clause select_with_paren */ -#line 910 "bison_parser.y" - { - (yyval.select_stmt) = (yyvsp[0].select_stmt); - (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); -} -#line 4503 "bison_parser.cpp" - break; - - case 125: /* select_statement: opt_with_clause select_no_paren */ -#line 914 "bison_parser.y" - { - (yyval.select_stmt) = (yyvsp[0].select_stmt); - (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); -} -#line 4512 "bison_parser.cpp" - break; - - case 126: /* select_statement: opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit */ -#line 918 "bison_parser.y" - { - (yyval.select_stmt) = (yyvsp[-4].select_stmt); - if ((yyval.select_stmt)->setOperations == nullptr) { - (yyval.select_stmt)->setOperations = new std::vector(); - } - (yyval.select_stmt)->setOperations->push_back((yyvsp[-3].set_operator_t)); - (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[-2].select_stmt); - (yyval.select_stmt)->setOperations->back()->resultOrder = (yyvsp[-1].order_vec); - (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[0].limit); - (yyval.select_stmt)->withDescriptions = (yyvsp[-5].with_description_vec); -} -#line 4528 "bison_parser.cpp" - break; - - case 129: /* select_within_set_operation_no_parentheses: select_clause */ -#line 932 "bison_parser.y" - { (yyval.select_stmt) = (yyvsp[0].select_stmt); } -#line 4534 "bison_parser.cpp" - break; - - case 130: /* select_within_set_operation_no_parentheses: select_clause set_operator select_within_set_operation */ -#line 933 "bison_parser.y" - { - (yyval.select_stmt) = (yyvsp[-2].select_stmt); - if ((yyval.select_stmt)->setOperations == nullptr) { - (yyval.select_stmt)->setOperations = new std::vector(); - } - (yyval.select_stmt)->setOperations->push_back((yyvsp[-1].set_operator_t)); - (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[0].select_stmt); -} -#line 4547 "bison_parser.cpp" - break; - - case 131: /* select_with_paren: '(' select_no_paren ')' */ -#line 942 "bison_parser.y" - { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 4553 "bison_parser.cpp" - break; - - case 132: /* select_with_paren: '(' select_with_paren ')' */ -#line 943 "bison_parser.y" - { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 4559 "bison_parser.cpp" - break; - - case 133: /* select_no_paren: select_clause opt_order opt_limit opt_locking_clause */ -#line 945 "bison_parser.y" - { - (yyval.select_stmt) = (yyvsp[-3].select_stmt); - (yyval.select_stmt)->order = (yyvsp[-2].order_vec); - - // Limit could have been set by TOP. - if ((yyvsp[-1].limit)) { - delete (yyval.select_stmt)->limit; - (yyval.select_stmt)->limit = (yyvsp[-1].limit); - } - - if ((yyvsp[0].locking_clause_vec)) { - (yyval.select_stmt)->lockings = (yyvsp[0].locking_clause_vec); - } -} -#line 4578 "bison_parser.cpp" - break; - - case 134: /* select_no_paren: select_clause set_operator select_within_set_operation opt_order opt_limit opt_locking_clause */ -#line 959 "bison_parser.y" - { - (yyval.select_stmt) = (yyvsp[-5].select_stmt); - if ((yyval.select_stmt)->setOperations == nullptr) { - (yyval.select_stmt)->setOperations = new std::vector(); - } - (yyval.select_stmt)->setOperations->push_back((yyvsp[-4].set_operator_t)); - (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[-3].select_stmt); - (yyval.select_stmt)->setOperations->back()->resultOrder = (yyvsp[-2].order_vec); - (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[-1].limit); - (yyval.select_stmt)->lockings = (yyvsp[0].locking_clause_vec); -} -#line 4594 "bison_parser.cpp" - break; - - case 135: /* set_operator: set_type opt_all */ -#line 971 "bison_parser.y" - { - (yyval.set_operator_t) = (yyvsp[-1].set_operator_t); - (yyval.set_operator_t)->isAll = (yyvsp[0].bval); -} -#line 4603 "bison_parser.cpp" - break; - - case 136: /* set_type: UNION */ -#line 976 "bison_parser.y" - { - (yyval.set_operator_t) = new SetOperation(); - (yyval.set_operator_t)->setType = SetType::kSetUnion; -} -#line 4612 "bison_parser.cpp" - break; - - case 137: /* set_type: INTERSECT */ -#line 980 "bison_parser.y" - { - (yyval.set_operator_t) = new SetOperation(); - (yyval.set_operator_t)->setType = SetType::kSetIntersect; -} -#line 4621 "bison_parser.cpp" - break; - - case 138: /* set_type: EXCEPT */ -#line 984 "bison_parser.y" - { - (yyval.set_operator_t) = new SetOperation(); - (yyval.set_operator_t)->setType = SetType::kSetExcept; -} -#line 4630 "bison_parser.cpp" - break; - - case 139: /* opt_all: ALL */ -#line 989 "bison_parser.y" - { (yyval.bval) = true; } -#line 4636 "bison_parser.cpp" - break; - - case 140: /* opt_all: %empty */ -#line 990 "bison_parser.y" - { (yyval.bval) = false; } -#line 4642 "bison_parser.cpp" - break; - - case 141: /* select_clause: SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group opt_having */ -#line 992 "bison_parser.y" - { - (yyval.select_stmt) = new SelectStatement(); - (yyval.select_stmt)->limit = (yyvsp[-6].limit); - (yyval.select_stmt)->selectDistinct = (yyvsp[-5].bval); - (yyval.select_stmt)->selectList = (yyvsp[-4].expr_vec); - (yyval.select_stmt)->fromTable = (yyvsp[-3].table); - (yyval.select_stmt)->whereClause = (yyvsp[-2].expr); - (yyval.select_stmt)->groupBy = (yyvsp[-1].group_t); - if ((yyvsp[-1].group_t)) { - (yyval.select_stmt)->groupBy->having = (yyvsp[0].expr); - } else { - (yyval.select_stmt)->having = (yyvsp[0].expr); - } -} -#line 4661 "bison_parser.cpp" - break; - - case 142: /* opt_distinct: DISTINCT */ -#line 1007 "bison_parser.y" - { (yyval.bval) = true; } -#line 4667 "bison_parser.cpp" - break; - - case 143: /* opt_distinct: %empty */ -#line 1008 "bison_parser.y" - { (yyval.bval) = false; } -#line 4673 "bison_parser.cpp" - break; - - case 145: /* opt_from_clause: from_clause */ -#line 1012 "bison_parser.y" - { (yyval.table) = (yyvsp[0].table); } -#line 4679 "bison_parser.cpp" - break; - - case 146: /* opt_from_clause: %empty */ -#line 1013 "bison_parser.y" - { (yyval.table) = nullptr; } -#line 4685 "bison_parser.cpp" - break; - - case 147: /* from_clause: FROM table_ref */ -#line 1015 "bison_parser.y" - { (yyval.table) = (yyvsp[0].table); } -#line 4691 "bison_parser.cpp" - break; - - case 148: /* opt_where: WHERE expr */ -#line 1017 "bison_parser.y" - { (yyval.expr) = (yyvsp[0].expr); } -#line 4697 "bison_parser.cpp" - break; - - case 149: /* opt_where: %empty */ -#line 1018 "bison_parser.y" - { (yyval.expr) = nullptr; } -#line 4703 "bison_parser.cpp" - break; - - case 150: /* opt_group: GROUP BY expr_list */ -#line 1020 "bison_parser.y" - { - (yyval.group_t) = new GroupByDescription(); - (yyval.group_t)->columns = (yyvsp[0].expr_vec); -} -#line 4712 "bison_parser.cpp" - break; - - case 151: /* opt_group: %empty */ -#line 1024 "bison_parser.y" - { (yyval.group_t) = nullptr; } -#line 4718 "bison_parser.cpp" - break; - - case 152: /* opt_having: HAVING expr */ -#line 1026 "bison_parser.y" - { (yyval.expr) = (yyvsp[0].expr); } -#line 4724 "bison_parser.cpp" - break; - - case 153: /* opt_having: %empty */ -#line 1027 "bison_parser.y" - { (yyval.expr) = nullptr; } -#line 4730 "bison_parser.cpp" - break; - - case 154: /* opt_order: ORDER BY order_list */ -#line 1029 "bison_parser.y" - { (yyval.order_vec) = (yyvsp[0].order_vec); } -#line 4736 "bison_parser.cpp" - break; - - case 155: /* opt_order: %empty */ -#line 1030 "bison_parser.y" - { (yyval.order_vec) = nullptr; } -#line 4742 "bison_parser.cpp" - break; - - case 156: /* order_list: order_desc */ -#line 1032 "bison_parser.y" - { - (yyval.order_vec) = new std::vector(); - (yyval.order_vec)->push_back((yyvsp[0].order)); -} -#line 4751 "bison_parser.cpp" - break; - - case 157: /* order_list: order_list ',' order_desc */ -#line 1036 "bison_parser.y" - { - (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); - (yyval.order_vec) = (yyvsp[-2].order_vec); -} -#line 4760 "bison_parser.cpp" - break; - - case 158: /* order_desc: expr opt_order_type opt_null_ordering */ -#line 1041 "bison_parser.y" - { (yyval.order) = new OrderDescription((yyvsp[-1].order_type), (yyvsp[-2].expr), (yyvsp[0].null_ordering_t)); } -#line 4766 "bison_parser.cpp" - break; - - case 159: /* opt_order_type: ASC */ -#line 1043 "bison_parser.y" - { (yyval.order_type) = kOrderAsc; } -#line 4772 "bison_parser.cpp" - break; - - case 160: /* opt_order_type: DESC */ -#line 1044 "bison_parser.y" - { (yyval.order_type) = kOrderDesc; } -#line 4778 "bison_parser.cpp" - break; - - case 161: /* opt_order_type: %empty */ -#line 1045 "bison_parser.y" - { (yyval.order_type) = kOrderAsc; } -#line 4784 "bison_parser.cpp" - break; - - case 162: /* opt_null_ordering: %empty */ -#line 1047 "bison_parser.y" - { (yyval.null_ordering_t) = NullOrdering::Undefined; } -#line 4790 "bison_parser.cpp" - break; - - case 163: /* opt_null_ordering: IDENTIFIER IDENTIFIER */ -#line 1048 "bison_parser.y" - { - auto null_ordering = NullOrdering::Undefined; - if (strcasecmp((yyvsp[-1].sval), "nulls") == 0) { - if (strcasecmp((yyvsp[0].sval), "first") == 0) { - null_ordering = NullOrdering::First; - } else if (strcasecmp((yyvsp[0].sval), "last") == 0) { - null_ordering = NullOrdering::Last; - } - } - free((yyvsp[-1].sval)); - free((yyvsp[0].sval)); - - if (null_ordering == NullOrdering::Undefined) { - yyerror(&yyloc, result, scanner, "Expected NULLS FIRST or NULLS LAST ordering."); - YYERROR; - } - - (yyval.null_ordering_t) = null_ordering; -} -#line 4814 "bison_parser.cpp" - break; - - case 164: /* opt_top: TOP int_literal */ -#line 1070 "bison_parser.y" - { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } -#line 4820 "bison_parser.cpp" - break; - - case 165: /* opt_top: %empty */ -#line 1071 "bison_parser.y" - { (yyval.limit) = nullptr; } -#line 4826 "bison_parser.cpp" - break; - - case 166: /* opt_limit: LIMIT expr */ -#line 1073 "bison_parser.y" - { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } -#line 4832 "bison_parser.cpp" - break; - - case 167: /* opt_limit: OFFSET expr */ -#line 1074 "bison_parser.y" - { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } -#line 4838 "bison_parser.cpp" - break; - - case 168: /* opt_limit: LIMIT expr OFFSET expr */ -#line 1075 "bison_parser.y" - { (yyval.limit) = new LimitDescription((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 4844 "bison_parser.cpp" - break; - - case 169: /* opt_limit: LIMIT ALL */ -#line 1076 "bison_parser.y" - { (yyval.limit) = new LimitDescription(nullptr, nullptr); } -#line 4850 "bison_parser.cpp" - break; - - case 170: /* opt_limit: LIMIT ALL OFFSET expr */ -#line 1077 "bison_parser.y" - { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } -#line 4856 "bison_parser.cpp" - break; - - case 171: /* opt_limit: %empty */ -#line 1078 "bison_parser.y" - { (yyval.limit) = nullptr; } -#line 4862 "bison_parser.cpp" - break; - - case 172: /* expr_list: expr_alias */ -#line 1083 "bison_parser.y" - { - (yyval.expr_vec) = new std::vector(); - (yyval.expr_vec)->push_back((yyvsp[0].expr)); -} -#line 4871 "bison_parser.cpp" - break; - - case 173: /* expr_list: expr_list ',' expr_alias */ -#line 1087 "bison_parser.y" - { - (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); - (yyval.expr_vec) = (yyvsp[-2].expr_vec); -} -#line 4880 "bison_parser.cpp" - break; - - case 174: /* opt_extended_literal_list: extended_literal_list */ -#line 1093 "bison_parser.y" - { (yyval.expr_vec) = (yyvsp[0].expr_vec); } -#line 4886 "bison_parser.cpp" - break; - - case 175: /* opt_extended_literal_list: %empty */ -#line 1094 "bison_parser.y" - { (yyval.expr_vec) = nullptr; } -#line 4892 "bison_parser.cpp" - break; - - case 176: /* extended_literal_list: casted_extended_literal */ -#line 1096 "bison_parser.y" - { - (yyval.expr_vec) = new std::vector(); - (yyval.expr_vec)->push_back((yyvsp[0].expr)); -} -#line 4901 "bison_parser.cpp" - break; - - case 177: /* extended_literal_list: extended_literal_list ',' casted_extended_literal */ -#line 1100 "bison_parser.y" - { - (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); - (yyval.expr_vec) = (yyvsp[-2].expr_vec); -} -#line 4910 "bison_parser.cpp" - break; - - case 179: /* casted_extended_literal: CAST '(' extended_literal AS column_type ')' */ -#line 1105 "bison_parser.y" - { - (yyval.expr) = Expr::makeCast((yyvsp[-3].expr), (yyvsp[-1].column_type_t)); -} -#line 4918 "bison_parser.cpp" - break; - - case 180: /* extended_literal: literal */ -#line 1109 "bison_parser.y" - { - if ((yyvsp[0].expr)->type == ExprType::kExprParameter) { - delete (yyvsp[0].expr); - yyerror(&yyloc, result, scanner, "Parameter ? is not a valid literal."); - YYERROR; - } - (yyval.expr) = (yyvsp[0].expr); -} -#line 4931 "bison_parser.cpp" - break; - - case 181: /* extended_literal: '-' num_literal */ -#line 1117 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 4937 "bison_parser.cpp" - break; - - case 182: /* extended_literal: '-' interval_literal */ -#line 1118 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 4943 "bison_parser.cpp" - break; - - case 183: /* expr_alias: expr opt_alias */ -#line 1120 "bison_parser.y" - { - (yyval.expr) = (yyvsp[-1].expr); - if ((yyvsp[0].alias_t)) { - (yyval.expr)->alias = (yyvsp[0].alias_t)->name; - (yyvsp[0].alias_t)->name = nullptr; - delete (yyvsp[0].alias_t); - } -} -#line 4956 "bison_parser.cpp" - break; - - case 189: /* operand: '(' expr ')' */ -#line 1131 "bison_parser.y" - { (yyval.expr) = (yyvsp[-1].expr); } -#line 4962 "bison_parser.cpp" - break; - - case 199: /* operand: '(' select_no_paren ')' */ -#line 1133 "bison_parser.y" - { - (yyval.expr) = Expr::makeSelect((yyvsp[-1].select_stmt)); -} -#line 4970 "bison_parser.cpp" - break; - - case 202: /* unary_expr: '-' operand */ -#line 1139 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 4976 "bison_parser.cpp" - break; - - case 203: /* unary_expr: NOT operand */ -#line 1140 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } -#line 4982 "bison_parser.cpp" - break; - - case 204: /* unary_expr: operand ISNULL */ -#line 1141 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-1].expr)); } -#line 4988 "bison_parser.cpp" - break; - - case 205: /* unary_expr: operand IS NULL */ -#line 1142 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-2].expr)); } -#line 4994 "bison_parser.cpp" - break; - - case 206: /* unary_expr: operand IS NOT NULL */ -#line 1143 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, (yyvsp[-3].expr))); } -#line 5000 "bison_parser.cpp" - break; - - case 208: /* binary_expr: operand '-' operand */ -#line 1145 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMinus, (yyvsp[0].expr)); } -#line 5006 "bison_parser.cpp" - break; - - case 209: /* binary_expr: operand '+' operand */ -#line 1146 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPlus, (yyvsp[0].expr)); } -#line 5012 "bison_parser.cpp" - break; - - case 210: /* binary_expr: operand '/' operand */ -#line 1147 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpSlash, (yyvsp[0].expr)); } -#line 5018 "bison_parser.cpp" - break; - - case 211: /* binary_expr: operand '*' operand */ -#line 1148 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAsterisk, (yyvsp[0].expr)); } -#line 5024 "bison_parser.cpp" - break; - - case 212: /* binary_expr: operand '%' operand */ -#line 1149 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPercentage, (yyvsp[0].expr)); } -#line 5030 "bison_parser.cpp" - break; - - case 213: /* binary_expr: operand MOD operand */ -#line 1150 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMod, (yyvsp[0].expr)); } -#line 5036 "bison_parser.cpp" - break; - - case 214: /* binary_expr: operand DIV operand */ -#line 1151 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpDiv, (yyvsp[0].expr)); } -#line 5042 "bison_parser.cpp" - break; - - case 215: /* binary_expr: operand '^' operand */ -#line 1152 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitXor, (yyvsp[0].expr)); } -#line 5048 "bison_parser.cpp" - break; - - case 216: /* binary_expr: operand '&' operand */ -#line 1153 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitAnd, (yyvsp[0].expr)); } -#line 5054 "bison_parser.cpp" - break; - - case 217: /* binary_expr: operand '|' operand */ -#line 1154 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitOr, (yyvsp[0].expr)); } -#line 5060 "bison_parser.cpp" - break; - - case 218: /* binary_expr: operand BITSHIFTLEFT operand */ -#line 1155 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitShiftLeft, (yyvsp[0].expr)); } -#line 5066 "bison_parser.cpp" - break; - - case 219: /* binary_expr: operand BITSHIFTRIGHT operand */ -#line 1156 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpBitShiftRight, (yyvsp[0].expr)); } -#line 5072 "bison_parser.cpp" - break; - - case 220: /* binary_expr: operand LIKE operand */ -#line 1157 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } -#line 5078 "bison_parser.cpp" - break; - - case 221: /* binary_expr: operand NOT LIKE operand */ -#line 1158 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } -#line 5084 "bison_parser.cpp" - break; - - case 222: /* binary_expr: operand ILIKE operand */ -#line 1159 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpILike, (yyvsp[0].expr)); } -#line 5090 "bison_parser.cpp" - break; - - case 223: /* binary_expr: operand CONCAT operand */ -#line 1160 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpConcat, (yyvsp[0].expr)); } -#line 5096 "bison_parser.cpp" - break; - - case 224: /* logic_expr: expr AND expr */ -#line 1162 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } -#line 5102 "bison_parser.cpp" - break; - - case 225: /* logic_expr: expr LOGICALAND expr */ -#line 1163 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } -#line 5108 "bison_parser.cpp" - break; - - case 226: /* logic_expr: expr OR expr */ -#line 1164 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } -#line 5114 "bison_parser.cpp" - break; - - case 227: /* logic_expr: expr LOGICALOR expr */ -#line 1165 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } -#line 5120 "bison_parser.cpp" - break; - - case 228: /* in_expr: operand IN '(' expr_list ')' */ -#line 1167 "bison_parser.y" - { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } -#line 5126 "bison_parser.cpp" - break; - - case 229: /* in_expr: operand NOT IN '(' expr_list ')' */ -#line 1168 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } -#line 5132 "bison_parser.cpp" - break; - - case 230: /* in_expr: operand IN '(' select_no_paren ')' */ -#line 1169 "bison_parser.y" - { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } -#line 5138 "bison_parser.cpp" - break; - - case 231: /* in_expr: operand NOT IN '(' select_no_paren ')' */ -#line 1170 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } -#line 5144 "bison_parser.cpp" - break; - - case 232: /* case_expr: CASE expr case_list END */ -#line 1174 "bison_parser.y" - { (yyval.expr) = Expr::makeCase((yyvsp[-2].expr), (yyvsp[-1].expr), nullptr); } -#line 5150 "bison_parser.cpp" - break; - - case 233: /* case_expr: CASE expr case_list ELSE expr END */ -#line 1175 "bison_parser.y" - { (yyval.expr) = Expr::makeCase((yyvsp[-4].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 5156 "bison_parser.cpp" - break; - - case 234: /* case_expr: CASE case_list END */ -#line 1176 "bison_parser.y" - { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-1].expr), nullptr); } -#line 5162 "bison_parser.cpp" - break; - - case 235: /* case_expr: CASE case_list ELSE expr END */ -#line 1177 "bison_parser.y" - { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 5168 "bison_parser.cpp" - break; - - case 236: /* case_list: WHEN expr THEN expr */ -#line 1179 "bison_parser.y" - { (yyval.expr) = Expr::makeCaseList(Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 5174 "bison_parser.cpp" - break; - - case 237: /* case_list: case_list WHEN expr THEN expr */ -#line 1180 "bison_parser.y" - { (yyval.expr) = Expr::caseListAppend((yyvsp[-4].expr), Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 5180 "bison_parser.cpp" - break; - - case 238: /* exists_expr: EXISTS '(' select_no_paren ')' */ -#line 1182 "bison_parser.y" - { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } -#line 5186 "bison_parser.cpp" - break; - - case 239: /* exists_expr: NOT EXISTS '(' select_no_paren ')' */ -#line 1183 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } -#line 5192 "bison_parser.cpp" - break; - - case 240: /* comp_expr: operand '=' operand */ -#line 1185 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } -#line 5198 "bison_parser.cpp" - break; - - case 241: /* comp_expr: operand EQUALS operand */ -#line 1186 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } -#line 5204 "bison_parser.cpp" - break; - - case 242: /* comp_expr: operand NULLSAFEEQUALS operand */ -#line 1187 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNullSafeEquals, (yyvsp[0].expr)); } -#line 5210 "bison_parser.cpp" - break; - - case 243: /* comp_expr: operand NOTEQUALS operand */ -#line 1188 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } -#line 5216 "bison_parser.cpp" - break; - - case 244: /* comp_expr: operand '<' operand */ -#line 1189 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLess, (yyvsp[0].expr)); } -#line 5222 "bison_parser.cpp" - break; - - case 245: /* comp_expr: operand '>' operand */ -#line 1190 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreater, (yyvsp[0].expr)); } -#line 5228 "bison_parser.cpp" - break; - - case 246: /* comp_expr: operand LESSEQ operand */ -#line 1191 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } -#line 5234 "bison_parser.cpp" - break; - - case 247: /* comp_expr: operand GREATEREQ operand */ -#line 1192 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } -#line 5240 "bison_parser.cpp" - break; - - case 248: /* function_expr: IDENTIFIER '(' ')' opt_window */ -#line 1196 "bison_parser.y" - { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-3].sval), new std::vector(), false, (yyvsp[0].window_description)); } -#line 5246 "bison_parser.cpp" - break; - - case 249: /* function_expr: IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ -#line 1197 "bison_parser.y" - { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-5].sval), (yyvsp[-2].expr_vec), (yyvsp[-3].bval), (yyvsp[0].window_description)); } -#line 5252 "bison_parser.cpp" - break; - - case 250: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' ')' opt_window */ -#line 1198 "bison_parser.y" - { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-3].sval), (yyvsp[-5].sval), new std::vector(), false, (yyvsp[0].window_description)); } -#line 5258 "bison_parser.cpp" - break; - - case 251: /* function_expr: IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window */ -#line 1199 "bison_parser.y" - { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-5].sval), (yyvsp[-7].sval), (yyvsp[-2].expr_vec), (yyvsp[-3].bval), (yyvsp[0].window_description)); } -#line 5264 "bison_parser.cpp" - break; - - case 252: /* opt_window: OVER '(' opt_partition opt_order opt_frame_clause ')' */ -#line 1203 "bison_parser.y" - { (yyval.window_description) = new WindowDescription((yyvsp[-3].expr_vec), (yyvsp[-2].order_vec), (yyvsp[-1].frame_description)); } -#line 5270 "bison_parser.cpp" - break; - - case 253: /* opt_window: %empty */ -#line 1204 "bison_parser.y" - { (yyval.window_description) = nullptr; } -#line 5276 "bison_parser.cpp" - break; - - case 254: /* opt_partition: PARTITION BY expr_list */ -#line 1206 "bison_parser.y" - { (yyval.expr_vec) = (yyvsp[0].expr_vec); } -#line 5282 "bison_parser.cpp" - break; - - case 255: /* opt_partition: %empty */ -#line 1207 "bison_parser.y" - { (yyval.expr_vec) = nullptr; } -#line 5288 "bison_parser.cpp" - break; - - case 256: /* opt_frame_clause: frame_type frame_bound */ -#line 1212 "bison_parser.y" - { (yyval.frame_description) = new FrameDescription{(yyvsp[-1].frame_type), (yyvsp[0].frame_bound), new FrameBound{0, kCurrentRow, false}}; } -#line 5294 "bison_parser.cpp" - break; - - case 257: /* opt_frame_clause: frame_type BETWEEN frame_bound AND frame_bound */ -#line 1213 "bison_parser.y" - { (yyval.frame_description) = new FrameDescription{(yyvsp[-4].frame_type), (yyvsp[-2].frame_bound), (yyvsp[0].frame_bound)}; } -#line 5300 "bison_parser.cpp" - break; - - case 258: /* opt_frame_clause: %empty */ -#line 1214 "bison_parser.y" - { - (yyval.frame_description) = new FrameDescription{kRange, new FrameBound{0, kPreceding, true}, new FrameBound{0, kCurrentRow, false}}; -} -#line 5308 "bison_parser.cpp" - break; - - case 259: /* frame_type: RANGE */ -#line 1218 "bison_parser.y" - { (yyval.frame_type) = kRange; } -#line 5314 "bison_parser.cpp" - break; - - case 260: /* frame_type: ROWS */ -#line 1219 "bison_parser.y" - { (yyval.frame_type) = kRows; } -#line 5320 "bison_parser.cpp" - break; - - case 261: /* frame_type: GROUPS */ -#line 1220 "bison_parser.y" - { (yyval.frame_type) = kGroups; } -#line 5326 "bison_parser.cpp" - break; - - case 262: /* frame_bound: UNBOUNDED PRECEDING */ -#line 1222 "bison_parser.y" - { (yyval.frame_bound) = new FrameBound{0, kPreceding, true}; } -#line 5332 "bison_parser.cpp" - break; - - case 263: /* frame_bound: INTVAL PRECEDING */ -#line 1223 "bison_parser.y" - { (yyval.frame_bound) = new FrameBound{(yyvsp[-1].ival), kPreceding, false}; } -#line 5338 "bison_parser.cpp" - break; - - case 264: /* frame_bound: UNBOUNDED FOLLOWING */ -#line 1224 "bison_parser.y" - { (yyval.frame_bound) = new FrameBound{0, kFollowing, true}; } -#line 5344 "bison_parser.cpp" - break; - - case 265: /* frame_bound: INTVAL FOLLOWING */ -#line 1225 "bison_parser.y" - { (yyval.frame_bound) = new FrameBound{(yyvsp[-1].ival), kFollowing, false}; } -#line 5350 "bison_parser.cpp" - break; - - case 266: /* frame_bound: CURRENT_ROW */ -#line 1226 "bison_parser.y" - { (yyval.frame_bound) = new FrameBound{0, kCurrentRow, false}; } -#line 5356 "bison_parser.cpp" - break; - - case 267: /* extract_expr: EXTRACT '(' datetime_field FROM expr ')' */ -#line 1228 "bison_parser.y" - { (yyval.expr) = Expr::makeExtract((yyvsp[-3].datetime_field), (yyvsp[-1].expr)); } -#line 5362 "bison_parser.cpp" - break; - - case 268: /* cast_expr: CAST '(' expr AS column_type ')' */ -#line 1230 "bison_parser.y" - { (yyval.expr) = Expr::makeCast((yyvsp[-3].expr), (yyvsp[-1].column_type_t)); } -#line 5368 "bison_parser.cpp" - break; - - case 269: /* datetime_field: SECOND */ -#line 1232 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeSecond; } -#line 5374 "bison_parser.cpp" - break; - - case 270: /* datetime_field: MINUTE */ -#line 1233 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeMinute; } -#line 5380 "bison_parser.cpp" - break; - - case 271: /* datetime_field: HOUR */ -#line 1234 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeHour; } -#line 5386 "bison_parser.cpp" - break; - - case 272: /* datetime_field: DAY */ -#line 1235 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeDay; } -#line 5392 "bison_parser.cpp" - break; - - case 273: /* datetime_field: MONTH */ -#line 1236 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeMonth; } -#line 5398 "bison_parser.cpp" - break; - - case 274: /* datetime_field: YEAR */ -#line 1237 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeYear; } -#line 5404 "bison_parser.cpp" - break; - - case 275: /* datetime_field_plural: SECONDS */ -#line 1239 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeSecond; } -#line 5410 "bison_parser.cpp" - break; - - case 276: /* datetime_field_plural: MINUTES */ -#line 1240 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeMinute; } -#line 5416 "bison_parser.cpp" - break; - - case 277: /* datetime_field_plural: HOURS */ -#line 1241 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeHour; } -#line 5422 "bison_parser.cpp" - break; - - case 278: /* datetime_field_plural: DAYS */ -#line 1242 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeDay; } -#line 5428 "bison_parser.cpp" - break; - - case 279: /* datetime_field_plural: MONTHS */ -#line 1243 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeMonth; } -#line 5434 "bison_parser.cpp" - break; - - case 280: /* datetime_field_plural: YEARS */ -#line 1244 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeYear; } -#line 5440 "bison_parser.cpp" - break; - - case 283: /* array_expr: ARRAY '[' expr_list ']' */ -#line 1248 "bison_parser.y" - { (yyval.expr) = Expr::makeArray((yyvsp[-1].expr_vec)); } -#line 5446 "bison_parser.cpp" - break; - - case 284: /* array_index: operand '[' int_literal ']' */ -#line 1250 "bison_parser.y" - { (yyval.expr) = Expr::makeArrayIndex((yyvsp[-3].expr), (yyvsp[-1].expr)->ival); } -#line 5452 "bison_parser.cpp" - break; - - case 285: /* between_expr: operand BETWEEN operand AND operand */ -#line 1252 "bison_parser.y" - { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 5458 "bison_parser.cpp" - break; - - case 286: /* between_expr: operand NOT BETWEEN operand AND operand */ -#line 1253 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeBetween((yyvsp[-5].expr), (yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 5464 "bison_parser.cpp" - break; - - case 287: /* column_name: IDENTIFIER */ -#line 1255 "bison_parser.y" - { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } -#line 5470 "bison_parser.cpp" - break; - - case 288: /* column_name: OFFSET */ -#line 1256 "bison_parser.y" - { (yyval.expr) = Expr::makeColumnRef(strdup("offset")); } -#line 5476 "bison_parser.cpp" - break; - - case 289: /* column_name: IDENTIFIER '.' IDENTIFIER */ -#line 1257 "bison_parser.y" - { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 5482 "bison_parser.cpp" - break; - - case 290: /* column_name: IDENTIFIER '.' IDENTIFIER '.' IDENTIFIER */ -#line 1258 "bison_parser.y" - { (yyval.expr) = Expr::makeColumnRef((yyvsp[-4].sval), (yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 5488 "bison_parser.cpp" - break; - - case 291: /* column_name: '*' */ -#line 1259 "bison_parser.y" - { (yyval.expr) = Expr::makeStar(); } -#line 5494 "bison_parser.cpp" - break; - - case 292: /* column_name: IDENTIFIER '.' '*' */ -#line 1260 "bison_parser.y" - { (yyval.expr) = Expr::makeStar((yyvsp[-2].sval)); } -#line 5500 "bison_parser.cpp" - break; - - case 300: /* string_literal: STRING */ -#line 1264 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } -#line 5506 "bison_parser.cpp" - break; - - case 301: /* bool_literal: TRUE */ -#line 1266 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral(true); } -#line 5512 "bison_parser.cpp" - break; - - case 302: /* bool_literal: FALSE */ -#line 1267 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral(false); } -#line 5518 "bison_parser.cpp" - break; - - case 303: /* num_literal: FLOATVAL */ -#line 1269 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } -#line 5524 "bison_parser.cpp" - break; - - case 305: /* int_literal: INTVAL */ -#line 1272 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } -#line 5530 "bison_parser.cpp" - break; - - case 306: /* int_literal: BIGINTVAL */ -#line 1273 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteralIntString((yyvsp[0].sval)); } -#line 5536 "bison_parser.cpp" - break; - - case 307: /* null_literal: NULL */ -#line 1275 "bison_parser.y" - { (yyval.expr) = Expr::makeNullLiteral(); } -#line 5542 "bison_parser.cpp" - break; - - case 308: /* date_literal: DATE STRING */ -#line 1277 "bison_parser.y" - { - int day{0}, month{0}, year{0}, chars_parsed{0}; - // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character - if (sscanf((yyvsp[0].sval), "%4d-%2d-%2d%n", &day, &month, &year, &chars_parsed) != 3 || (yyvsp[0].sval)[chars_parsed] != 0) { - free((yyvsp[0].sval)); - yyerror(&yyloc, result, scanner, "Found incorrect date format. Expected format: YYYY-MM-DD"); - YYERROR; - } - (yyval.expr) = Expr::makeDateLiteral((yyvsp[0].sval)); -} -#line 5557 "bison_parser.cpp" - break; - - case 309: /* interval_literal: INTVAL duration_field */ -#line 1288 "bison_parser.y" - { (yyval.expr) = Expr::makeIntervalLiteral((yyvsp[-1].ival), (yyvsp[0].datetime_field)); } -#line 5563 "bison_parser.cpp" - break; - - case 310: /* interval_literal: INTERVAL STRING datetime_field */ -#line 1289 "bison_parser.y" - { - int duration{0}, chars_parsed{0}; - // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character - if (sscanf((yyvsp[-1].sval), "%d%n", &duration, &chars_parsed) != 1 || (yyvsp[-1].sval)[chars_parsed] != 0) { - free((yyvsp[-1].sval)); - yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER"); - YYERROR; - } - free((yyvsp[-1].sval)); - (yyval.expr) = Expr::makeIntervalLiteral(duration, (yyvsp[0].datetime_field)); -} -#line 5579 "bison_parser.cpp" - break; - - case 311: /* interval_literal: INTERVAL STRING */ -#line 1300 "bison_parser.y" - { - int duration{0}, chars_parsed{0}; - // 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte - char unit_string[8]; - // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character - if (sscanf((yyvsp[0].sval), "%d %7s%n", &duration, unit_string, &chars_parsed) != 2 || (yyvsp[0].sval)[chars_parsed] != 0) { - free((yyvsp[0].sval)); - yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER INTERVAL_QUALIIFIER"); - YYERROR; - } - free((yyvsp[0].sval)); - - DatetimeField unit; - if (strcasecmp(unit_string, "second") == 0 || strcasecmp(unit_string, "seconds") == 0) { - unit = kDatetimeSecond; - } else if (strcasecmp(unit_string, "minute") == 0 || strcasecmp(unit_string, "minutes") == 0) { - unit = kDatetimeMinute; - } else if (strcasecmp(unit_string, "hour") == 0 || strcasecmp(unit_string, "hours") == 0) { - unit = kDatetimeHour; - } else if (strcasecmp(unit_string, "day") == 0 || strcasecmp(unit_string, "days") == 0) { - unit = kDatetimeDay; - } else if (strcasecmp(unit_string, "month") == 0 || strcasecmp(unit_string, "months") == 0) { - unit = kDatetimeMonth; - } else if (strcasecmp(unit_string, "year") == 0 || strcasecmp(unit_string, "years") == 0) { - unit = kDatetimeYear; - } else { - yyerror(&yyloc, result, scanner, "Interval qualifier is unknown."); - YYERROR; - } - (yyval.expr) = Expr::makeIntervalLiteral(duration, unit); -} -#line 5615 "bison_parser.cpp" - break; - - case 312: /* param_expr: '?' */ -#line 1332 "bison_parser.y" - { - (yyval.expr) = Expr::makeParameter(yylloc.total_column); - (yyval.expr)->ival2 = yyloc.param_list.size(); - yyloc.param_list.push_back((yyval.expr)); -} -#line 5625 "bison_parser.cpp" - break; - - case 314: /* table_ref: table_ref_commalist ',' table_ref_atomic */ -#line 1341 "bison_parser.y" - { - (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); - auto tbl = new TableRef(kTableCrossProduct); - tbl->list = (yyvsp[-2].table_vec); - (yyval.table) = tbl; -} -#line 5636 "bison_parser.cpp" - break; - - case 318: /* nonjoin_table_ref_atomic: '(' select_statement ')' opt_table_alias */ -#line 1350 "bison_parser.y" - { - auto tbl = new TableRef(kTableSelect); - tbl->select = (yyvsp[-2].select_stmt); - tbl->alias = (yyvsp[0].alias_t); - (yyval.table) = tbl; -} -#line 5647 "bison_parser.cpp" - break; - - case 319: /* table_ref_commalist: table_ref_atomic */ -#line 1357 "bison_parser.y" - { - (yyval.table_vec) = new std::vector(); - (yyval.table_vec)->push_back((yyvsp[0].table)); -} -#line 5656 "bison_parser.cpp" - break; - - case 320: /* table_ref_commalist: table_ref_commalist ',' table_ref_atomic */ -#line 1361 "bison_parser.y" - { - (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); - (yyval.table_vec) = (yyvsp[-2].table_vec); -} -#line 5665 "bison_parser.cpp" - break; - - case 321: /* table_ref_name: table_name opt_table_alias */ -#line 1366 "bison_parser.y" - { - auto tbl = new TableRef(kTableName); - tbl->schema = (yyvsp[-1].table_name).schema; - tbl->name = (yyvsp[-1].table_name).name; - tbl->alias = (yyvsp[0].alias_t); - (yyval.table) = tbl; -} -#line 5677 "bison_parser.cpp" - break; - - case 322: /* table_ref_name_no_alias: table_name */ -#line 1374 "bison_parser.y" - { - (yyval.table) = new TableRef(kTableName); - (yyval.table)->schema = (yyvsp[0].table_name).schema; - (yyval.table)->name = (yyvsp[0].table_name).name; -} -#line 5687 "bison_parser.cpp" - break; - - case 323: /* table_name: IDENTIFIER */ -#line 1380 "bison_parser.y" - { - (yyval.table_name).schema = nullptr; - (yyval.table_name).name = (yyvsp[0].sval); -} -#line 5696 "bison_parser.cpp" - break; - - case 324: /* table_name: IDENTIFIER '.' IDENTIFIER */ -#line 1384 "bison_parser.y" - { - (yyval.table_name).schema = (yyvsp[-2].sval); - (yyval.table_name).name = (yyvsp[0].sval); -} -#line 5705 "bison_parser.cpp" - break; - - case 325: /* opt_index_name: IDENTIFIER */ -#line 1389 "bison_parser.y" - { (yyval.sval) = (yyvsp[0].sval); } -#line 5711 "bison_parser.cpp" - break; - - case 326: /* opt_index_name: %empty */ -#line 1390 "bison_parser.y" - { (yyval.sval) = nullptr; } -#line 5717 "bison_parser.cpp" - break; - - case 328: /* table_alias: AS IDENTIFIER '(' ident_commalist ')' */ -#line 1392 "bison_parser.y" - { (yyval.alias_t) = new Alias((yyvsp[-3].sval), (yyvsp[-1].str_vec)); } -#line 5723 "bison_parser.cpp" - break; - - case 330: /* opt_table_alias: %empty */ -#line 1394 "bison_parser.y" - { (yyval.alias_t) = nullptr; } -#line 5729 "bison_parser.cpp" - break; - - case 331: /* alias: AS IDENTIFIER */ -#line 1396 "bison_parser.y" - { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } -#line 5735 "bison_parser.cpp" - break; - - case 332: /* alias: IDENTIFIER */ -#line 1397 "bison_parser.y" - { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } -#line 5741 "bison_parser.cpp" - break; - - case 334: /* opt_alias: %empty */ -#line 1399 "bison_parser.y" - { (yyval.alias_t) = nullptr; } -#line 5747 "bison_parser.cpp" - break; - - case 335: /* opt_locking_clause: opt_locking_clause_list */ -#line 1405 "bison_parser.y" - { (yyval.locking_clause_vec) = (yyvsp[0].locking_clause_vec); } -#line 5753 "bison_parser.cpp" - break; - - case 336: /* opt_locking_clause: %empty */ -#line 1406 "bison_parser.y" - { (yyval.locking_clause_vec) = nullptr; } -#line 5759 "bison_parser.cpp" - break; - - case 337: /* opt_locking_clause_list: locking_clause */ -#line 1408 "bison_parser.y" - { - (yyval.locking_clause_vec) = new std::vector(); - (yyval.locking_clause_vec)->push_back((yyvsp[0].locking_t)); -} -#line 5768 "bison_parser.cpp" - break; - - case 338: /* opt_locking_clause_list: opt_locking_clause_list locking_clause */ -#line 1412 "bison_parser.y" - { - (yyvsp[-1].locking_clause_vec)->push_back((yyvsp[0].locking_t)); - (yyval.locking_clause_vec) = (yyvsp[-1].locking_clause_vec); -} -#line 5777 "bison_parser.cpp" - break; - - case 339: /* locking_clause: FOR row_lock_mode opt_row_lock_policy */ -#line 1417 "bison_parser.y" - { - (yyval.locking_t) = new LockingClause(); - (yyval.locking_t)->rowLockMode = (yyvsp[-1].lock_mode_t); - (yyval.locking_t)->rowLockWaitPolicy = (yyvsp[0].lock_wait_policy_t); - (yyval.locking_t)->tables = nullptr; -} -#line 5788 "bison_parser.cpp" - break; - - case 340: /* locking_clause: FOR row_lock_mode OF ident_commalist opt_row_lock_policy */ -#line 1423 "bison_parser.y" - { - (yyval.locking_t) = new LockingClause(); - (yyval.locking_t)->rowLockMode = (yyvsp[-3].lock_mode_t); - (yyval.locking_t)->tables = (yyvsp[-1].str_vec); - (yyval.locking_t)->rowLockWaitPolicy = (yyvsp[0].lock_wait_policy_t); -} -#line 5799 "bison_parser.cpp" - break; - - case 341: /* row_lock_mode: UPDATE */ -#line 1430 "bison_parser.y" - { (yyval.lock_mode_t) = RowLockMode::ForUpdate; } -#line 5805 "bison_parser.cpp" - break; - - case 342: /* row_lock_mode: NO KEY UPDATE */ -#line 1431 "bison_parser.y" - { (yyval.lock_mode_t) = RowLockMode::ForNoKeyUpdate; } -#line 5811 "bison_parser.cpp" - break; - - case 343: /* row_lock_mode: SHARE */ -#line 1432 "bison_parser.y" - { (yyval.lock_mode_t) = RowLockMode::ForShare; } -#line 5817 "bison_parser.cpp" - break; - - case 344: /* row_lock_mode: KEY SHARE */ -#line 1433 "bison_parser.y" - { (yyval.lock_mode_t) = RowLockMode::ForKeyShare; } -#line 5823 "bison_parser.cpp" - break; - - case 345: /* opt_row_lock_policy: SKIP LOCKED */ -#line 1435 "bison_parser.y" - { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::SkipLocked; } -#line 5829 "bison_parser.cpp" - break; - - case 346: /* opt_row_lock_policy: NOWAIT */ -#line 1436 "bison_parser.y" - { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::NoWait; } -#line 5835 "bison_parser.cpp" - break; - - case 347: /* opt_row_lock_policy: %empty */ -#line 1437 "bison_parser.y" - { (yyval.lock_wait_policy_t) = RowLockWaitPolicy::None; } -#line 5841 "bison_parser.cpp" - break; - - case 349: /* opt_with_clause: %empty */ -#line 1443 "bison_parser.y" - { (yyval.with_description_vec) = nullptr; } -#line 5847 "bison_parser.cpp" - break; - - case 350: /* with_clause: WITH with_description_list */ -#line 1445 "bison_parser.y" - { (yyval.with_description_vec) = (yyvsp[0].with_description_vec); } -#line 5853 "bison_parser.cpp" - break; - - case 351: /* with_description_list: with_description */ -#line 1447 "bison_parser.y" - { - (yyval.with_description_vec) = new std::vector(); - (yyval.with_description_vec)->push_back((yyvsp[0].with_description_t)); -} -#line 5862 "bison_parser.cpp" - break; - - case 352: /* with_description_list: with_description_list ',' with_description */ -#line 1451 "bison_parser.y" - { - (yyvsp[-2].with_description_vec)->push_back((yyvsp[0].with_description_t)); - (yyval.with_description_vec) = (yyvsp[-2].with_description_vec); -} -#line 5871 "bison_parser.cpp" - break; - - case 353: /* with_description: IDENTIFIER AS select_with_paren */ -#line 1456 "bison_parser.y" - { - (yyval.with_description_t) = new WithDescription(); - (yyval.with_description_t)->alias = (yyvsp[-2].sval); - (yyval.with_description_t)->select = (yyvsp[0].select_stmt); -} -#line 5881 "bison_parser.cpp" - break; - - case 354: /* join_clause: table_ref_atomic NATURAL JOIN nonjoin_table_ref_atomic */ -#line 1466 "bison_parser.y" - { - (yyval.table) = new TableRef(kTableJoin); - (yyval.table)->join = new JoinDefinition(); - (yyval.table)->join->type = kJoinNatural; - (yyval.table)->join->natural = true; - (yyval.table)->join->left = (yyvsp[-3].table); - (yyval.table)->join->right = (yyvsp[0].table); -} -#line 5894 "bison_parser.cpp" - break; - - case 355: /* join_clause: table_ref_atomic NATURAL natural_join_type JOIN nonjoin_table_ref_atomic */ -#line 1474 "bison_parser.y" - { - (yyval.table) = new TableRef(kTableJoin); - (yyval.table)->join = new JoinDefinition(); - (yyval.table)->join->type = (JoinType)(yyvsp[-2].join_type); - (yyval.table)->join->natural = true; - (yyval.table)->join->left = (yyvsp[-4].table); - (yyval.table)->join->right = (yyvsp[0].table); -} -#line 5907 "bison_parser.cpp" - break; - - case 356: /* join_clause: table_ref_atomic CROSS JOIN nonjoin_table_ref_atomic */ -#line 1482 "bison_parser.y" - { - (yyval.table) = new TableRef(kTableJoin); - (yyval.table)->join = new JoinDefinition(); - (yyval.table)->join->type = kJoinCross; - (yyval.table)->join->left = (yyvsp[-3].table); - (yyval.table)->join->right = (yyvsp[0].table); -} -#line 5919 "bison_parser.cpp" - break; - - case 357: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic ON join_condition */ -#line 1489 "bison_parser.y" - { - (yyval.table) = new TableRef(kTableJoin); - (yyval.table)->join = new JoinDefinition(); - (yyval.table)->join->type = (JoinType)(yyvsp[-4].join_type); - (yyval.table)->join->left = (yyvsp[-5].table); - (yyval.table)->join->right = (yyvsp[-2].table); - (yyval.table)->join->condition = (yyvsp[0].expr); -} -#line 5932 "bison_parser.cpp" - break; - - case 358: /* join_clause: table_ref_atomic opt_join_type JOIN table_ref_atomic USING '(' ident_commalist ')' */ -#line 1497 "bison_parser.y" - { - (yyval.table) = new TableRef(kTableJoin); - (yyval.table)->join = new JoinDefinition(); - (yyval.table)->join->type = (yyvsp[-6].join_type); - (yyval.table)->join->left = (yyvsp[-7].table); - (yyval.table)->join->right = (yyvsp[-4].table); - (yyval.table)->join->namedColumns = (yyvsp[-1].str_vec); -} -#line 5945 "bison_parser.cpp" - break; - - case 359: /* opt_join_type: INNER */ -#line 1506 "bison_parser.y" - { (yyval.join_type) = kJoinInner; } -#line 5951 "bison_parser.cpp" - break; - - case 360: /* opt_join_type: LEFT OUTER */ -#line 1507 "bison_parser.y" - { (yyval.join_type) = kJoinLeft; } -#line 5957 "bison_parser.cpp" - break; - - case 361: /* opt_join_type: LEFT */ -#line 1508 "bison_parser.y" - { (yyval.join_type) = kJoinLeft; } -#line 5963 "bison_parser.cpp" - break; - - case 362: /* opt_join_type: RIGHT OUTER */ -#line 1509 "bison_parser.y" - { (yyval.join_type) = kJoinRight; } -#line 5969 "bison_parser.cpp" - break; - - case 363: /* opt_join_type: RIGHT */ -#line 1510 "bison_parser.y" - { (yyval.join_type) = kJoinRight; } -#line 5975 "bison_parser.cpp" - break; - - case 364: /* opt_join_type: FULL OUTER */ -#line 1511 "bison_parser.y" - { (yyval.join_type) = kJoinFull; } -#line 5981 "bison_parser.cpp" - break; - - case 365: /* opt_join_type: OUTER */ -#line 1512 "bison_parser.y" - { (yyval.join_type) = kJoinFull; } -#line 5987 "bison_parser.cpp" - break; - - case 366: /* opt_join_type: FULL */ -#line 1513 "bison_parser.y" - { (yyval.join_type) = kJoinFull; } -#line 5993 "bison_parser.cpp" - break; - - case 367: /* opt_join_type: %empty */ -#line 1514 "bison_parser.y" - { (yyval.join_type) = kJoinInner; } -#line 5999 "bison_parser.cpp" - break; - - case 368: /* natural_join_type: INNER */ -#line 1516 "bison_parser.y" - { (yyval.join_type) = kJoinInner; } -#line 6005 "bison_parser.cpp" - break; - - case 369: /* natural_join_type: LEFT OUTER */ -#line 1517 "bison_parser.y" - { (yyval.join_type) = kJoinLeft; } -#line 6011 "bison_parser.cpp" - break; - - case 370: /* natural_join_type: LEFT */ -#line 1518 "bison_parser.y" - { (yyval.join_type) = kJoinLeft; } -#line 6017 "bison_parser.cpp" - break; - - case 371: /* natural_join_type: RIGHT OUTER */ -#line 1519 "bison_parser.y" - { (yyval.join_type) = kJoinRight; } -#line 6023 "bison_parser.cpp" - break; - - case 372: /* natural_join_type: RIGHT */ -#line 1520 "bison_parser.y" - { (yyval.join_type) = kJoinRight; } -#line 6029 "bison_parser.cpp" - break; - - case 373: /* natural_join_type: FULL OUTER */ -#line 1521 "bison_parser.y" - { (yyval.join_type) = kJoinFull; } -#line 6035 "bison_parser.cpp" - break; - - case 374: /* natural_join_type: FULL */ -#line 1522 "bison_parser.y" - { (yyval.join_type) = kJoinFull; } -#line 6041 "bison_parser.cpp" - break; - - case 376: /* ident_commalist: IDENTIFIER */ -#line 1530 "bison_parser.y" - { - (yyval.str_vec) = new std::vector(); - (yyval.str_vec)->push_back((yyvsp[0].sval)); -} -#line 6050 "bison_parser.cpp" - break; - - case 377: /* ident_commalist: ident_commalist ',' IDENTIFIER */ -#line 1534 "bison_parser.y" - { - (yyvsp[-2].str_vec)->push_back((yyvsp[0].sval)); - (yyval.str_vec) = (yyvsp[-2].str_vec); -} -#line 6059 "bison_parser.cpp" - break; - - -#line 6063 "bison_parser.cpp" - - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - - *++yyvsp = yyval; - *++yylsp = yyloc; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - { - const int yylhs = yyr1[yyn] - YYNTOKENS; - const int yyi = yypgoto[yylhs] + *yyssp; - yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp - ? yytable[yyi] - : yydefgoto[yylhs]); - } - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == SQL_HSQL_EMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; - { - yypcontext_t yyctx - = {yyssp, yytoken, &yylloc}; - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == -1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = YY_CAST (char *, - YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); - if (yymsg) - { - yysyntax_error_status - = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); - yymsgp = yymsg; - } - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = YYENOMEM; - } - } - yyerror (&yylloc, result, scanner, yymsgp); - if (yysyntax_error_status == YYENOMEM) - goto yyexhaustedlab; - } - } - - yyerror_range[1] = yylloc; - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= SQL_YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == SQL_YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc, result, scanner); - yychar = SQL_HSQL_EMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - /* Pacify compilers when the user code never invokes YYERROR and the - label yyerrorlab therefore never appears in user code. */ - if (0) - YYERROR; - - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - /* Pop stack until we find a state that shifts the error token. */ - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYSYMBOL_YYerror; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - yyerror_range[1] = *yylsp; - yydestruct ("Error: popping", - YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp, result, scanner); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - yyerror_range[2] = yylloc; - ++yylsp; - YYLLOC_DEFAULT (*yylsp, yyerror_range, 2); - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - - -#if 1 -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (&yylloc, result, scanner, YY_("memory exhausted")); - yyresult = 2; - goto yyreturn; -#endif - - -/*-------------------------------------------------------. -| yyreturn -- parsing is finished, clean up and return. | -`-------------------------------------------------------*/ -yyreturn: - if (yychar != SQL_HSQL_EMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, &yylloc, result, scanner); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yylsp, result, scanner); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - return yyresult; -} - -#line 1540 "bison_parser.y" - - -/********************************* - ** Section 4: Additional C code - *********************************/ - -/* empty */ - -// clang-format on diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.h b/extern/hyrise_sql_parser/src/parser/bison_parser.h deleted file mode 100644 index 99553d48fc..0000000000 --- a/extern/hyrise_sql_parser/src/parser/bison_parser.h +++ /dev/null @@ -1,386 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.7.4. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, - Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, - especially those whose name start with YY_ or yy_. They are - private implementation details that can be changed or removed. */ - -#ifndef YY_HSQL_BISON_PARSER_H_INCLUDED -# define YY_HSQL_BISON_PARSER_H_INCLUDED -/* Debug traces. */ -#ifndef HSQL_DEBUG -# if defined YYDEBUG -#if YYDEBUG -# define HSQL_DEBUG 1 -# else -# define HSQL_DEBUG 0 -# endif -# else /* ! defined YYDEBUG */ -# define HSQL_DEBUG 0 -# endif /* ! defined YYDEBUG */ -#endif /* ! defined HSQL_DEBUG */ -#if HSQL_DEBUG -extern int hsql_debug; -#endif -/* "%code requires" blocks. */ -#line 39 "bison_parser.y" - -// %code requires block - -#include "../SQLParserResult.h" -#include "../sql/statements.h" -#include "parser_typedef.h" - -// Auto update column and line number -#define YY_USER_ACTION \ - yylloc->first_line = yylloc->last_line; \ - yylloc->first_column = yylloc->last_column; \ - for (int i = 0; yytext[i] != '\0'; i++) { \ - yylloc->total_column++; \ - yylloc->string_length++; \ - if (yytext[i] == '\n') { \ - yylloc->last_line++; \ - yylloc->last_column = 0; \ - } else { \ - yylloc->last_column++; \ - } \ - } - -#line 80 "bison_parser.h" - -/* Token kinds. */ -#ifndef HSQL_TOKENTYPE -# define HSQL_TOKENTYPE - enum hsql_tokentype - { - SQL_HSQL_EMPTY = -2, - SQL_YYEOF = 0, /* "end of file" */ - SQL_HSQL_error = 256, /* error */ - SQL_HSQL_UNDEF = 257, /* "invalid token" */ - SQL_IDENTIFIER = 258, /* IDENTIFIER */ - SQL_STRING = 259, /* STRING */ - SQL_BIGINTVAL = 260, /* BIGINTVAL */ - SQL_FLOATVAL = 261, /* FLOATVAL */ - SQL_INTVAL = 262, /* INTVAL */ - SQL_NULLSAFEEQUALS = 263, /* NULLSAFEEQUALS */ - SQL_DEALLOCATE = 264, /* DEALLOCATE */ - SQL_PARAMETERS = 265, /* PARAMETERS */ - SQL_INTERSECT = 266, /* INTERSECT */ - SQL_TEMPORARY = 267, /* TEMPORARY */ - SQL_TIMESTAMP = 268, /* TIMESTAMP */ - SQL_DISTINCT = 269, /* DISTINCT */ - SQL_NVARCHAR = 270, /* NVARCHAR */ - SQL_RESTRICT = 271, /* RESTRICT */ - SQL_TRUNCATE = 272, /* TRUNCATE */ - SQL_ANALYZE = 273, /* ANALYZE */ - SQL_BETWEEN = 274, /* BETWEEN */ - SQL_CASCADE = 275, /* CASCADE */ - SQL_COLUMNS = 276, /* COLUMNS */ - SQL_CONTROL = 277, /* CONTROL */ - SQL_DEFAULT = 278, /* DEFAULT */ - SQL_EXECUTE = 279, /* EXECUTE */ - SQL_EXPLAIN = 280, /* EXPLAIN */ - SQL_ENCODING = 281, /* ENCODING */ - SQL_INTEGER = 282, /* INTEGER */ - SQL_NATURAL = 283, /* NATURAL */ - SQL_PREPARE = 284, /* PREPARE */ - SQL_SCHEMAS = 285, /* SCHEMAS */ - SQL_CHARACTER_VARYING = 286, /* CHARACTER_VARYING */ - SQL_REAL = 287, /* REAL */ - SQL_DECIMAL = 288, /* DECIMAL */ - SQL_SMALLINT = 289, /* SMALLINT */ - SQL_BIGINT = 290, /* BIGINT */ - SQL_SPATIAL = 291, /* SPATIAL */ - SQL_VARCHAR = 292, /* VARCHAR */ - SQL_VIRTUAL = 293, /* VIRTUAL */ - SQL_DESCRIBE = 294, /* DESCRIBE */ - SQL_BEFORE = 295, /* BEFORE */ - SQL_COLUMN = 296, /* COLUMN */ - SQL_CREATE = 297, /* CREATE */ - SQL_DELETE = 298, /* DELETE */ - SQL_DIRECT = 299, /* DIRECT */ - SQL_DOUBLE = 300, /* DOUBLE */ - SQL_ESCAPE = 301, /* ESCAPE */ - SQL_EXCEPT = 302, /* EXCEPT */ - SQL_EXISTS = 303, /* EXISTS */ - SQL_EXTRACT = 304, /* EXTRACT */ - SQL_CAST = 305, /* CAST */ - SQL_FORMAT = 306, /* FORMAT */ - SQL_GLOBAL = 307, /* GLOBAL */ - SQL_HAVING = 308, /* HAVING */ - SQL_IMPORT = 309, /* IMPORT */ - SQL_INSERT = 310, /* INSERT */ - SQL_ISNULL = 311, /* ISNULL */ - SQL_OFFSET = 312, /* OFFSET */ - SQL_RENAME = 313, /* RENAME */ - SQL_SCHEMA = 314, /* SCHEMA */ - SQL_SELECT = 315, /* SELECT */ - SQL_SORTED = 316, /* SORTED */ - SQL_TABLES = 317, /* TABLES */ - SQL_UNLOAD = 318, /* UNLOAD */ - SQL_UPDATE = 319, /* UPDATE */ - SQL_VALUES = 320, /* VALUES */ - SQL_AFTER = 321, /* AFTER */ - SQL_ALTER = 322, /* ALTER */ - SQL_CROSS = 323, /* CROSS */ - SQL_DELTA = 324, /* DELTA */ - SQL_FLOAT = 325, /* FLOAT */ - SQL_GROUP = 326, /* GROUP */ - SQL_INDEX = 327, /* INDEX */ - SQL_INNER = 328, /* INNER */ - SQL_LIMIT = 329, /* LIMIT */ - SQL_LOCAL = 330, /* LOCAL */ - SQL_MERGE = 331, /* MERGE */ - SQL_MINUS = 332, /* MINUS */ - SQL_ORDER = 333, /* ORDER */ - SQL_OVER = 334, /* OVER */ - SQL_OUTER = 335, /* OUTER */ - SQL_RIGHT = 336, /* RIGHT */ - SQL_TABLE = 337, /* TABLE */ - SQL_UNION = 338, /* UNION */ - SQL_USING = 339, /* USING */ - SQL_WHERE = 340, /* WHERE */ - SQL_CALL = 341, /* CALL */ - SQL_CASE = 342, /* CASE */ - SQL_CHAR = 343, /* CHAR */ - SQL_COPY = 344, /* COPY */ - SQL_DATE = 345, /* DATE */ - SQL_DATETIME = 346, /* DATETIME */ - SQL_DESC = 347, /* DESC */ - SQL_DIV = 348, /* DIV */ - SQL_DROP = 349, /* DROP */ - SQL_ELSE = 350, /* ELSE */ - SQL_FILE = 351, /* FILE */ - SQL_FROM = 352, /* FROM */ - SQL_FULL = 353, /* FULL */ - SQL_HASH = 354, /* HASH */ - SQL_HINT = 355, /* HINT */ - SQL_INTO = 356, /* INTO */ - SQL_JOIN = 357, /* JOIN */ - SQL_LEFT = 358, /* LEFT */ - SQL_LIKE = 359, /* LIKE */ - SQL_LOAD = 360, /* LOAD */ - SQL_LONG = 361, /* LONG */ - SQL_NULL = 362, /* NULL */ - SQL_PARTITION = 363, /* PARTITION */ - SQL_PLAN = 364, /* PLAN */ - SQL_SHOW = 365, /* SHOW */ - SQL_TEXT = 366, /* TEXT */ - SQL_THEN = 367, /* THEN */ - SQL_TIME = 368, /* TIME */ - SQL_VIEW = 369, /* VIEW */ - SQL_WHEN = 370, /* WHEN */ - SQL_WITH = 371, /* WITH */ - SQL_ADD = 372, /* ADD */ - SQL_ALL = 373, /* ALL */ - SQL_AND = 374, /* AND */ - SQL_ASC = 375, /* ASC */ - SQL_END = 376, /* END */ - SQL_FOR = 377, /* FOR */ - SQL_INT = 378, /* INT */ - SQL_NOT = 379, /* NOT */ - SQL_OFF = 380, /* OFF */ - SQL_SET = 381, /* SET */ - SQL_TOP = 382, /* TOP */ - SQL_AS = 383, /* AS */ - SQL_BY = 384, /* BY */ - SQL_IF = 385, /* IF */ - SQL_IN = 386, /* IN */ - SQL_IS = 387, /* IS */ - SQL_OF = 388, /* OF */ - SQL_ON = 389, /* ON */ - SQL_OR = 390, /* OR */ - SQL_TO = 391, /* TO */ - SQL_NO = 392, /* NO */ - SQL_ARRAY = 393, /* ARRAY */ - SQL_CONCAT = 394, /* CONCAT */ - SQL_ILIKE = 395, /* ILIKE */ - SQL_MOD = 396, /* MOD */ - SQL_SECOND = 397, /* SECOND */ - SQL_MINUTE = 398, /* MINUTE */ - SQL_HOUR = 399, /* HOUR */ - SQL_DAY = 400, /* DAY */ - SQL_MONTH = 401, /* MONTH */ - SQL_YEAR = 402, /* YEAR */ - SQL_SECONDS = 403, /* SECONDS */ - SQL_MINUTES = 404, /* MINUTES */ - SQL_HOURS = 405, /* HOURS */ - SQL_DAYS = 406, /* DAYS */ - SQL_MONTHS = 407, /* MONTHS */ - SQL_YEARS = 408, /* YEARS */ - SQL_INTERVAL = 409, /* INTERVAL */ - SQL_TRUE = 410, /* TRUE */ - SQL_FALSE = 411, /* FALSE */ - SQL_BOOLEAN = 412, /* BOOLEAN */ - SQL_TRANSACTION = 413, /* TRANSACTION */ - SQL_BEGIN = 414, /* BEGIN */ - SQL_COMMIT = 415, /* COMMIT */ - SQL_ROLLBACK = 416, /* ROLLBACK */ - SQL_NOWAIT = 417, /* NOWAIT */ - SQL_SKIP = 418, /* SKIP */ - SQL_LOCKED = 419, /* LOCKED */ - SQL_SHARE = 420, /* SHARE */ - SQL_RANGE = 421, /* RANGE */ - SQL_ROWS = 422, /* ROWS */ - SQL_GROUPS = 423, /* GROUPS */ - SQL_UNBOUNDED = 424, /* UNBOUNDED */ - SQL_FOLLOWING = 425, /* FOLLOWING */ - SQL_PRECEDING = 426, /* PRECEDING */ - SQL_CURRENT_ROW = 427, /* CURRENT_ROW */ - SQL_UNIQUE = 428, /* UNIQUE */ - SQL_PRIMARY = 429, /* PRIMARY */ - SQL_FOREIGN = 430, /* FOREIGN */ - SQL_KEY = 431, /* KEY */ - SQL_REFERENCES = 432, /* REFERENCES */ - SQL_BITSHIFTLEFT = 433, /* BITSHIFTLEFT */ - SQL_BITSHIFTRIGHT = 434, /* BITSHIFTRIGHT */ - SQL_LOGICALAND = 435, /* LOGICALAND */ - SQL_LOGICALOR = 436, /* LOGICALOR */ - SQL_EQUALS = 437, /* EQUALS */ - SQL_NOTEQUALS = 438, /* NOTEQUALS */ - SQL_LESS = 439, /* LESS */ - SQL_GREATER = 440, /* GREATER */ - SQL_LESSEQ = 441, /* LESSEQ */ - SQL_GREATEREQ = 442, /* GREATEREQ */ - SQL_NOTNULL = 443, /* NOTNULL */ - SQL_UMINUS = 444 /* UMINUS */ - }; - typedef enum hsql_tokentype hsql_token_kind_t; -#endif - -/* Value type. */ -#if ! defined HSQL_STYPE && ! defined HSQL_STYPE_IS_DECLARED -union HSQL_STYPE -{ -#line 102 "bison_parser.y" - - // clang-format on - bool bval; - char* sval; - double fval; - int64_t ival; - uintmax_t uval; - - // statements - hsql::AlterStatement* alter_stmt; - hsql::CreateStatement* create_stmt; - hsql::DeleteStatement* delete_stmt; - hsql::DropStatement* drop_stmt; - hsql::ExecuteStatement* exec_stmt; - hsql::ExportStatement* export_stmt; - hsql::ImportStatement* import_stmt; - hsql::InsertStatement* insert_stmt; - hsql::PrepareStatement* prep_stmt; - hsql::SelectStatement* select_stmt; - hsql::ShowStatement* show_stmt; - hsql::SQLStatement* statement; - hsql::TransactionStatement* transaction_stmt; - hsql::UpdateStatement* update_stmt; - - hsql::Alias* alias_t; - hsql::AlterAction* alter_action_t; - hsql::ColumnConstraints* column_constraints_t; - hsql::ColumnDefinition* column_t; - hsql::ColumnType column_type_t; - hsql::ConstraintType column_constraint_t; - hsql::DatetimeField datetime_field; - hsql::DropColumnAction* drop_action_t; - hsql::Expr* expr; - hsql::FrameBound* frame_bound; - hsql::FrameDescription* frame_description; - hsql::FrameType frame_type; - hsql::GroupByDescription* group_t; - hsql::ImportType import_type_t; - hsql::JoinType join_type; - hsql::LimitDescription* limit; - hsql::LockingClause* locking_t; - hsql::OrderDescription* order; - hsql::OrderType order_type; - hsql::NullOrdering null_ordering_t; - hsql::ReferencesSpecification* references_spec_t; - hsql::SetOperation* set_operator_t; - hsql::TableConstraint* table_constraint_t; - hsql::TableElement* table_element_t; - hsql::TableName table_name; - hsql::TableRef* table; - hsql::UpdateClause* update_t; - hsql::WindowDescription* window_description; - hsql::WithDescription* with_description_t; - - std::vector* str_vec; - std::vector* expr_vec; - std::vector* order_vec; - std::vector* stmt_vec; - std::vector* table_element_vec; - std::vector* table_vec; - std::vector* update_vec; - std::vector* with_description_vec; - std::vector* locking_clause_vec; - - std::pair* ival_pair; - - hsql::RowLockMode lock_mode_t; - hsql::RowLockWaitPolicy lock_wait_policy_t; - - hsql::ImportExportOptions* import_export_option_t; - std::pair* csv_option_t; - - // clang-format off - -#line 361 "bison_parser.h" - -}; -typedef union HSQL_STYPE HSQL_STYPE; -# define HSQL_STYPE_IS_TRIVIAL 1 -# define HSQL_STYPE_IS_DECLARED 1 -#endif - -/* Location type. */ -#if ! defined HSQL_LTYPE && ! defined HSQL_LTYPE_IS_DECLARED -typedef struct HSQL_LTYPE HSQL_LTYPE; -struct HSQL_LTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define HSQL_LTYPE_IS_DECLARED 1 -# define HSQL_LTYPE_IS_TRIVIAL 1 -#endif - - - -int hsql_parse (hsql::SQLParserResult* result, yyscan_t scanner); - -#endif /* !YY_HSQL_BISON_PARSER_H_INCLUDED */ diff --git a/extern/hyrise_sql_parser/src/parser/bison_parser.y b/extern/hyrise_sql_parser/src/parser/bison_parser.y deleted file mode 100644 index f4ecd41ff5..0000000000 --- a/extern/hyrise_sql_parser/src/parser/bison_parser.y +++ /dev/null @@ -1,1552 +0,0 @@ -// clang-format off -%{ - -/** - * bison_parser.y - * defines bison_parser.h - * outputs bison_parser.c - * - * Grammar File Spec: http://dinosaur.compilertools.net/bison/bison_6.html - * - */ -/********************************* - ** Section 1: C Declarations - *********************************/ - -// clang-format on -#include "bison_parser.h" -#include "flex_lexer.h" - -#include -#include - - using namespace hsql; - - int yyerror(YYLTYPE * llocp, SQLParserResult * result, yyscan_t scanner, const char* msg) { - result->setIsValid(false); - result->setErrorDetails(strdup(msg), llocp->first_line, llocp->first_column); - return 0; - } - // clang-format off -%} -// clang-format on -/********************************* - ** Section 2: Bison Parser Declarations - *********************************/ - -// Specify code that is included in the generated .h and .c files -// clang-format off -%code requires { -// %code requires block - -#include "../SQLParserResult.h" -#include "../sql/statements.h" -#include "parser_typedef.h" - -// Auto update column and line number -#define YY_USER_ACTION \ - yylloc->first_line = yylloc->last_line; \ - yylloc->first_column = yylloc->last_column; \ - for (int i = 0; yytext[i] != '\0'; i++) { \ - yylloc->total_column++; \ - yylloc->string_length++; \ - if (yytext[i] == '\n') { \ - yylloc->last_line++; \ - yylloc->last_column = 0; \ - } else { \ - yylloc->last_column++; \ - } \ - } -} - -// Define the names of the created files (defined in Makefile) -// %output "bison_parser.cpp" -// %defines "bison_parser.h" - -// Raise error on shift/reduce conflict, i.e., when bison's one-token lookahead cannot decide on a single next state. -// Without this line, only a warning is printed. The line raises an error when the expected number of conflicts (0) -// does not occur. -%expect 0 - -// Tell bison to create a reentrant parser. -%define api.pure full - -// Prefix the parser -%define api.prefix {hsql_} -%define api.token.prefix {SQL_} - -%define parse.error verbose -%locations - -%initial-action { - // Initialize - @$.first_column = 0; - @$.last_column = 0; - @$.first_line = 0; - @$.last_line = 0; - @$.total_column = 0; - @$.string_length = 0; -}; - - -// Define additional parameters for yylex (http://www.gnu.org/software/bison/manual/html_node/Pure-Calling.html) -%lex-param { yyscan_t scanner } - -// Define additional parameters for yyparse -%parse-param { hsql::SQLParserResult* result } -%parse-param { yyscan_t scanner } - -/********************************* - ** Define all data-types (http://www.gnu.org/software/bison/manual/html_node/Union-Decl.html) - *********************************/ -%union { - // clang-format on - bool bval; - char* sval; - double fval; - int64_t ival; - uintmax_t uval; - - // statements - hsql::AlterStatement* alter_stmt; - hsql::CreateStatement* create_stmt; - hsql::DeleteStatement* delete_stmt; - hsql::DropStatement* drop_stmt; - hsql::ExecuteStatement* exec_stmt; - hsql::ExportStatement* export_stmt; - hsql::ImportStatement* import_stmt; - hsql::InsertStatement* insert_stmt; - hsql::PrepareStatement* prep_stmt; - hsql::SelectStatement* select_stmt; - hsql::ShowStatement* show_stmt; - hsql::SQLStatement* statement; - hsql::TransactionStatement* transaction_stmt; - hsql::UpdateStatement* update_stmt; - - hsql::Alias* alias_t; - hsql::AlterAction* alter_action_t; - hsql::ColumnConstraints* column_constraints_t; - hsql::ColumnDefinition* column_t; - hsql::ColumnType column_type_t; - hsql::ConstraintType column_constraint_t; - hsql::DatetimeField datetime_field; - hsql::DropColumnAction* drop_action_t; - hsql::Expr* expr; - hsql::FrameBound* frame_bound; - hsql::FrameDescription* frame_description; - hsql::FrameType frame_type; - hsql::GroupByDescription* group_t; - hsql::ImportType import_type_t; - hsql::JoinType join_type; - hsql::LimitDescription* limit; - hsql::LockingClause* locking_t; - hsql::OrderDescription* order; - hsql::OrderType order_type; - hsql::NullOrdering null_ordering_t; - hsql::ReferencesSpecification* references_spec_t; - hsql::SetOperation* set_operator_t; - hsql::TableConstraint* table_constraint_t; - hsql::TableElement* table_element_t; - hsql::TableName table_name; - hsql::TableRef* table; - hsql::UpdateClause* update_t; - hsql::WindowDescription* window_description; - hsql::WithDescription* with_description_t; - - std::vector* str_vec; - std::vector* expr_vec; - std::vector* order_vec; - std::vector* stmt_vec; - std::vector* table_element_vec; - std::vector* table_vec; - std::vector* update_vec; - std::vector* with_description_vec; - std::vector* locking_clause_vec; - - std::pair* ival_pair; - - hsql::RowLockMode lock_mode_t; - hsql::RowLockWaitPolicy lock_wait_policy_t; - - hsql::ImportExportOptions* import_export_option_t; - std::pair* csv_option_t; - - // clang-format off -} - -/********************************* - ** Destructor symbols - *********************************/ - -%destructor { } -%destructor { - free($$.name); - free($$.schema); -} -%destructor { - if ($$) { - for (auto ptr : *($$)) { - free(ptr); - } - } - delete ($$); -} -%destructor { free($$); } -%destructor { - if ($$) { - for (auto ptr : *($$)) { - delete ptr; - } - } - delete ($$); -} -%destructor { - free($$->second); - delete ($$); -} -%destructor { delete ($$); } <*> - - -/********************************* - ** Token Definition - *********************************/ -%token IDENTIFIER STRING -%token BIGINTVAL -%token FLOATVAL -%token INTVAL -%token NULLSAFEEQUALS - -/* SQL Keywords */ -%token DEALLOCATE PARAMETERS INTERSECT TEMPORARY TIMESTAMP -%token DISTINCT NVARCHAR RESTRICT TRUNCATE ANALYZE BETWEEN -%token CASCADE COLUMNS CONTROL DEFAULT EXECUTE EXPLAIN ENCODING -%token INTEGER NATURAL PREPARE SCHEMAS CHARACTER_VARYING REAL DECIMAL SMALLINT BIGINT -%token SPATIAL VARCHAR VIRTUAL DESCRIBE BEFORE COLUMN CREATE DELETE DIRECT -%token DOUBLE ESCAPE EXCEPT EXISTS EXTRACT CAST FORMAT GLOBAL HAVING IMPORT -%token INSERT ISNULL OFFSET RENAME SCHEMA SELECT SORTED -%token TABLES UNLOAD UPDATE VALUES AFTER ALTER CROSS -%token DELTA FLOAT GROUP INDEX INNER LIMIT LOCAL MERGE MINUS ORDER OVER -%token OUTER RIGHT TABLE UNION USING WHERE CALL CASE CHAR COPY DATE DATETIME -%token DESC DIV DROP ELSE FILE FROM FULL HASH HINT INTO JOIN -%token LEFT LIKE LOAD LONG NULL PARTITION PLAN SHOW TEXT THEN TIME -%token VIEW WHEN WITH ADD ALL AND ASC END FOR INT -%token NOT OFF SET TOP AS BY IF IN IS OF ON OR TO NO -%token ARRAY CONCAT ILIKE MOD SECOND MINUTE HOUR DAY MONTH YEAR -%token SECONDS MINUTES HOURS DAYS MONTHS YEARS INTERVAL -%token TRUE FALSE BOOLEAN -%token TRANSACTION BEGIN COMMIT ROLLBACK -%token NOWAIT SKIP LOCKED SHARE -%token RANGE ROWS GROUPS UNBOUNDED FOLLOWING PRECEDING CURRENT_ROW -%token UNIQUE PRIMARY FOREIGN KEY REFERENCES -%token BITSHIFTLEFT BITSHIFTRIGHT LOGICALAND LOGICALOR - -/********************************* - ** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html) - *********************************/ -%type statement_list -%type statement preparable_statement -%type execute_statement -%type transaction_statement -%type prepare_statement -%type select_statement select_with_paren select_no_paren select_clause select_within_set_operation select_within_set_operation_no_parentheses -%type import_statement -%type export_statement -%type create_statement -%type insert_statement -%type delete_statement truncate_statement -%type update_statement -%type drop_statement -%type alter_statement -%type show_statement -%type table_name -%type opt_index_name -%type file_path prepare_target_query -%type opt_frame_clause -%type frame_bound -%type frame_type -%type opt_window -%type opt_not_exists opt_exists opt_distinct opt_all -%type opt_decimal_specification -%type opt_time_precision -%type opt_join_type natural_join_type -%type

opt_from_clause from_clause table_ref table_ref_atomic table_ref_name nonjoin_table_ref_atomic -%type
join_clause table_ref_name_no_alias -%type expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr extract_expr cast_expr -%type function_expr between_expr expr_alias param_expr -%type column_name literal int_literal num_literal string_literal bool_literal date_literal interval_literal -%type comp_expr opt_where join_condition opt_having case_expr case_list in_expr hint -%type array_expr array_index null_literal extended_literal casted_extended_literal -%type opt_limit opt_top -%type order_desc -%type opt_order_type -%type opt_null_ordering -%type datetime_field datetime_field_plural duration_field -%type column_def -%type table_elem -%type column_type -%type references_spec -%type table_constraint -%type update_clause -%type locking_clause -%type opt_group -%type opt_table_alias table_alias opt_alias alias -%type with_description -%type set_operator set_type -%type column_constraint -%type opt_column_constraints column_constraints -%type alter_action -%type drop_action -%type opt_row_lock_policy -%type row_lock_mode - -// ImportType is used for compatibility reasons -%type file_type -%type opt_import_export_options import_export_options -%type csv_option - -%type ident_commalist opt_column_list -%type expr_list select_list opt_extended_literal_list extended_literal_list hint_list opt_hints opt_partition -%type table_ref_commalist -%type opt_order order_list -%type opt_with_clause with_clause with_description_list -%type update_clause_commalist -%type table_elem_commalist -%type opt_locking_clause_list opt_locking_clause - -/****************************** - ** Token Precedence and Associativity - ** Precedence: lowest to highest - ******************************/ -%left OR LOGICALOR -%left AND LOGICALAND -%right NOT -%nonassoc '=' EQUALS NULLSAFEEQUALS NOTEQUALS LIKE ILIKE -%nonassoc '<' '>' LESS GREATER LESSEQ GREATEREQ - -%nonassoc NOTNULL -%nonassoc ISNULL -%nonassoc IS /* sets precedence for IS NULL, etc */ -%left '|' -%left '^' -%left '&' -%left BITSHIFTLEFT BITSHIFTRIGHT -%left '+' '-' -%left '*' '/' '%' MOD DIV -%left CONCAT - -/* Unary Operators */ -%right UMINUS -%left '[' ']' -%left '(' ')' -%left '.' -%left JOIN -%% -/********************************* - ** Section 3: Grammar Definition - *********************************/ - -// Defines our general input. -input : statement_list { - for (SQLStatement* stmt : *$1) { - // Transfers ownership of the statement. - result->addStatement(stmt); - } - - unsigned param_id = 0; - for (void* param : yyloc.param_list) { - if (param) { - Expr* expr = (Expr*)param; - expr->ival = param_id; - result->addParameter(expr); - ++param_id; - } - } - delete $1; - }; - -// clang-format on -statement_list : statement { - $1->stringLength = yylloc.string_length; - yylloc.string_length = 0; - $$ = new std::vector(); - $$->push_back($1); -} -| statement_list ';' { - yylloc.string_length = 0; - $$ = $1; -} -| statement_list ';' statement { - $3->stringLength = yylloc.string_length; - yylloc.string_length = 0; - $1->push_back($3); - $$ = $1; -}; - -statement : prepare_statement opt_hints { - $$ = $1; - $$->hints = $2; -} -| preparable_statement opt_hints { - $$ = $1; - $$->hints = $2; -} -| show_statement { $$ = $1; } -| import_statement { $$ = $1; } -| export_statement { $$ = $1; }; - -preparable_statement : select_statement { $$ = $1; } -| create_statement { $$ = $1; } -| insert_statement { $$ = $1; } -| delete_statement { $$ = $1; } -| truncate_statement { $$ = $1; } -| update_statement { $$ = $1; } -| drop_statement { $$ = $1; } -| alter_statement { $$ = $1; } -| execute_statement { $$ = $1; } -| transaction_statement { $$ = $1; }; - -/****************************** - * Hints - ******************************/ - -opt_hints : WITH HINT '(' hint_list ')' { $$ = $4; } -| /* empty */ { $$ = nullptr; }; - -hint_list : hint { - $$ = new std::vector(); - $$->push_back($1); -} -| hint_list ',' hint { - $1->push_back($3); - $$ = $1; -}; - -hint : IDENTIFIER { - $$ = Expr::make(kExprHint); - $$->name = $1; -} -| IDENTIFIER '(' extended_literal_list ')' { - $$ = Expr::make(kExprHint); - $$->name = $1; - $$->exprList = $3; -}; - -/****************************** - * Transaction Statement - ******************************/ - -transaction_statement : BEGIN opt_transaction_keyword { $$ = new TransactionStatement(kBeginTransaction); } -| ROLLBACK opt_transaction_keyword { $$ = new TransactionStatement(kRollbackTransaction); } -| COMMIT opt_transaction_keyword { $$ = new TransactionStatement(kCommitTransaction); }; - -opt_transaction_keyword : TRANSACTION | /* empty */ - ; - -/****************************** - * Prepared Statement - ******************************/ -prepare_statement : PREPARE IDENTIFIER FROM prepare_target_query { - $$ = new PrepareStatement(); - $$->name = $2; - $$->query = $4; -}; - -prepare_target_query : STRING; - -execute_statement : EXECUTE IDENTIFIER { - $$ = new ExecuteStatement(); - $$->name = $2; -} -| EXECUTE IDENTIFIER '(' opt_extended_literal_list ')' { - $$ = new ExecuteStatement(); - $$->name = $2; - $$->parameters = $4; -}; - -/****************************** - * Import Statement - * IMPORT FROM TBL FILE 'test/students.tbl' INTO students - * COPY students FROM 'test/students.tbl' - * COPY students FROM 'test/students.tbl' WITH (FORMAT TBL, ENCODING 'Dictionary') - ******************************/ -import_statement : IMPORT FROM file_type FILE file_path INTO table_name { - $$ = new ImportStatement($3); - $$->filePath = $5; - $$->schema = $7.schema; - $$->tableName = $7.name; -} -| COPY table_name FROM file_path opt_import_export_options opt_where { - $$ = new ImportStatement($5->format); - $$->filePath = $4; - $$->schema = $2.schema; - $$->tableName = $2.name; - $$->whereClause = $6; - if ($5->encoding) { - $$->encoding = $5->encoding; - $5->encoding = nullptr; - } - if ($5->csv_options) { - $$->csv_options = $5->csv_options; - $5->csv_options = nullptr; - } - delete $5; -}; - -file_type : IDENTIFIER { - if (strcasecmp($1, "csv") == 0) { - $$ = kImportCSV; - } else if (strcasecmp($1, "tbl") == 0) { - $$ = kImportTbl; - } else if (strcasecmp($1, "binary") == 0 || strcasecmp($1, "bin") == 0) { - $$ = kImportBinary; - } else { - free($1); - yyerror(&yyloc, result, scanner, "File type is unknown."); - YYERROR; - } - free($1); -}; - -file_path : STRING { $$ = $1; }; - -opt_import_export_options : WITH '(' import_export_options ')' { $$ = $3; } -| '(' import_export_options ')' { $$ = $2; } -| /* empty */ { $$ = new ImportExportOptions{}; }; - -import_export_options : import_export_options ',' FORMAT file_type { - if ($1->format != kImportAuto) { - delete $1; - yyerror(&yyloc, result, scanner, "File type must only be provided once."); - YYERROR; - } - if ($1->csv_options && $4 != kImportCSV && $4 != kImportAuto) { - delete $1; - yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); - YYERROR; - } - $1->format = $4; - $$ = $1; -} -| FORMAT file_type { - $$ = new ImportExportOptions{}; - $$->format = $2; -} -| import_export_options ',' ENCODING STRING { - if ($1->encoding) { - delete $1; - free($4); - yyerror(&yyloc, result, scanner, "Encoding type must only be provided once."); - YYERROR; - } - $1->encoding = $4; - $$ = $1; -} -| ENCODING STRING { - $$ = new ImportExportOptions{}; - $$->encoding = $2; -} -| import_export_options ',' csv_option { - if ($1->format != kImportAuto && $1->format != kImportCSV) { - delete $1; - free($3->second); - delete $3; - yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) are only allowed for CSV files."); - YYERROR; - } - - if ($1->csv_options == nullptr) { - $1->csv_options = new CsvOptions{}; - } - - if (!$1->csv_options->accept_csv_option($3)) { - free($3->second); - delete $3; - delete $1; - yyerror(&yyloc, result, scanner, "CSV options (DELIMITER, NULL, QUOTE) cannot be provided more than once."); - YYERROR; - } - - delete $3; - $$ = $1; -} -| csv_option { - $$ = new ImportExportOptions{}; - $$->csv_options = new CsvOptions{}; - $$->csv_options->accept_csv_option($1); - - delete $1; -} - -csv_option : IDENTIFIER STRING { - if (strcasecmp($1, "DELIMITER") == 0) { - $$ = new std::pair(CsvOptionType::Delimiter, $2); - } else if (strcasecmp($1, "QUOTE") == 0) { - $$ = new std::pair(CsvOptionType::Quote, $2); - } else { - free($1); - free($2); - yyerror(&yyloc, result, scanner, "Unknown CSV option."); - YYERROR; - } - free($1); -} -| NULL STRING { $$ = new std::pair(CsvOptionType::Null, $2); } - -/****************************** - * Export Statement - * COPY students TO 'test/students.tbl' - * COPY students TO 'test/students.tbl' WITH (FORMAT BINARY, ENCODING 'Dictionary') - ******************************/ -export_statement : COPY table_name TO file_path opt_import_export_options { - $$ = new ExportStatement($5->format); - $$->filePath = $4; - $$->schema = $2.schema; - $$->tableName = $2.name; - if ($5->encoding) { - $$->encoding = $5->encoding; - $5->encoding = nullptr; - } - if ($5->csv_options) { - $$->csv_options = $5->csv_options; - $5->csv_options = nullptr; - } - delete $5; -} -| COPY select_with_paren TO file_path opt_import_export_options { - $$ = new ExportStatement($5->format); - $$->filePath = $4; - $$->select = $2; - if ($5->encoding) { - $$->encoding = $5->encoding; - $5->encoding = nullptr; - } - if ($5->csv_options) { - $$->csv_options = $5->csv_options; - $5->csv_options = nullptr; - } - delete $5; -}; - -/****************************** - * Show Statement - * SHOW TABLES; - ******************************/ - -show_statement : SHOW TABLES { $$ = new ShowStatement(kShowTables); } -| SHOW COLUMNS table_name { - $$ = new ShowStatement(kShowColumns); - $$->schema = $3.schema; - $$->name = $3.name; -} -| DESCRIBE table_name { - $$ = new ShowStatement(kShowColumns); - $$->schema = $2.schema; - $$->name = $2.name; -}; - -/****************************** - * Create Statement - * CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE) - * CREATE TABLE students FROM TBL FILE 'test/students.tbl' - ******************************/ -create_statement : CREATE TABLE opt_not_exists table_name FROM IDENTIFIER FILE file_path { - $$ = new CreateStatement(kCreateTableFromTbl); - $$->ifNotExists = $3; - $$->schema = $4.schema; - $$->tableName = $4.name; - if (strcasecmp($6, "tbl") != 0) { - free($6); - yyerror(&yyloc, result, scanner, "File type is unknown."); - YYERROR; - } - free($6); - $$->filePath = $8; -} -| CREATE TABLE opt_not_exists table_name '(' table_elem_commalist ')' { - $$ = new CreateStatement(kCreateTable); - $$->ifNotExists = $3; - $$->schema = $4.schema; - $$->tableName = $4.name; - $$->setColumnDefsAndConstraints($6); - delete $6; - if (result->errorMsg()) { - delete $$; - YYERROR; - } -} -| CREATE TABLE opt_not_exists table_name AS select_statement { - $$ = new CreateStatement(kCreateTable); - $$->ifNotExists = $3; - $$->schema = $4.schema; - $$->tableName = $4.name; - $$->select = $6; -} -| CREATE INDEX opt_not_exists opt_index_name ON table_name '(' ident_commalist ')' { - $$ = new CreateStatement(kCreateIndex); - $$->indexName = $4; - $$->ifNotExists = $3; - $$->tableName = $6.name; - $$->indexColumns = $8; -} -| CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement { - $$ = new CreateStatement(kCreateView); - $$->ifNotExists = $3; - $$->schema = $4.schema; - $$->tableName = $4.name; - $$->viewColumns = $5; - $$->select = $7; -}; - -opt_not_exists : IF NOT EXISTS { $$ = true; } -| /* empty */ { $$ = false; }; - -table_elem_commalist : table_elem { - $$ = new std::vector(); - $$->push_back($1); -} -| table_elem_commalist ',' table_elem { - $1->push_back($3); - $$ = $1; -}; - -table_elem : column_def { $$ = $1; } -| table_constraint { $$ = $1; }; - -column_def : IDENTIFIER column_type opt_column_constraints { - $$ = new ColumnDefinition($1, $2, $3->constraints, $3->references); - if (!$$->trySetNullableExplicit()) { - yyerror(&yyloc, result, scanner, ("Conflicting nullability constraints for " + std::string{$1}).c_str()); - } - delete $3; -}; - -column_type : BIGINT { $$ = ColumnType{DataType::BIGINT}; } -| BOOLEAN { $$ = ColumnType{DataType::BOOLEAN}; } -| CHAR '(' INTVAL ')' { $$ = ColumnType{DataType::CHAR, $3}; } -| CHARACTER_VARYING '(' INTVAL ')' { $$ = ColumnType{DataType::VARCHAR, $3}; } -| DATE { $$ = ColumnType{DataType::DATE}; }; -| DATETIME { $$ = ColumnType{DataType::DATETIME}; } -| DECIMAL opt_decimal_specification { - $$ = ColumnType{DataType::DECIMAL, 0, $2->first, $2->second}; - delete $2; -} -| DOUBLE { $$ = ColumnType{DataType::DOUBLE}; } -| FLOAT { $$ = ColumnType{DataType::FLOAT}; } -| INT { $$ = ColumnType{DataType::INT}; } -| INTEGER { $$ = ColumnType{DataType::INT}; } -| LONG { $$ = ColumnType{DataType::LONG}; } -| REAL { $$ = ColumnType{DataType::REAL}; } -| SMALLINT { $$ = ColumnType{DataType::SMALLINT}; } -| TEXT { $$ = ColumnType{DataType::TEXT}; } -| TIME opt_time_precision { $$ = ColumnType{DataType::TIME, 0, $2}; } -| TIMESTAMP { $$ = ColumnType{DataType::DATETIME}; } -| VARCHAR '(' INTVAL ')' { $$ = ColumnType{DataType::VARCHAR, $3}; }; - -opt_time_precision : '(' INTVAL ')' { $$ = $2; } -| /* empty */ { $$ = 0; }; - -opt_decimal_specification : '(' INTVAL ',' INTVAL ')' { $$ = new std::pair{$2, $4}; } -| '(' INTVAL ')' { $$ = new std::pair{$2, 0}; } -| /* empty */ { $$ = new std::pair{0, 0}; }; - -opt_column_constraints : column_constraints { $$ = $1; } -| /* empty */ { $$ = new ColumnConstraints(); }; - -column_constraints : column_constraint { - $$ = new ColumnConstraints(); - $$->constraints->insert($1); -} -| column_constraints column_constraint { - $1->constraints->insert($2); - $$ = $1; -} -| references_spec { - $$ = new ColumnConstraints(); - $$->constraints->insert(ConstraintType::ForeignKey); - $$->references->emplace_back($1); -} -| column_constraints references_spec { - // Multiple foreign keys for the same column could be possible, so we do not raise an error in that case. - // Think of foreign keys referenced on multiple levels (returned item references sold item references items). - $1->constraints->insert(ConstraintType::ForeignKey); - $1->references->emplace_back($2); - $$ = $1; -}; - -column_constraint : PRIMARY KEY { $$ = ConstraintType::PrimaryKey; } -| UNIQUE { $$ = ConstraintType::Unique; } -| NULL { $$ = ConstraintType::Null; } -| NOT NULL { $$ = ConstraintType::NotNull; }; - -table_constraint : PRIMARY KEY '(' ident_commalist ')' { $$ = new TableConstraint(ConstraintType::PrimaryKey, $4); } -| UNIQUE '(' ident_commalist ')' { $$ = new TableConstraint(ConstraintType::Unique, $3); } -| FOREIGN KEY '(' ident_commalist ')' references_spec { $$ = new ForeignKeyConstraint($4, $6); }; - -references_spec : REFERENCES table_name opt_column_list { $$ = new ReferencesSpecification($2.schema, $2.name, $3); }; - -/****************************** - * Drop Statement - * DROP TABLE students; - * DEALLOCATE PREPARE stmt; - ******************************/ - -drop_statement : DROP TABLE opt_exists table_name { - $$ = new DropStatement(kDropTable); - $$->ifExists = $3; - $$->schema = $4.schema; - $$->name = $4.name; -} -| DROP VIEW opt_exists table_name { - $$ = new DropStatement(kDropView); - $$->ifExists = $3; - $$->schema = $4.schema; - $$->name = $4.name; -} -| DEALLOCATE PREPARE IDENTIFIER { - $$ = new DropStatement(kDropPreparedStatement); - $$->ifExists = false; - $$->name = $3; -} - -| DROP INDEX opt_exists IDENTIFIER { - $$ = new DropStatement(kDropIndex); - $$->ifExists = $3; - $$->indexName = $4; -}; - -opt_exists : IF EXISTS { $$ = true; } -| /* empty */ { $$ = false; }; - -/****************************** - * ALTER Statement - * ALTER TABLE students DROP COLUMN name; - ******************************/ - -alter_statement : ALTER TABLE opt_exists table_name alter_action { - $$ = new AlterStatement($4.name, $5); - $$->ifTableExists = $3; - $$->schema = $4.schema; -}; - -alter_action : drop_action { $$ = $1; } - -drop_action : DROP COLUMN opt_exists IDENTIFIER { - $$ = new DropColumnAction($4); - $$->ifExists = $3; -}; - -/****************************** - * Delete Statement / Truncate statement - * DELETE FROM students WHERE grade > 3.0 - * DELETE FROM students <=> TRUNCATE students - ******************************/ -delete_statement : DELETE FROM table_name opt_where { - $$ = new DeleteStatement(); - $$->schema = $3.schema; - $$->tableName = $3.name; - $$->expr = $4; -}; - -truncate_statement : TRUNCATE table_name { - $$ = new DeleteStatement(); - $$->schema = $2.schema; - $$->tableName = $2.name; -}; - -/****************************** - * Insert Statement - * INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3) - * INSERT INTO employees SELECT * FROM stundents - ******************************/ -insert_statement : INSERT INTO table_name opt_column_list VALUES '(' extended_literal_list ')' { - $$ = new InsertStatement(kInsertValues); - $$->schema = $3.schema; - $$->tableName = $3.name; - $$->columns = $4; - $$->values = $7; -} -| INSERT INTO table_name opt_column_list select_no_paren { - $$ = new InsertStatement(kInsertSelect); - $$->schema = $3.schema; - $$->tableName = $3.name; - $$->columns = $4; - $$->select = $5; -}; - -opt_column_list : '(' ident_commalist ')' { $$ = $2; } -| /* empty */ { $$ = nullptr; }; - -/****************************** - * Update Statement - * UPDATE students SET grade = 1.3, name='Felix Fürstenberg' WHERE name = 'Max Mustermann'; - ******************************/ - -update_statement : UPDATE table_ref_name_no_alias SET update_clause_commalist opt_where { - $$ = new UpdateStatement(); - $$->table = $2; - $$->updates = $4; - $$->where = $5; -}; - -update_clause_commalist : update_clause { - $$ = new std::vector(); - $$->push_back($1); -} -| update_clause_commalist ',' update_clause { - $1->push_back($3); - $$ = $1; -}; - -update_clause : IDENTIFIER '=' expr { - $$ = new UpdateClause(); - $$->column = $1; - $$->value = $3; -}; - -/****************************** - * Select Statement - ******************************/ - -select_statement : opt_with_clause select_with_paren { - $$ = $2; - $$->withDescriptions = $1; -} -| opt_with_clause select_no_paren { - $$ = $2; - $$->withDescriptions = $1; -} -| opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit { - $$ = $2; - if ($$->setOperations == nullptr) { - $$->setOperations = new std::vector(); - } - $$->setOperations->push_back($3); - $$->setOperations->back()->nestedSelectStatement = $4; - $$->setOperations->back()->resultOrder = $5; - $$->setOperations->back()->resultLimit = $6; - $$->withDescriptions = $1; -}; - -select_within_set_operation : select_with_paren | select_within_set_operation_no_parentheses; - -select_within_set_operation_no_parentheses : select_clause { $$ = $1; } -| select_clause set_operator select_within_set_operation { - $$ = $1; - if ($$->setOperations == nullptr) { - $$->setOperations = new std::vector(); - } - $$->setOperations->push_back($2); - $$->setOperations->back()->nestedSelectStatement = $3; -}; - -select_with_paren : '(' select_no_paren ')' { $$ = $2; } -| '(' select_with_paren ')' { $$ = $2; }; - -select_no_paren : select_clause opt_order opt_limit opt_locking_clause { - $$ = $1; - $$->order = $2; - - // Limit could have been set by TOP. - if ($3) { - delete $$->limit; - $$->limit = $3; - } - - if ($4) { - $$->lockings = $4; - } -} -| select_clause set_operator select_within_set_operation opt_order opt_limit opt_locking_clause { - $$ = $1; - if ($$->setOperations == nullptr) { - $$->setOperations = new std::vector(); - } - $$->setOperations->push_back($2); - $$->setOperations->back()->nestedSelectStatement = $3; - $$->setOperations->back()->resultOrder = $4; - $$->setOperations->back()->resultLimit = $5; - $$->lockings = $6; -}; - -set_operator : set_type opt_all { - $$ = $1; - $$->isAll = $2; -}; - -set_type : UNION { - $$ = new SetOperation(); - $$->setType = SetType::kSetUnion; -} -| INTERSECT { - $$ = new SetOperation(); - $$->setType = SetType::kSetIntersect; -} -| EXCEPT { - $$ = new SetOperation(); - $$->setType = SetType::kSetExcept; -}; - -opt_all : ALL { $$ = true; } -| /* empty */ { $$ = false; }; - -select_clause : SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group opt_having { - $$ = new SelectStatement(); - $$->limit = $2; - $$->selectDistinct = $3; - $$->selectList = $4; - $$->fromTable = $5; - $$->whereClause = $6; - $$->groupBy = $7; - if ($7) { - $$->groupBy->having = $8; - } else { - $$->having = $8; - } -}; - -opt_distinct : DISTINCT { $$ = true; } -| /* empty */ { $$ = false; }; - -select_list : expr_list; - -opt_from_clause : from_clause { $$ = $1; } -| /* empty */ { $$ = nullptr; }; - -from_clause : FROM table_ref { $$ = $2; }; - -opt_where : WHERE expr { $$ = $2; } -| /* empty */ { $$ = nullptr; }; - -opt_group : GROUP BY expr_list { - $$ = new GroupByDescription(); - $$->columns = $3; -} -| /* empty */ { $$ = nullptr; }; - -opt_having : HAVING expr { $$ = $2; } -| /* empty */ { $$ = nullptr; }; - -opt_order : ORDER BY order_list { $$ = $3; } -| /* empty */ { $$ = nullptr; }; - -order_list : order_desc { - $$ = new std::vector(); - $$->push_back($1); -} -| order_list ',' order_desc { - $1->push_back($3); - $$ = $1; -}; - -order_desc : expr opt_order_type opt_null_ordering { $$ = new OrderDescription($2, $1, $3); }; - -opt_order_type : ASC { $$ = kOrderAsc; } -| DESC { $$ = kOrderDesc; } -| /* empty */ { $$ = kOrderAsc; }; - -opt_null_ordering : /* empty */ { $$ = NullOrdering::Undefined; } -| IDENTIFIER IDENTIFIER { - auto null_ordering = NullOrdering::Undefined; - if (strcasecmp($1, "nulls") == 0) { - if (strcasecmp($2, "first") == 0) { - null_ordering = NullOrdering::First; - } else if (strcasecmp($2, "last") == 0) { - null_ordering = NullOrdering::Last; - } - } - free($1); - free($2); - - if (null_ordering == NullOrdering::Undefined) { - yyerror(&yyloc, result, scanner, "Expected NULLS FIRST or NULLS LAST ordering."); - YYERROR; - } - - $$ = null_ordering; -}; - -// TODO: TOP and LIMIT can take more than just int literals. - -opt_top : TOP int_literal { $$ = new LimitDescription($2, nullptr); } -| /* empty */ { $$ = nullptr; }; - -opt_limit : LIMIT expr { $$ = new LimitDescription($2, nullptr); } -| OFFSET expr { $$ = new LimitDescription(nullptr, $2); } -| LIMIT expr OFFSET expr { $$ = new LimitDescription($2, $4); } -| LIMIT ALL { $$ = new LimitDescription(nullptr, nullptr); } -| LIMIT ALL OFFSET expr { $$ = new LimitDescription(nullptr, $4); } -| /* empty */ { $$ = nullptr; }; - -/****************************** - * Expressions - ******************************/ -expr_list : expr_alias { - $$ = new std::vector(); - $$->push_back($1); -} -| expr_list ',' expr_alias { - $1->push_back($3); - $$ = $1; -}; - -// Literals, casted literals, and negative numbers/intervals are allowed for INSERT and EXECUTE statements or hints. -opt_extended_literal_list : extended_literal_list { $$ = $1; } -| /* empty */ { $$ = nullptr; }; - -extended_literal_list : casted_extended_literal { - $$ = new std::vector(); - $$->push_back($1); -} -| extended_literal_list ',' casted_extended_literal { - $1->push_back($3); - $$ = $1; -}; - -casted_extended_literal : extended_literal | CAST '(' extended_literal AS column_type ')' { - $$ = Expr::makeCast($3, $5); -}; - -extended_literal : literal { - if ($1->type == ExprType::kExprParameter) { - delete $1; - yyerror(&yyloc, result, scanner, "Parameter ? is not a valid literal."); - YYERROR; - } - $$ = $1; -} -| '-' num_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus, $2); }; -| '-' interval_literal { $$ = Expr::makeOpUnary(kOpUnaryMinus, $2); }; - -expr_alias : expr opt_alias { - $$ = $1; - if ($2) { - $$->alias = $2->name; - $2->name = nullptr; - delete $2; - } -}; - -expr : operand | between_expr | logic_expr | exists_expr | in_expr; - -operand : '(' expr ')' { $$ = $2; } -| array_index | scalar_expr | unary_expr | binary_expr | case_expr | function_expr | extract_expr | cast_expr | - array_expr | '(' select_no_paren ')' { - $$ = Expr::makeSelect($2); -}; - -scalar_expr : column_name | literal; - -unary_expr : '-' operand { $$ = Expr::makeOpUnary(kOpUnaryMinus, $2); } -| NOT operand { $$ = Expr::makeOpUnary(kOpNot, $2); } -| operand ISNULL { $$ = Expr::makeOpUnary(kOpIsNull, $1); } -| operand IS NULL { $$ = Expr::makeOpUnary(kOpIsNull, $1); } -| operand IS NOT NULL { $$ = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, $1)); }; - -binary_expr : comp_expr | operand '-' operand { $$ = Expr::makeOpBinary($1, kOpMinus, $3); } -| operand '+' operand { $$ = Expr::makeOpBinary($1, kOpPlus, $3); } -| operand '/' operand { $$ = Expr::makeOpBinary($1, kOpSlash, $3); } -| operand '*' operand { $$ = Expr::makeOpBinary($1, kOpAsterisk, $3); } -| operand '%' operand { $$ = Expr::makeOpBinary($1, kOpPercentage, $3); } -| operand MOD operand { $$ = Expr::makeOpBinary($1, kOpMod, $3); } -| operand DIV operand { $$ = Expr::makeOpBinary($1, kOpDiv, $3); } -| operand '^' operand { $$ = Expr::makeOpBinary($1, kOpBitXor, $3); } -| operand '&' operand { $$ = Expr::makeOpBinary($1, kOpBitAnd, $3); } -| operand '|' operand { $$ = Expr::makeOpBinary($1, kOpBitOr, $3); } -| operand BITSHIFTLEFT operand { $$ = Expr::makeOpBinary($1, kOpBitShiftLeft, $3); } -| operand BITSHIFTRIGHT operand { $$ = Expr::makeOpBinary($1, kOpBitShiftRight, $3); } -| operand LIKE operand { $$ = Expr::makeOpBinary($1, kOpLike, $3); } -| operand NOT LIKE operand { $$ = Expr::makeOpBinary($1, kOpNotLike, $4); } -| operand ILIKE operand { $$ = Expr::makeOpBinary($1, kOpILike, $3); } -| operand CONCAT operand { $$ = Expr::makeOpBinary($1, kOpConcat, $3); }; - -logic_expr : expr AND expr { $$ = Expr::makeOpBinary($1, kOpAnd, $3); } -| expr LOGICALAND expr { $$ = Expr::makeOpBinary($1, kOpAnd, $3); } -| expr OR expr { $$ = Expr::makeOpBinary($1, kOpOr, $3); } -| expr LOGICALOR expr { $$ = Expr::makeOpBinary($1, kOpOr, $3); }; - -in_expr : operand IN '(' expr_list ')' { $$ = Expr::makeInOperator($1, $4); } -| operand NOT IN '(' expr_list ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeInOperator($1, $5)); } -| operand IN '(' select_no_paren ')' { $$ = Expr::makeInOperator($1, $4); } -| operand NOT IN '(' select_no_paren ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeInOperator($1, $5)); }; - -// CASE grammar based on: flex & bison by John Levine -// https://www.safaribooksonline.com/library/view/flex-bison/9780596805418/ch04.html#id352665 -case_expr : CASE expr case_list END { $$ = Expr::makeCase($2, $3, nullptr); } -| CASE expr case_list ELSE expr END { $$ = Expr::makeCase($2, $3, $5); } -| CASE case_list END { $$ = Expr::makeCase(nullptr, $2, nullptr); } -| CASE case_list ELSE expr END { $$ = Expr::makeCase(nullptr, $2, $4); }; - -case_list : WHEN expr THEN expr { $$ = Expr::makeCaseList(Expr::makeCaseListElement($2, $4)); } -| case_list WHEN expr THEN expr { $$ = Expr::caseListAppend($1, Expr::makeCaseListElement($3, $5)); }; - -exists_expr : EXISTS '(' select_no_paren ')' { $$ = Expr::makeExists($3); } -| NOT EXISTS '(' select_no_paren ')' { $$ = Expr::makeOpUnary(kOpNot, Expr::makeExists($4)); }; - -comp_expr : operand '=' operand { $$ = Expr::makeOpBinary($1, kOpEquals, $3); } -| operand EQUALS operand { $$ = Expr::makeOpBinary($1, kOpEquals, $3); } -| operand NULLSAFEEQUALS operand { $$ = Expr::makeOpBinary($1, kOpNullSafeEquals, $3); } -| operand NOTEQUALS operand { $$ = Expr::makeOpBinary($1, kOpNotEquals, $3); } -| operand '<' operand { $$ = Expr::makeOpBinary($1, kOpLess, $3); } -| operand '>' operand { $$ = Expr::makeOpBinary($1, kOpGreater, $3); } -| operand LESSEQ operand { $$ = Expr::makeOpBinary($1, kOpLessEq, $3); } -| operand GREATEREQ operand { $$ = Expr::makeOpBinary($1, kOpGreaterEq, $3); }; - -// `function_expr is used for window functions, aggregate expressions, and functions calls because we run into shift/ -// reduce conflicts when splitting them. -function_expr : IDENTIFIER '(' ')' opt_window { $$ = Expr::makeFunctionRef($1, new std::vector(), false, $4); } -| IDENTIFIER '(' opt_distinct expr_list ')' opt_window { $$ = Expr::makeFunctionRef($1, $4, $3, $6); } -| IDENTIFIER '.' IDENTIFIER '(' ')' opt_window { - $$ = Expr::makeFunctionRef($3, $1, new std::vector(), false, $6); -} -| IDENTIFIER '.' IDENTIFIER '(' opt_distinct expr_list ')' opt_window { - $$ = Expr::makeFunctionRef($3, $1, $6, $5, $8); -}; - -// Window function expressions, based on https://www.postgresql.org/docs/15/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS -// We do not support named windows, collations and exclusions (for simplicity) and filters (not part of the SQL standard). -opt_window : OVER '(' opt_partition opt_order opt_frame_clause ')' { $$ = new WindowDescription($3, $4, $5); } -| /* empty */ { $$ = nullptr; }; - -opt_partition : PARTITION BY expr_list { $$ = $3; } -| /* empty */ { $$ = nullptr; }; - -// We use the Postgres default if the frame end or the whole frame clause is omitted. "If `frame_end` is omitted, the -// end defaults to `CURRENT ROW`. [...] The default framing option is `RANGE UNBOUNDED PRECEDING`, which is the same as -// `RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`." -opt_frame_clause : frame_type frame_bound { $$ = new FrameDescription{$1, $2, new FrameBound{0, kCurrentRow, false}}; } -| frame_type BETWEEN frame_bound AND frame_bound { $$ = new FrameDescription{$1, $3, $5}; } -| /* empty */ { - $$ = new FrameDescription{kRange, new FrameBound{0, kPreceding, true}, new FrameBound{0, kCurrentRow, false}}; -}; - -frame_type : RANGE { $$ = kRange; } -| ROWS { $$ = kRows; } -| GROUPS { $$ = kGroups; }; - -frame_bound : UNBOUNDED PRECEDING { $$ = new FrameBound{0, kPreceding, true}; } -| INTVAL PRECEDING { $$ = new FrameBound{$1, kPreceding, false}; } -| UNBOUNDED FOLLOWING { $$ = new FrameBound{0, kFollowing, true}; } -| INTVAL FOLLOWING { $$ = new FrameBound{$1, kFollowing, false}; } -| CURRENT_ROW { $$ = new FrameBound{0, kCurrentRow, false}; }; - -extract_expr : EXTRACT '(' datetime_field FROM expr ')' { $$ = Expr::makeExtract($3, $5); }; - -cast_expr : CAST '(' expr AS column_type ')' { $$ = Expr::makeCast($3, $5); }; - -datetime_field : SECOND { $$ = kDatetimeSecond; } -| MINUTE { $$ = kDatetimeMinute; } -| HOUR { $$ = kDatetimeHour; } -| DAY { $$ = kDatetimeDay; } -| MONTH { $$ = kDatetimeMonth; } -| YEAR { $$ = kDatetimeYear; }; - -datetime_field_plural : SECONDS { $$ = kDatetimeSecond; } -| MINUTES { $$ = kDatetimeMinute; } -| HOURS { $$ = kDatetimeHour; } -| DAYS { $$ = kDatetimeDay; } -| MONTHS { $$ = kDatetimeMonth; } -| YEARS { $$ = kDatetimeYear; }; - -duration_field : datetime_field | datetime_field_plural; - -array_expr : ARRAY '[' expr_list ']' { $$ = Expr::makeArray($3); }; - -array_index : operand '[' int_literal ']' { $$ = Expr::makeArrayIndex($1, $3->ival); }; - -between_expr : operand BETWEEN operand AND operand { $$ = Expr::makeBetween($1, $3, $5); } -| operand NOT BETWEEN operand AND operand { $$ = Expr::makeOpUnary(kOpNot, Expr::makeBetween($1, $4, $6)); }; - -column_name : IDENTIFIER { $$ = Expr::makeColumnRef($1); } -| OFFSET { $$ = Expr::makeColumnRef(strdup("offset")); } -| IDENTIFIER '.' IDENTIFIER { $$ = Expr::makeColumnRef($1, $3); } -| IDENTIFIER '.' IDENTIFIER '.' IDENTIFIER { $$ = Expr::makeColumnRef($1, $3, $5); } -| '*' { $$ = Expr::makeStar(); } -| IDENTIFIER '.' '*' { $$ = Expr::makeStar($1); }; - -literal : string_literal | bool_literal | num_literal | null_literal | date_literal | interval_literal | param_expr; - -string_literal : STRING { $$ = Expr::makeLiteral($1); }; - -bool_literal : TRUE { $$ = Expr::makeLiteral(true); } -| FALSE { $$ = Expr::makeLiteral(false); }; - -num_literal : FLOATVAL { $$ = Expr::makeLiteral($1); } -| int_literal; - -int_literal : INTVAL { $$ = Expr::makeLiteral($1); } -| BIGINTVAL { $$ = Expr::makeLiteralIntString($1); }; - -null_literal : NULL { $$ = Expr::makeNullLiteral(); }; - -date_literal : DATE STRING { - int day{0}, month{0}, year{0}, chars_parsed{0}; - // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character - if (sscanf($2, "%4d-%2d-%2d%n", &day, &month, &year, &chars_parsed) != 3 || $2[chars_parsed] != 0) { - free($2); - yyerror(&yyloc, result, scanner, "Found incorrect date format. Expected format: YYYY-MM-DD"); - YYERROR; - } - $$ = Expr::makeDateLiteral($2); -}; - -interval_literal : INTVAL duration_field { $$ = Expr::makeIntervalLiteral($1, $2); } -| INTERVAL STRING datetime_field { - int duration{0}, chars_parsed{0}; - // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character - if (sscanf($2, "%d%n", &duration, &chars_parsed) != 1 || $2[chars_parsed] != 0) { - free($2); - yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER"); - YYERROR; - } - free($2); - $$ = Expr::makeIntervalLiteral(duration, $3); -} -| INTERVAL STRING { - int duration{0}, chars_parsed{0}; - // 'seconds' and 'minutes' are the longest accepted interval qualifiers (7 chars) + null byte - char unit_string[8]; - // If the whole string is parsed, chars_parsed points to the terminating null byte after the last character - if (sscanf($2, "%d %7s%n", &duration, unit_string, &chars_parsed) != 2 || $2[chars_parsed] != 0) { - free($2); - yyerror(&yyloc, result, scanner, "Found incorrect interval format. Expected format: INTEGER INTERVAL_QUALIIFIER"); - YYERROR; - } - free($2); - - DatetimeField unit; - if (strcasecmp(unit_string, "second") == 0 || strcasecmp(unit_string, "seconds") == 0) { - unit = kDatetimeSecond; - } else if (strcasecmp(unit_string, "minute") == 0 || strcasecmp(unit_string, "minutes") == 0) { - unit = kDatetimeMinute; - } else if (strcasecmp(unit_string, "hour") == 0 || strcasecmp(unit_string, "hours") == 0) { - unit = kDatetimeHour; - } else if (strcasecmp(unit_string, "day") == 0 || strcasecmp(unit_string, "days") == 0) { - unit = kDatetimeDay; - } else if (strcasecmp(unit_string, "month") == 0 || strcasecmp(unit_string, "months") == 0) { - unit = kDatetimeMonth; - } else if (strcasecmp(unit_string, "year") == 0 || strcasecmp(unit_string, "years") == 0) { - unit = kDatetimeYear; - } else { - yyerror(&yyloc, result, scanner, "Interval qualifier is unknown."); - YYERROR; - } - $$ = Expr::makeIntervalLiteral(duration, unit); -}; - -param_expr : '?' { - $$ = Expr::makeParameter(yylloc.total_column); - $$->ival2 = yyloc.param_list.size(); - yyloc.param_list.push_back($$); -}; - -/****************************** - * Table - ******************************/ -table_ref : table_ref_atomic | table_ref_commalist ',' table_ref_atomic { - $1->push_back($3); - auto tbl = new TableRef(kTableCrossProduct); - tbl->list = $1; - $$ = tbl; -}; - -table_ref_atomic : nonjoin_table_ref_atomic | join_clause; - -nonjoin_table_ref_atomic : table_ref_name | '(' select_statement ')' opt_table_alias { - auto tbl = new TableRef(kTableSelect); - tbl->select = $2; - tbl->alias = $4; - $$ = tbl; -}; - -table_ref_commalist : table_ref_atomic { - $$ = new std::vector(); - $$->push_back($1); -} -| table_ref_commalist ',' table_ref_atomic { - $1->push_back($3); - $$ = $1; -}; - -table_ref_name : table_name opt_table_alias { - auto tbl = new TableRef(kTableName); - tbl->schema = $1.schema; - tbl->name = $1.name; - tbl->alias = $2; - $$ = tbl; -}; - -table_ref_name_no_alias : table_name { - $$ = new TableRef(kTableName); - $$->schema = $1.schema; - $$->name = $1.name; -}; - -table_name : IDENTIFIER { - $$.schema = nullptr; - $$.name = $1; -} -| IDENTIFIER '.' IDENTIFIER { - $$.schema = $1; - $$.name = $3; -}; - -opt_index_name : IDENTIFIER { $$ = $1; } -| /* empty */ { $$ = nullptr; }; - -table_alias : alias | AS IDENTIFIER '(' ident_commalist ')' { $$ = new Alias($2, $4); }; - -opt_table_alias : table_alias | /* empty */ { $$ = nullptr; }; - -alias : AS IDENTIFIER { $$ = new Alias($2); } -| IDENTIFIER { $$ = new Alias($1); }; - -opt_alias : alias | /* empty */ { $$ = nullptr; }; - -/****************************** - * Row Locking Descriptions - ******************************/ - -opt_locking_clause : opt_locking_clause_list { $$ = $1; } -| /* empty */ { $$ = nullptr; }; - -opt_locking_clause_list : locking_clause { - $$ = new std::vector(); - $$->push_back($1); -} -| opt_locking_clause_list locking_clause { - $1->push_back($2); - $$ = $1; -}; - -locking_clause : FOR row_lock_mode opt_row_lock_policy { - $$ = new LockingClause(); - $$->rowLockMode = $2; - $$->rowLockWaitPolicy = $3; - $$->tables = nullptr; -} -| FOR row_lock_mode OF ident_commalist opt_row_lock_policy { - $$ = new LockingClause(); - $$->rowLockMode = $2; - $$->tables = $4; - $$->rowLockWaitPolicy = $5; -}; - -row_lock_mode : UPDATE { $$ = RowLockMode::ForUpdate; } -| NO KEY UPDATE { $$ = RowLockMode::ForNoKeyUpdate; } -| SHARE { $$ = RowLockMode::ForShare; } -| KEY SHARE { $$ = RowLockMode::ForKeyShare; }; - -opt_row_lock_policy : SKIP LOCKED { $$ = RowLockWaitPolicy::SkipLocked; } -| NOWAIT { $$ = RowLockWaitPolicy::NoWait; } -| /* empty */ { $$ = RowLockWaitPolicy::None; }; - -/****************************** - * With Descriptions - ******************************/ - -opt_with_clause : with_clause | /* empty */ { $$ = nullptr; }; - -with_clause : WITH with_description_list { $$ = $2; }; - -with_description_list : with_description { - $$ = new std::vector(); - $$->push_back($1); -} -| with_description_list ',' with_description { - $1->push_back($3); - $$ = $1; -}; - -with_description : IDENTIFIER AS select_with_paren { - $$ = new WithDescription(); - $$->alias = $1; - $$->select = $3; -}; - -/****************************** - * Join Statements - ******************************/ - -join_clause : table_ref_atomic NATURAL JOIN nonjoin_table_ref_atomic { - $$ = new TableRef(kTableJoin); - $$->join = new JoinDefinition(); - $$->join->type = kJoinNatural; - $$->join->natural = true; - $$->join->left = $1; - $$->join->right = $4; -} -| table_ref_atomic NATURAL natural_join_type JOIN nonjoin_table_ref_atomic { - $$ = new TableRef(kTableJoin); - $$->join = new JoinDefinition(); - $$->join->type = (JoinType)$3; - $$->join->natural = true; - $$->join->left = $1; - $$->join->right = $5; -} -| table_ref_atomic CROSS JOIN nonjoin_table_ref_atomic { - $$ = new TableRef(kTableJoin); - $$->join = new JoinDefinition(); - $$->join->type = kJoinCross; - $$->join->left = $1; - $$->join->right = $4; -} -| table_ref_atomic opt_join_type JOIN table_ref_atomic ON join_condition { - $$ = new TableRef(kTableJoin); - $$->join = new JoinDefinition(); - $$->join->type = (JoinType)$2; - $$->join->left = $1; - $$->join->right = $4; - $$->join->condition = $6; -} -| table_ref_atomic opt_join_type JOIN table_ref_atomic USING '(' ident_commalist ')' { - $$ = new TableRef(kTableJoin); - $$->join = new JoinDefinition(); - $$->join->type = $2; - $$->join->left = $1; - $$->join->right = $4; - $$->join->namedColumns = $7; -}; - -opt_join_type : INNER { $$ = kJoinInner; } -| LEFT OUTER { $$ = kJoinLeft; } -| LEFT { $$ = kJoinLeft; } -| RIGHT OUTER { $$ = kJoinRight; } -| RIGHT { $$ = kJoinRight; } -| FULL OUTER { $$ = kJoinFull; } -| OUTER { $$ = kJoinFull; } -| FULL { $$ = kJoinFull; } -| /* empty, default */ { $$ = kJoinInner; }; - -natural_join_type : INNER { $$ = kJoinInner; } -| LEFT OUTER { $$ = kJoinLeft; } -| LEFT { $$ = kJoinLeft; } -| RIGHT OUTER { $$ = kJoinRight; } -| RIGHT { $$ = kJoinRight; } -| FULL OUTER { $$ = kJoinFull; } -| FULL { $$ = kJoinFull; }; - -join_condition : expr; - -/****************************** - * Misc - ******************************/ - -ident_commalist : IDENTIFIER { - $$ = new std::vector(); - $$->push_back($1); -} -| ident_commalist ',' IDENTIFIER { - $1->push_back($3); - $$ = $1; -}; - -// clang-format off -%% - -/********************************* - ** Section 4: Additional C code - *********************************/ - -/* empty */ - - // clang-format on diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp b/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp deleted file mode 100644 index 87ea092d62..0000000000 --- a/extern/hyrise_sql_parser/src/parser/flex_lexer.cpp +++ /dev/null @@ -1,4620 +0,0 @@ -#line 1 "flex_lexer.cpp" - -#line 3 "flex_lexer.cpp" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -#ifdef yy_create_buffer -#define hsql__create_buffer_ALREADY_DEFINED -#else -#define yy_create_buffer hsql__create_buffer -#endif - -#ifdef yy_delete_buffer -#define hsql__delete_buffer_ALREADY_DEFINED -#else -#define yy_delete_buffer hsql__delete_buffer -#endif - -#ifdef yy_scan_buffer -#define hsql__scan_buffer_ALREADY_DEFINED -#else -#define yy_scan_buffer hsql__scan_buffer -#endif - -#ifdef yy_scan_string -#define hsql__scan_string_ALREADY_DEFINED -#else -#define yy_scan_string hsql__scan_string -#endif - -#ifdef yy_scan_bytes -#define hsql__scan_bytes_ALREADY_DEFINED -#else -#define yy_scan_bytes hsql__scan_bytes -#endif - -#ifdef yy_init_buffer -#define hsql__init_buffer_ALREADY_DEFINED -#else -#define yy_init_buffer hsql__init_buffer -#endif - -#ifdef yy_flush_buffer -#define hsql__flush_buffer_ALREADY_DEFINED -#else -#define yy_flush_buffer hsql__flush_buffer -#endif - -#ifdef yy_load_buffer_state -#define hsql__load_buffer_state_ALREADY_DEFINED -#else -#define yy_load_buffer_state hsql__load_buffer_state -#endif - -#ifdef yy_switch_to_buffer -#define hsql__switch_to_buffer_ALREADY_DEFINED -#else -#define yy_switch_to_buffer hsql__switch_to_buffer -#endif - -#ifdef yypush_buffer_state -#define hsql_push_buffer_state_ALREADY_DEFINED -#else -#define yypush_buffer_state hsql_push_buffer_state -#endif - -#ifdef yypop_buffer_state -#define hsql_pop_buffer_state_ALREADY_DEFINED -#else -#define yypop_buffer_state hsql_pop_buffer_state -#endif - -#ifdef yyensure_buffer_stack -#define hsql_ensure_buffer_stack_ALREADY_DEFINED -#else -#define yyensure_buffer_stack hsql_ensure_buffer_stack -#endif - -#ifdef yylex -#define hsql_lex_ALREADY_DEFINED -#else -#define yylex hsql_lex -#endif - -#ifdef yyrestart -#define hsql_restart_ALREADY_DEFINED -#else -#define yyrestart hsql_restart -#endif - -#ifdef yylex_init -#define hsql_lex_init_ALREADY_DEFINED -#else -#define yylex_init hsql_lex_init -#endif - -#ifdef yylex_init_extra -#define hsql_lex_init_extra_ALREADY_DEFINED -#else -#define yylex_init_extra hsql_lex_init_extra -#endif - -#ifdef yylex_destroy -#define hsql_lex_destroy_ALREADY_DEFINED -#else -#define yylex_destroy hsql_lex_destroy -#endif - -#ifdef yyget_debug -#define hsql_get_debug_ALREADY_DEFINED -#else -#define yyget_debug hsql_get_debug -#endif - -#ifdef yyset_debug -#define hsql_set_debug_ALREADY_DEFINED -#else -#define yyset_debug hsql_set_debug -#endif - -#ifdef yyget_extra -#define hsql_get_extra_ALREADY_DEFINED -#else -#define yyget_extra hsql_get_extra -#endif - -#ifdef yyset_extra -#define hsql_set_extra_ALREADY_DEFINED -#else -#define yyset_extra hsql_set_extra -#endif - -#ifdef yyget_in -#define hsql_get_in_ALREADY_DEFINED -#else -#define yyget_in hsql_get_in -#endif - -#ifdef yyset_in -#define hsql_set_in_ALREADY_DEFINED -#else -#define yyset_in hsql_set_in -#endif - -#ifdef yyget_out -#define hsql_get_out_ALREADY_DEFINED -#else -#define yyget_out hsql_get_out -#endif - -#ifdef yyset_out -#define hsql_set_out_ALREADY_DEFINED -#else -#define yyset_out hsql_set_out -#endif - -#ifdef yyget_leng -#define hsql_get_leng_ALREADY_DEFINED -#else -#define yyget_leng hsql_get_leng -#endif - -#ifdef yyget_text -#define hsql_get_text_ALREADY_DEFINED -#else -#define yyget_text hsql_get_text -#endif - -#ifdef yyget_lineno -#define hsql_get_lineno_ALREADY_DEFINED -#else -#define yyget_lineno hsql_get_lineno -#endif - -#ifdef yyset_lineno -#define hsql_set_lineno_ALREADY_DEFINED -#else -#define yyset_lineno hsql_set_lineno -#endif - -#ifdef yyget_column -#define hsql_get_column_ALREADY_DEFINED -#else -#define yyget_column hsql_get_column -#endif - -#ifdef yyset_column -#define hsql_set_column_ALREADY_DEFINED -#else -#define yyset_column hsql_set_column -#endif - -#ifdef yywrap -#define hsql_wrap_ALREADY_DEFINED -#else -#define yywrap hsql_wrap -#endif - -#ifdef yyget_lval -#define hsql_get_lval_ALREADY_DEFINED -#else -#define yyget_lval hsql_get_lval -#endif - -#ifdef yyset_lval -#define hsql_set_lval_ALREADY_DEFINED -#else -#define yyset_lval hsql_set_lval -#endif - -#ifdef yyget_lloc -#define hsql_get_lloc_ALREADY_DEFINED -#else -#define yyget_lloc hsql_get_lloc -#endif - -#ifdef yyset_lloc -#define hsql_set_lloc_ALREADY_DEFINED -#else -#define yyset_lloc hsql_set_lloc -#endif - -#ifdef yyalloc -#define hsql_alloc_ALREADY_DEFINED -#else -#define yyalloc hsql_alloc -#endif - -#ifdef yyrealloc -#define hsql_realloc_ALREADY_DEFINED -#else -#define yyrealloc hsql_realloc -#endif - -#ifdef yyfree -#define hsql_free_ALREADY_DEFINED -#else -#define yyfree hsql_free -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767 - 1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647 - 1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -/* begin standard C++ headers. */ - -/* TODO: this is always defined, so inline it */ -#define yyconst const - -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) -#else -#define yynoreturn -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an - * integer in range [0..255] for use as an array index. - */ -#define YY_SC_TO_UI(c) ((YY_CHAR)(c)) - -/* An opaque pointer. */ -#ifndef YY_TYPEDEF_YY_SCANNER_T -#define YY_TYPEDEF_YY_SCANNER_T -typedef void* yyscan_t; -#endif - -/* For convenience, these vars (plus the bison vars far below) - are macros in the reentrant scanner. */ -#define yyin yyg->yyin_r -#define yyout yyg->yyout_r -#define yyextra yyg->yyextra_r -#define yyleng yyg->yyleng_r -#define yytext yyg->yytext_r -#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) -#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) -#define yy_flex_debug yyg->yy_flex_debug_r - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yyg->yy_start = 1 + 2 * -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yyg->yy_start - 1) / 2) -#define YYSTATE YY_START -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin, yyscanner) -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state* YY_BUFFER_STATE; -#endif - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -#define YY_LESS_LINENO(n) -#define YY_LINENO_REWIND_TO(ptr) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg); \ - *yy_cp = yyg->yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } while (0) -#define unput(c) yyunput(c, yyg->yytext_ptr, yyscanner) - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state { - FILE* yy_input_file; - - char* yy_ch_buf; /* input buffer */ - char* yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - int yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 -}; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER (yyg->yy_buffer_stack ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] : NULL) -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] - -void yyrestart(FILE* input_file, yyscan_t yyscanner); -void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); -YY_BUFFER_STATE yy_create_buffer(FILE* file, int size, yyscan_t yyscanner); -void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); -void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); -void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); -void yypop_buffer_state(yyscan_t yyscanner); - -static void yyensure_buffer_stack(yyscan_t yyscanner); -static void yy_load_buffer_state(yyscan_t yyscanner); -static void yy_init_buffer(YY_BUFFER_STATE b, FILE* file, yyscan_t yyscanner); -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER, yyscanner) - -YY_BUFFER_STATE yy_scan_buffer(char* base, yy_size_t size, yyscan_t yyscanner); -YY_BUFFER_STATE yy_scan_string(const char* yy_str, yyscan_t yyscanner); -YY_BUFFER_STATE yy_scan_bytes(const char* bytes, int len, yyscan_t yyscanner); - -void* yyalloc(yy_size_t, yyscan_t yyscanner); -void* yyrealloc(void*, yy_size_t, yyscan_t yyscanner); -void yyfree(void*, yyscan_t yyscanner); - -#define yy_new_buffer yy_create_buffer -#define yy_set_interactive(is_interactive) \ - { \ - if (!YY_CURRENT_BUFFER) { \ - yyensure_buffer_stack(yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } -#define yy_set_bol(at_bol) \ - { \ - if (!YY_CURRENT_BUFFER) { \ - yyensure_buffer_stack(yyscanner); \ - YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -#define hsql_wrap(yyscanner) (/*CONSTCOND*/ 1) -#define YY_SKIP_YYWRAP -typedef flex_uint8_t YY_CHAR; - -typedef int yy_state_type; - -#define yytext_ptr yytext_r - -static yy_state_type yy_get_previous_state(yyscan_t yyscanner); -static yy_state_type yy_try_NUL_trans(yy_state_type current_state, yyscan_t yyscanner); -static int yy_get_next_buffer(yyscan_t yyscanner); -static void yynoreturn yy_fatal_error(const char* msg, yyscan_t yyscanner); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yyg->yytext_ptr = yy_bp; \ - yyleng = (int)(yy_cp - yy_bp); \ - yyg->yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 197 -#define YY_END_OF_BUFFER 198 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; -}; -static const flex_int16_t yy_accept[1406] = { - 0, 0, 0, 194, 194, 2, 2, 198, 196, 4, 4, 196, 196, 183, 183, 192, 183, 183, 188, 183, 183, - 183, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 196, 183, 194, 195, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 4, 175, 0, 179, 1, 0, 185, 184, 188, 0, 181, - - 177, 176, 173, 178, 182, 191, 191, 191, 191, 191, 191, 12, 191, 191, 191, 19, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 74, - 191, 191, 77, 86, 191, 191, 191, 191, 191, 191, 191, 191, 191, 105, 191, 191, 110, 113, 114, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 151, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 0, 180, 194, 193, 2, 2, 2, 2, 2, - - 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 189, 0, 0, 184, 0, 0, 186, 174, 5, 191, 7, 191, 191, 10, 191, 13, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 34, 191, 191, 191, 191, 191, 191, 191, 45, 191, - 191, 191, 191, 50, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 61, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 81, 191, 191, 89, 191, 191, 191, 191, 191, 191, 191, 191, 101, 191, - 191, 106, 191, 191, 191, 111, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - - 191, 191, 191, 191, 191, 191, 191, 191, 137, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 152, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 185, 0, 184, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 20, 191, 22, 23, 24, 191, 191, 191, 29, 191, 191, 191, 32, 35, - - 191, 191, 191, 191, 191, 41, 191, 191, 191, 47, 48, 191, 191, 191, 191, 191, 191, 191, 191, 58, 191, - 191, 191, 191, 64, 65, 191, 191, 69, 191, 71, 72, 191, 191, 191, 191, 191, 191, 85, 191, 88, 90, - 91, 191, 93, 191, 191, 96, 191, 191, 191, 191, 191, 108, 191, 191, 191, 191, 117, 191, 191, 120, 191, - 191, 191, 191, 125, 191, 191, 191, 191, 191, 131, 191, 191, 191, 191, 139, 140, 191, 191, 191, 191, 191, - 147, 148, 149, 191, 154, 191, 191, 191, 191, 191, 191, 191, 191, 191, 164, 191, - - 166, 191, 168, 169, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 6, 8, 191, 11, 191, - 15, 191, 191, 191, 191, 191, 191, 191, 191, 191, 31, 191, 191, 191, 191, 191, 191, 40, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 57, 59, 191, 191, 191, 191, 67, 191, 73, 75, 191, 78, 79, - 191, 191, 191, 191, 92, 94, 191, 97, 98, 191, 102, 191, 191, 191, 191, 115, - - 116, 191, 191, 191, 191, 191, 124, 191, 191, 191, 129, 191, 191, 191, 191, 138, 191, 191, 191, 144, 191, - 191, 191, 191, 191, 157, 191, 191, 191, 161, 191, 191, 191, 167, 170, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 191, 14, 191, 17, 191, 191, 191, - 25, 27, 191, 30, 191, 191, 191, 191, 191, 39, 191, 43, 191, 46, 191, 51, 52, 191, 54, 191, 191, - 191, 191, 63, 66, 68, 70, 76, 80, 191, 191, 191, 87, 95, 99, 103, 191, 107, 191, 112, 191, 191, - 191, 191, 191, 191, 127, 191, 191, 132, 134, 136, 191, 142, 191, 145, 191, 191, - - 191, 191, 191, 158, 159, 160, 162, 191, 191, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 0, 9, 16, 18, 21, 191, 26, 28, 191, 191, 191, 37, 38, 191, 191, 191, - - 53, 55, 56, 191, 62, 82, 191, 191, 100, 104, 191, 191, 191, 191, 122, 123, 191, 191, 191, 133, 135, - 191, 143, 191, 191, 191, 191, 191, 163, 165, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 191, 0, 33, 191, 42, 44, 49, - 191, 191, 84, 109, 191, 191, 191, 191, 128, 130, 141, 191, 191, 191, 155, 191, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 0, 191, 0, 191, 60, 83, 191, 119, 121, 191, 146, 150, 191, 156, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 36, 118, 126, 191, 2, 2, 2, 2, - 2, 2, 2, 0, 0, 171, 153, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, - 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 172, 2, 2, 0, 2, - - 0, 2, 187, 2, 0}; - -static const YY_CHAR yy_ec[256] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 4, 5, 1, 1, 6, 7, 8, 6, 6, 6, 9, 6, 10, 11, 6, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 6, 6, 22, 23, 24, 6, 1, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 6, 1, 6, 6, 51, 52, 53, 54, 55, 56, - - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 6, 79, 6, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - -static const YY_CHAR yy_meta[80] = {0, 1, 1, 2, 1, 3, 1, 1, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 8, 8, - 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 8, - 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 1}; - -static const flex_int16_t yy_base[1421] = { - 0, 0, 0, 667, 661, 79, 0, 662, 9173, 157, 159, 635, 0, 9173, 648, 9173, 153, - 152, 164, 154, 622, 156, 194, 152, 158, 181, 169, 241, 205, 228, 254, 148, 159, 239, - 270, 276, 294, 234, 0, 305, 346, 390, 308, 308, 166, 214, 0, 558, 0, 613, 0, - 192, 252, 582, 596, 0, 591, 0, 236, 375, 450, 331, 559, 239, 507, 586, 641, 694, - 743, 796, 382, 471, 840, 507, 550, 573, 587, 892, 942, 992, 600, 643, 1039, 1092, 686, - 664, 736, 741, 514, 481, 314, 9173, 553, 9173, 9173, 541, 250, 253, 348, 347, 9173, - - 527, 9173, 9173, 9173, 9173, 0, 257, 291, 363, 403, 300, 353, 447, 351, 345, 0, 490, - 373, 457, 415, 375, 490, 797, 741, 376, 416, 430, 447, 472, 818, 505, 506, 505, 511, - 513, 521, 537, 561, 613, 565, 568, 0, 581, 578, 856, 585, 591, 583, 641, 644, 855, - 636, 650, 700, 668, 688, 694, 714, 715, 0, 721, 734, 759, 747, 770, 810, 787, 877, - 795, 878, 799, 896, 894, 803, 812, 802, 821, 855, 881, 856, 889, 896, 924, 937, 922, - 922, 940, 929, 946, 935, 960, 446, 9173, 0, 9173, 0, 431, 0, 487, 0, - - 0, 476, 1158, 1204, 1251, 1300, 0, 465, 0, 0, 0, 0, 990, 993, 1079, 1039, 1297, - 1084, 1296, 1344, 1293, 1052, 1309, 982, 1353, 1394, 1389, 1394, 1424, 1477, 1518, 1163, 1449, 1164, - 1568, 1457, 1618, 1210, 1211, 1470, 1527, 1485, 1564, 1576, 1617, 1634, 1633, 1675, 1653, 1673, 1698, - 1748, 1678, 1728, 1741, 1764, 1813, 1866, 1790, 1735, 1801, 1851, 1907, 1860, 1910, 1929, 1932, 1956, - 1971, 1977, 2007, 2026, 2024, 2024, 2079, 2075, 2078, 2092, 2142, 2142, 2143, 2182, 2183, 2208, 2197, - 2230, 2223, 2250, 2253, 2280, 2328, 2295, 2309, 2345, 2361, 2368, 2375, 2401, 436, 0, - - 9173, 473, 427, 976, 429, 1176, 1276, 9173, 0, 998, 0, 1006, 1000, 0, 1016, 0, 1022, - 1053, 1083, 1100, 1099, 1101, 1299, 1096, 1094, 1120, 1137, 1133, 1161, 1155, 1161, 1175, 1170, 1209, - 1217, 1226, 1354, 1228, 1227, 1213, 0, 1273, 1262, 1308, 1310, 0, 1354, 1352, 1357, 1342, 1357, - 1355, 1396, 1412, 1419, 1411, 1520, 1411, 1413, 1426, 1438, 1457, 1461, 1464, 1497, 1505, 1505, 1516, - 1521, 1522, 1551, 1510, 1520, 0, 1515, 1542, 1568, 1582, 1596, 1582, 1583, 1575, 0, 1582, 1582, - 0, 1611, 1624, 1623, 1644, 1678, 1696, 1686, 1735, 1698, 1790, 1735, 1750, 1746, 1758, - - 1798, 1783, 1803, 1800, 1797, 1814, 1808, 1824, 0, 1827, 1826, 1839, 1846, 1839, 1840, 1849, 1848, - 1848, 1862, 1876, 0, 1868, 1900, 1902, 1921, 1922, 1960, 1959, 1956, 1975, 1964, 1973, 2010, 2001, - 1999, 9173, 0, 472, 2470, 2480, 2529, 2498, 2508, 0, 2394, 2522, 2523, 2524, 2401, 2522, 2539, - 2559, 2575, 2580, 2611, 2610, 2590, 2626, 2676, 2662, 2667, 2712, 2713, 2726, 2739, 2759, 2772, 2772, - 2808, 2809, 2821, 2838, 2857, 2883, 2864, 2904, 2878, 2897, 2923, 2940, 2949, 2954, 2979, 2980, 3006, - 3006, 3026, 3043, 3051, 3067, 3096, 3094, 3117, 3122, 3150, 3154, 3167, 3181, 3215, 3217, - - 3220, 3266, 3267, 3269, 3292, 3306, 3309, 3323, 3339, 3356, 3370, 3362, 3404, 3419, 3472, 3433, 3473, - 3470, 3487, 3512, 3513, 3526, 3543, 3559, 3563, 3576, 3589, 3612, 3615, 3668, 3632, 3719, 3668, 3705, - 3713, 3661, 3753, 3764, 3783, 3781, 3790, 3820, 3829, 3834, 3843, 3860, 3879, 3874, 3886, 3917, 3928, - 3931, 3937, 3973, 3948, 3989, 3994, 3993, 4024, 4019, 4044, 4045, 4085, 4061, 4105, 4092, 4136, 4144, - 4153, 4161, 4192, 0, 470, 4229, 4257, 4267, 4277, 2008, 2016, 2017, 2021, 2029, 2044, 2063, 2067, - 2079, 0, 2094, 0, 0, 2104, 2094, 2105, 2118, 0, 2117, 2122, 2141, 2129, 0, - - 2138, 2140, 2151, 2173, 2202, 2200, 2221, 2230, 2245, 0, 0, 2260, 2258, 2263, 2259, 2264, 2288, - 2293, 2306, 0, 2293, 2304, 2312, 2343, 0, 0, 2349, 2338, 0, 2346, 0, 2370, 2391, 2404, - 2405, 2433, 2434, 2575, 0, 2466, 0, 0, 0, 2461, 0, 2470, 2478, 0, 2479, 2636, 2499, - 2498, 2533, 0, 2591, 2591, 2585, 2611, 0, 2628, 2637, 0, 2653, 2660, 2664, 2665, 0, 2657, - 2689, 2688, 2691, 2712, 0, 2719, 2733, 2749, 2752, 0, 0, 2755, 2765, 2765, 2783, 2774, 0, - 0, 2784, 2788, 0, 2807, 2792, 2815, 2816, 2839, 2822, 2845, 2871, 2887, 0, 2897, - - 0, 2920, 0, 2914, 469, 4287, 4297, 4307, 4317, 4303, 4306, 4100, 4314, 4351, 4349, 4365, 4363, - 4402, 4404, 4411, 4437, 4444, 4467, 4458, 4493, 4498, 4500, 4540, 4500, 4549, 4570, 4589, 4577, 4596, - 4632, 4621, 4638, 4646, 4663, 4686, 4685, 4688, 4694, 4738, 4735, 4744, 4752, 4783, 4797, 4805, 4803, - 4833, 4854, 4856, 4863, 4889, 4896, 4910, 4919, 4945, 4950, 4952, 4955, 4972, 4996, 5013, 5001, 5018, - 5033, 5079, 5064, 5070, 5115, 5116, 5124, 5130, 5161, 5167, 5062, 5179, 5190, 5178, 5223, 5222, 5246, - 5251, 5277, 5272, 5298, 5324, 5313, 5349, 5338, 5363, 5364, 5394, 5403, 5405, 5420, 5434, - - 5457, 5460, 5459, 5486, 5499, 5512, 5514, 5545, 5525, 5558, 5565, 5565, 5591, 5594, 5605, 5620, 5631, - 5634, 5664, 5667, 5678, 5686, 5710, 5723, 5727, 5742, 5766, 5781, 5782, 5821, 5822, 5835, 5836, 5861, - 5862, 5878, 461, 0, 0, 2916, 0, 2938, 0, 2939, 2942, 2967, 2971, 2975, 2984, 2979, 2985, - 2996, 0, 3000, 3010, 3009, 3035, 3029, 3046, 0, 3047, 3040, 3057, 3069, 3072, 3081, 3067, 3076, - 3093, 3107, 3114, 0, 0, 3100, 3136, 3128, 3140, 3138, 3175, 0, 0, 3163, 0, 0, 3167, - 3194, 3212, 3196, 0, 0, 3209, 0, 0, 3213, 3220, 3250, 3235, 3253, 3260, 0, - - 0, 3280, 3268, 3291, 3280, 3309, 0, 3328, 3331, 3328, 0, 3340, 3349, 3353, 3353, 0, 3365, - 3379, 3387, 3373, 3375, 3377, 3403, 3406, 3412, 0, 3422, 3427, 3428, 0, 3417, 3438, 3442, 0, - 0, 427, 5889, 5897, 5898, 5934, 5918, 5954, 5955, 5957, 5984, 5997, 6011, 6019, 6027, 6040, 6047, - 6073, 6073, 6086, 6099, 6126, 6126, 6128, 6139, 6165, 6179, 6177, 6178, 6205, 6228, 6230, 6231, 6235, - 6261, 6286, 6287, 6288, 6313, 6328, 6342, 6330, 6364, 6377, 6386, 6401, 6420, 6423, 6437, 6462, 6478, - 6466, 6493, 6508, 6522, 6525, 6539, 6542, 6578, 6566, 6595, 6608, 6622, 6647, 6651, 6664, - - 6675, 6677, 6717, 6718, 6747, 6704, 6754, 6773, 6780, 6787, 6810, 6813, 6840, 6849, 6866, 6875, 6901, - 6906, 6734, 6918, 6933, 6955, 6975, 6974, 6989, 7015, 7028, 7029, 7030, 7045, 7074, 7077, 7088, 7096, - 397, 3441, 0, 3451, 0, 3500, 3524, 3513, 3517, 0, 3527, 0, 3554, 3571, 3582, 3579, 3577, - 0, 3605, 0, 3605, 0, 3615, 0, 0, 3626, 0, 3620, 3619, 3634, 3633, 0, 0, 0, - 0, 0, 0, 3632, 3658, 3684, 0, 0, 3671, 0, 3683, 0, 3699, 0, 3682, 3697, 3727, - 3734, 3717, 3730, 0, 3743, 3745, 3730, 3756, 0, 3769, 0, 3773, 0, 3786, 3793, - - 3796, 3798, 3860, 0, 0, 0, 0, 3863, 3879, 385, 7122, 7136, 7120, 7144, 7152, 7165, 7192, - 7169, 7191, 7208, 7222, 7237, 7254, 7251, 7278, 7293, 7297, 7312, 7334, 7348, 7349, 7363, 7380, 7394, - 7414, 7428, 7402, 7436, 7454, 7456, 7480, 7481, 7500, 7517, 7525, 7531, 7542, 7565, 7586, 7588, 7591, - 7593, 7608, 7635, 7639, 7664, 7650, 7689, 7690, 7705, 7719, 7730, 7735, 7752, 7766, 7767, 7781, 7798, - 7812, 7813, 7827, 7844, 7858, 7861, 7875, 7904, 7900, 7917, 7931, 7946, 7960, 7963, 7977, 7980, 388, - 0, 0, 0, 0, 3890, 0, 0, 438, 3930, 3945, 0, 0, 3949, 3938, 3995, - - 0, 0, 0, 3997, 0, 0, 4015, 4011, 0, 0, 4037, 4058, 4050, 4054, 0, 0, 4071, - 4059, 4073, 0, 0, 4072, 0, 4081, 4108, 4122, 4141, 4146, 0, 0, 386, 7994, 7997, 8014, - 8028, 8048, 8062, 8067, 8081, 8088, 8107, 8102, 8128, 8133, 8142, 8173, 8159, 8168, 8182, 8208, 8217, - 8225, 8239, 8242, 8259, 8273, 8284, 8307, 8312, 8327, 8340, 8344, 8359, 8383, 8398, 8402, 8415, 8439, - 8452, 8456, 8471, 8495, 8501, 8515, 8516, 8541, 385, 4143, 4353, 0, 4142, 0, 0, 0, 4159, - 4161, 0, 0, 4184, 4193, 4205, 4209, 0, 0, 0, 4190, 4300, 4317, 0, 4330, - - 359, 8546, 4414, 8571, 8582, 8596, 8601, 8622, 8636, 8637, 8651, 8672, 8677, 8548, 8684, 8702, 8707, - 8728, 8733, 8742, 8747, 8768, 8773, 8798, 350, 478, 4321, 4332, 0, 0, 4353, 0, 0, 4359, - 0, 0, 4371, 0, 332, 8839, 4380, 8799, 8824, 8838, 8826, 8846, 8871, 8875, 8888, 8902, 8928, - 8941, 327, 4443, 4405, 0, 0, 0, 4416, 310, 4472, 4410, 8942, 8943, 8968, 8978, 306, 4437, - 9173, 0, 303, 4477, 0, 8995, 276, 4471, 271, 4510, 257, 4504, 240, 4509, 230, 4529, 225, - 4530, 220, 4534, 189, 4536, 187, 4552, 185, 4562, 176, 9173, 172, 0, 177, 174, - - 164, 162, 9173, 0, 9173, 9071, 9081, 9086, 9089, 9098, 9107, 9117, 9127, 9137, 9147, 9151, 9154, - 9159, 9162, 9165}; - -static const flex_int16_t yy_def[1421] = { - 0, 1405, 1, 1406, 1406, 1405, 5, 1405, 1405, 1405, 1405, 1405, 1407, 1405, 1405, 1405, 1405, - 1405, 1408, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1410, 1405, 1411, 1405, 1412, - 1412, 1405, 1412, 1413, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1414, 1414, 65, 65, - 65, 66, 68, 65, 68, 65, 65, 65, 65, 66, 66, 66, 65, 65, 65, 65, 68, - 65, 65, 65, 1415, 1412, 1405, 1405, 1407, 1405, 1405, 1405, 1416, 1417, 1408, 1418, 1405, - - 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1410, 1405, 1411, 1405, 1412, 1412, 1412, 1413, 1412, - - 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 65, 65, 65, 68, 68, - 68, 68, 68, 68, 65, 65, 68, 68, 68, 65, 65, 65, 68, 68, 68, 65, 68, - 68, 68, 65, 68, 68, 65, 68, 65, 68, 65, 65, 68, 68, 68, 68, 65, 65, - 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 65, 65, - 68, 65, 65, 65, 66, 65, 65, 65, 68, 65, 65, 65, 65, 1415, 1412, - - 1405, 1405, 1419, 1417, 1420, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1405, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 65, 65, 65, 65, 68, 68, 68, - 68, 65, 65, 65, 65, 68, 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, - 68, 68, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 68, 68, 68, 68, 65, 65, 68, 65, 65, 68, 68, 68, 68, 65, 65, - - 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 68, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, - 68, 65, 65, 65, 65, 68, 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, - 68, 68, 68, 68, 65, 65, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, - 68, 68, 68, 1412, 1405, 1405, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1412, 1412, 1412, 1412, 1412, 68, 68, 65, 65, 65, 68, 65, 68, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 65, 65, 65, 68, 68, - 68, 68, 68, 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, 65, 65, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 68, 68, 68, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - - 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, 65, 68, 65, 65, 65, 65, 65, - 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 65, 65, - 65, 68, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1412, 68, 68, 68, 68, 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, - 65, 68, 65, 65, 65, 68, 65, 65, 65, 65, 68, 65, 65, 65, 65, 65, 68, - 65, 65, 65, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, 65, - 68, 68, 68, 68, 68, 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, - - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, - 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, 65, 65, 68, 68, 68, 65, 65, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 65, 65, 68, 68, 65, 68, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, - 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 65, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 1405, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1412, 68, 68, 68, - 68, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, - 68, 68, 68, 68, 68, 68, 65, 65, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 65, 65, 65, 65, 1405, 1409, 1405, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - - 1412, 65, 1412, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 68, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 1405, 1409, 1405, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1409, 1409, 1409, 1412, 65, 1412, 65, 65, 65, 68, 68, 68, 68, 68, 68, 65, - 65, 1405, 1405, 1405, 1409, 1409, 1409, 1409, 1412, 1412, 1412, 65, 65, 65, 68, 1405, 1405, - 1405, 1409, 1412, 1412, 1412, 68, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, - 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1405, 1412, 1412, 1405, 1412, - - 1405, 1412, 1405, 1412, 0, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405}; - -static const flex_int16_t yy_nxt[9253] = { - 0, 8, 9, 10, 11, 12, 13, 14, 15, 13, 16, 17, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 38, 45, 38, 38, 46, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 38, 45, 38, 47, 50, 51, 52, 53, 54, 55, 56, 57, 55, 58, - 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 80, 87, 80, 80, 88, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 80, 87, 80, 89, 90, 90, 90, 90, 94, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 95, 97, 100, 101, 102, 104, 105, 113, 1404, 117, 1403, 114, 1402, 147, 148, 1401, 118, - 115, 1400, 99, 197, 90, 1399, 119, 189, 190, 120, - - 116, 1397, 121, 1395, 127, 122, 128, 1393, 113, 123, 117, 129, 114, 124, 147, 148, 130, 118, - 115, 125, 99, 107, 126, 108, 119, 189, 190, 120, 116, 109, 121, 110, 127, 122, 128, 111, - 112, 123, 1391, 129, 137, 124, 191, 1389, 130, 201, 138, 125, 1387, 107, 126, 108, 139, 90, - 90, 1385, 202, 109, 164, 110, 140, 211, 212, 111, 112, 131, 141, 149, 137, 165, 191, 150, - 1383, 132, 138, 166, 133, 151, 303, 134, 139, 305, 135, 142, 309, 136, 164, 1381, 140, 143, - 144, 145, 1379, 131, 141, 149, 146, 165, 152, 150, - - 155, 132, 153, 166, 133, 151, 303, 134, 154, 305, 135, 142, 309, 136, 156, 90, 90, 143, - 144, 145, 157, 158, 1377, 159, 146, 1375, 152, 1371, 155, 167, 153, 160, 187, 168, 310, 161, - 154, 169, 162, 163, 188, 315, 156, 170, 1367, 184, 1360, 185, 157, 158, 186, 159, 207, 208, - 209, 306, 306, 167, 97, 160, 187, 168, 310, 161, 1353, 169, 162, 163, 188, 315, 1339, 170, - 171, 184, 172, 185, 99, 173, 186, 316, 174, 320, 175, 321, 176, 177, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 1325, 324, 311, 1301, - - 171, 1277, 172, 1231, 99, 173, 312, 316, 174, 320, 175, 321, 176, 177, 178, 1185, 331, 244, - 179, 213, 342, 180, 181, 245, 213, 324, 311, 313, 182, 213, 314, 183, 197, 90, 312, 574, - 574, 576, 576, 1279, 1279, 1110, 178, 329, 331, 244, 179, 213, 342, 180, 181, 245, 213, 330, - 343, 313, 182, 213, 314, 183, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 329, - 344, 345, 346, 1035, 317, 318, 206, 1354, 1354, 330, 343, 936, 837, 705, 573, 572, 444, 438, - 319, 437, 325, 326, 327, 246, 328, 436, 347, 213, - - 344, 345, 346, 247, 317, 318, 206, 196, 196, 248, 196, 196, 196, 196, 196, 196, 196, 196, - 319, 213, 325, 326, 327, 246, 328, 322, 347, 213, 196, 196, 196, 247, 323, 332, 214, 213, - 215, 248, 333, 213, 353, 354, 216, 355, 217, 254, 356, 213, 218, 219, 308, 358, 357, 322, - 302, 213, 359, 301, 196, 300, 323, 332, 214, 213, 215, 196, 333, 213, 353, 354, 216, 355, - 217, 254, 356, 360, 218, 219, 255, 358, 357, 210, 213, 213, 359, 196, 196, 196, 213, 196, - 196, 196, 196, 196, 196, 196, 196, 200, 213, 361, - - 196, 256, 364, 360, 198, 257, 255, 196, 196, 196, 213, 258, 365, 366, 220, 259, 213, 367, - 221, 260, 195, 213, 372, 373, 222, 261, 213, 361, 213, 256, 364, 374, 213, 257, 223, 213, - 193, 196, 213, 258, 365, 366, 220, 259, 103, 367, 221, 260, 213, 213, 372, 373, 222, 261, - 93, 362, 213, 91, 363, 374, 213, 1405, 223, 213, 196, 224, 213, 274, 49, 213, 375, 275, - 225, 213, 49, 276, 213, 381, 376, 226, 377, 277, 227, 362, 1405, 228, 363, 382, 294, 213, - 1405, 213, 213, 224, 1405, 274, 295, 213, 375, 275, - - 225, 213, 213, 276, 1405, 381, 376, 226, 377, 277, 227, 385, 213, 228, 1405, 382, 294, 213, - 229, 213, 213, 213, 230, 291, 295, 292, 231, 383, 293, 388, 213, 386, 232, 213, 387, 233, - 1405, 384, 389, 385, 213, 1405, 213, 1405, 390, 1405, 229, 1405, 391, 213, 230, 291, 1405, 292, - 231, 383, 293, 388, 1405, 386, 232, 213, 387, 233, 213, 384, 389, 296, 297, 298, 213, 213, - 390, 213, 213, 213, 391, 392, 234, 213, 235, 213, 339, 340, 213, 236, 341, 393, 394, 213, - 237, 213, 213, 1405, 395, 296, 297, 298, 1405, 213, - - 1405, 213, 213, 213, 1405, 392, 234, 213, 235, 213, 339, 340, 213, 236, 341, 393, 394, 213, - 237, 213, 238, 334, 395, 335, 398, 403, 336, 213, 239, 1405, 406, 240, 337, 1405, 241, 412, - 413, 242, 396, 338, 243, 1405, 397, 414, 348, 415, 349, 1405, 238, 334, 350, 335, 398, 403, - 336, 213, 239, 351, 406, 240, 337, 352, 241, 412, 413, 242, 396, 338, 243, 249, 397, 414, - 348, 415, 349, 250, 251, 252, 350, 378, 416, 379, 253, 368, 419, 351, 1405, 213, 1405, 352, - 1405, 1405, 380, 369, 1405, 1405, 1405, 249, 370, 371, - - 1405, 399, 1405, 250, 251, 252, 400, 378, 416, 379, 253, 368, 419, 404, 401, 213, 262, 417, - 410, 402, 380, 369, 407, 213, 405, 420, 370, 371, 418, 399, 263, 408, 411, 213, 400, 421, - 264, 265, 1405, 409, 1405, 404, 401, 1405, 262, 417, 410, 402, 422, 427, 407, 213, 405, 420, - 428, 1405, 418, 431, 263, 408, 411, 213, 424, 421, 264, 265, 213, 409, 423, 425, 432, 266, - 426, 213, 433, 429, 422, 427, 434, 267, 213, 430, 428, 268, 435, 431, 269, 270, 1405, 1405, - 424, 1405, 1405, 1405, 213, 1405, 423, 425, 432, 266, - - 426, 213, 433, 429, 305, 1405, 434, 267, 213, 430, 1405, 268, 435, 1405, 269, 270, 271, 458, - 213, 213, 445, 213, 213, 213, 459, 213, 578, 272, 213, 213, 213, 213, 305, 273, 579, 580, - 213, 1405, 213, 1405, 581, 213, 1405, 1405, 271, 458, 213, 213, 445, 213, 213, 213, 459, 213, - 578, 272, 213, 213, 213, 213, 582, 273, 579, 580, 213, 278, 213, 279, 581, 213, 280, 213, - 1405, 281, 447, 282, 213, 283, 284, 1405, 213, 213, 448, 1405, 213, 583, 213, 213, 582, 1405, - 457, 1405, 1405, 278, 1405, 279, 1405, 1405, 280, 213, - - 213, 281, 447, 282, 213, 283, 284, 213, 213, 213, 448, 213, 213, 583, 213, 213, 285, 213, - 457, 213, 286, 213, 446, 287, 288, 451, 213, 213, 213, 584, 289, 213, 585, 290, 586, 213, - 587, 591, 592, 213, 213, 1405, 1405, 1405, 285, 213, 1405, 213, 286, 213, 446, 287, 288, 451, - 213, 213, 593, 584, 289, 213, 585, 290, 586, 1405, 587, 591, 592, 1405, 213, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 1405, 594, 595, 1405, 1405, 593, 596, 439, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 597, 213, 213, - - 213, 213, 598, 599, 1405, 213, 480, 478, 594, 595, 213, 213, 600, 596, 439, 440, 440, 440, - 440, 440, 440, 440, 440, 440, 440, 597, 213, 213, 213, 213, 598, 599, 441, 213, 480, 478, - 1405, 1405, 213, 213, 600, 1405, 1405, 1405, 601, 489, 490, 213, 213, 602, 603, 1405, 213, 213, - 606, 607, 608, 213, 213, 1405, 441, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 601, 489, 490, 213, 213, 602, 603, 206, 213, 213, 606, 607, 608, 213, 213, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 1405, 609, 1405, - - 1405, 610, 1405, 1405, 1405, 1405, 1405, 206, 442, 442, 1405, 443, 443, 443, 443, 443, 443, 443, - 443, 443, 443, 449, 452, 456, 450, 588, 609, 589, 213, 610, 213, 213, 213, 213, 213, 213, - 611, 213, 213, 213, 213, 213, 590, 213, 213, 1405, 1405, 213, 612, 449, 452, 456, 450, 588, - 1405, 589, 213, 213, 213, 213, 213, 213, 213, 213, 611, 213, 213, 213, 213, 213, 590, 213, - 213, 453, 454, 213, 612, 460, 613, 213, 614, 213, 604, 615, 616, 213, 213, 455, 213, 1405, - 213, 213, 617, 1405, 1405, 213, 618, 605, 1405, 1405, - - 213, 453, 454, 1405, 1405, 460, 613, 213, 614, 213, 604, 615, 616, 1405, 213, 455, 213, 465, - 213, 213, 617, 213, 213, 213, 618, 605, 213, 466, 213, 461, 462, 463, 213, 464, 1405, 467, - 213, 213, 619, 1405, 620, 213, 213, 621, 1405, 465, 622, 625, 626, 213, 213, 627, 213, 1405, - 213, 466, 213, 461, 462, 463, 213, 464, 213, 467, 213, 213, 619, 468, 620, 213, 213, 621, - 469, 1405, 622, 625, 626, 213, 1405, 627, 213, 213, 628, 483, 213, 1405, 1405, 479, 629, 1405, - 213, 1405, 213, 630, 213, 468, 1405, 213, 213, 213, - - 469, 470, 213, 471, 213, 213, 472, 631, 491, 213, 628, 483, 473, 213, 213, 479, 629, 213, - 213, 474, 213, 630, 213, 494, 213, 213, 213, 213, 1405, 470, 213, 471, 213, 213, 472, 631, - 491, 1405, 632, 633, 473, 213, 213, 634, 635, 213, 213, 474, 623, 636, 637, 494, 213, 213, - 640, 213, 624, 641, 642, 475, 476, 213, 492, 477, 213, 213, 632, 633, 493, 213, 643, 634, - 635, 1405, 213, 1405, 623, 636, 637, 638, 1405, 213, 640, 213, 624, 641, 642, 475, 476, 639, - 492, 477, 213, 213, 481, 482, 493, 213, 643, 495, - - 644, 213, 213, 213, 213, 213, 213, 638, 213, 645, 213, 213, 648, 649, 496, 213, 1405, 639, - 1405, 650, 646, 1405, 481, 482, 213, 651, 652, 495, 644, 213, 647, 213, 213, 213, 213, 653, - 213, 645, 213, 213, 648, 649, 496, 213, 484, 213, 485, 650, 646, 213, 486, 1405, 213, 651, - 652, 497, 213, 487, 647, 654, 1405, 488, 1405, 653, 655, 213, 213, 1405, 213, 213, 500, 213, - 484, 213, 485, 213, 498, 213, 486, 499, 213, 213, 1405, 497, 213, 487, 656, 654, 213, 488, - 213, 1405, 655, 213, 213, 213, 213, 213, 500, 213, - - 213, 213, 1405, 213, 498, 502, 657, 499, 213, 213, 213, 213, 213, 213, 656, 508, 213, 213, - 213, 501, 213, 213, 213, 213, 658, 213, 213, 659, 213, 213, 213, 1405, 1405, 502, 657, 662, - 213, 503, 213, 213, 213, 213, 1405, 508, 1405, 213, 213, 501, 213, 213, 213, 1405, 658, 213, - 213, 659, 213, 1405, 213, 660, 509, 1405, 1405, 662, 213, 503, 213, 1405, 1405, 213, 213, 665, - 518, 213, 213, 504, 213, 213, 661, 213, 666, 667, 213, 213, 213, 505, 668, 660, 509, 510, - 506, 507, 213, 511, 213, 213, 213, 213, 213, 665, - - 518, 213, 213, 504, 213, 213, 661, 213, 666, 667, 213, 213, 213, 505, 668, 1405, 663, 510, - 506, 507, 213, 511, 669, 213, 213, 213, 670, 213, 519, 664, 213, 517, 213, 1405, 671, 672, - 213, 213, 520, 673, 213, 213, 674, 213, 663, 213, 675, 512, 213, 513, 669, 213, 676, 213, - 670, 213, 519, 664, 1405, 517, 213, 213, 671, 672, 213, 213, 520, 673, 677, 213, 674, 213, - 678, 213, 675, 512, 213, 513, 679, 213, 676, 680, 681, 682, 683, 1405, 213, 684, 213, 213, - 514, 685, 515, 213, 521, 524, 677, 213, 213, 686, - - 678, 213, 213, 516, 687, 688, 679, 213, 213, 680, 681, 682, 683, 213, 213, 684, 213, 1405, - 514, 685, 515, 213, 521, 524, 1405, 213, 213, 686, 689, 213, 213, 516, 687, 688, 525, 213, - 213, 690, 1405, 1405, 691, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, 522, 1405, 213, 523, - 213, 1405, 689, 213, 526, 692, 694, 693, 525, 1405, 213, 690, 213, 213, 691, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 522, 213, 213, 523, 213, 527, 695, 213, 526, 692, 694, 693, - 1405, 213, 213, 213, 213, 213, 696, 213, 213, 213, - - 697, 698, 213, 213, 213, 529, 213, 213, 213, 213, 699, 527, 695, 213, 528, 213, 700, 1405, - 213, 213, 1405, 213, 1405, 1405, 696, 213, 213, 1405, 697, 698, 1405, 213, 703, 529, 213, 213, - 213, 213, 699, 213, 704, 213, 528, 213, 700, 213, 213, 701, 530, 838, 531, 702, 532, 213, - 213, 213, 533, 839, 213, 213, 703, 534, 213, 213, 213, 840, 213, 213, 704, 841, 842, 213, - 213, 213, 213, 701, 530, 838, 531, 702, 532, 843, 213, 213, 533, 839, 213, 213, 1405, 534, - 213, 844, 213, 840, 213, 1405, 1405, 841, 842, 213, - - 213, 1405, 213, 535, 845, 539, 1405, 846, 536, 843, 213, 1405, 213, 540, 213, 213, 537, 213, - 847, 844, 213, 538, 213, 542, 541, 213, 213, 213, 848, 213, 849, 535, 845, 539, 213, 846, - 536, 850, 213, 213, 213, 540, 213, 213, 537, 213, 847, 1405, 213, 538, 213, 542, 541, 213, - 213, 213, 848, 213, 849, 851, 852, 1405, 213, 1405, 853, 850, 546, 213, 543, 854, 213, 213, - 855, 856, 213, 548, 857, 544, 1405, 213, 547, 213, 1405, 1405, 213, 545, 1405, 851, 852, 213, - 213, 213, 853, 1405, 546, 858, 543, 854, 213, 213, - - 855, 856, 213, 548, 857, 544, 549, 213, 547, 213, 213, 213, 213, 545, 213, 213, 859, 213, - 213, 213, 213, 213, 552, 858, 550, 213, 860, 1405, 1405, 213, 213, 213, 551, 1405, 549, 213, - 213, 1405, 213, 213, 213, 861, 213, 213, 859, 213, 213, 862, 213, 213, 552, 555, 550, 213, - 860, 213, 213, 213, 213, 213, 551, 213, 863, 213, 213, 213, 553, 213, 213, 861, 1405, 213, - 213, 213, 213, 862, 1405, 554, 213, 555, 864, 213, 213, 213, 213, 213, 556, 865, 213, 213, - 863, 213, 557, 213, 553, 213, 1405, 866, 213, 213, - - 213, 213, 867, 868, 558, 554, 213, 869, 864, 213, 213, 213, 870, 213, 556, 865, 213, 871, - 213, 213, 557, 213, 563, 213, 559, 866, 213, 213, 1405, 213, 867, 868, 558, 213, 872, 869, - 873, 213, 1405, 213, 870, 564, 874, 213, 875, 871, 213, 213, 1405, 213, 563, 213, 559, 560, - 1405, 213, 213, 213, 1405, 1405, 561, 213, 872, 562, 873, 213, 213, 876, 1405, 564, 874, 213, - 875, 877, 1405, 213, 213, 878, 1405, 1405, 565, 560, 213, 879, 213, 213, 566, 213, 561, 567, - 1405, 562, 213, 213, 213, 876, 569, 1405, 1405, 213, - - 213, 877, 568, 213, 213, 878, 213, 213, 565, 213, 213, 879, 880, 213, 566, 213, 213, 567, - 570, 881, 213, 213, 213, 213, 569, 571, 213, 213, 213, 213, 568, 213, 213, 213, 213, 213, - 712, 213, 213, 213, 880, 213, 213, 213, 213, 882, 570, 881, 213, 213, 213, 213, 883, 571, - 213, 1405, 1405, 213, 1405, 1405, 213, 213, 1405, 1405, 712, 1405, 213, 213, 1405, 1405, 213, 213, - 1405, 882, 884, 885, 213, 213, 706, 706, 883, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 440, 440, 440, 440, 440, 440, 440, 440, 440, - - 440, 888, 884, 885, 889, 890, 891, 892, 441, 443, 443, 443, 443, 443, 443, 443, 443, 443, - 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 888, 895, 1405, 889, 890, 891, 892, - 441, 708, 708, 896, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 710, 213, 711, 1405, - 213, 213, 213, 213, 895, 213, 213, 213, 213, 713, 213, 897, 1405, 896, 1405, 213, 213, 213, - 213, 1405, 213, 1405, 213, 1405, 710, 213, 711, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 713, 213, 897, 213, 1405, 213, 213, 213, 213, - - 213, 213, 213, 213, 213, 886, 213, 213, 213, 213, 1405, 1405, 715, 714, 213, 1405, 887, 898, - 213, 899, 1405, 1405, 213, 213, 213, 718, 900, 213, 213, 213, 1405, 213, 213, 886, 213, 213, - 213, 213, 213, 213, 715, 714, 717, 213, 887, 898, 213, 899, 213, 213, 1405, 213, 901, 718, - 900, 213, 213, 716, 213, 213, 213, 719, 1405, 213, 902, 213, 213, 213, 213, 903, 717, 213, - 1405, 213, 1405, 1405, 213, 213, 893, 894, 901, 904, 1405, 1405, 905, 716, 213, 213, 906, 719, - 213, 213, 902, 907, 213, 213, 213, 903, 908, 213, - - 213, 213, 720, 723, 721, 213, 893, 894, 213, 904, 213, 724, 905, 1405, 213, 213, 906, 1405, - 213, 722, 1405, 907, 213, 213, 213, 909, 908, 213, 213, 910, 720, 723, 721, 213, 911, 1405, - 213, 912, 213, 724, 213, 213, 213, 213, 213, 213, 1405, 722, 725, 1405, 213, 213, 213, 909, - 213, 913, 726, 910, 213, 1405, 213, 213, 911, 728, 213, 912, 1405, 213, 213, 213, 914, 213, - 213, 213, 727, 915, 725, 213, 213, 213, 916, 1405, 213, 913, 726, 1405, 213, 213, 213, 213, - 917, 728, 213, 918, 213, 213, 213, 919, 914, 213, - - 731, 729, 727, 915, 213, 213, 213, 213, 916, 213, 213, 920, 921, 730, 213, 213, 1405, 1405, - 917, 213, 213, 918, 213, 1405, 213, 919, 922, 1405, 731, 729, 923, 1405, 213, 924, 213, 213, - 925, 213, 213, 920, 921, 730, 213, 213, 733, 213, 213, 213, 213, 213, 732, 213, 926, 734, - 922, 213, 213, 1405, 923, 213, 927, 924, 735, 928, 925, 929, 213, 1405, 1405, 213, 213, 213, - 733, 213, 213, 930, 213, 213, 732, 213, 926, 734, 1405, 213, 213, 736, 213, 213, 927, 213, - 735, 928, 739, 929, 213, 213, 213, 213, 213, 931, - - 737, 1405, 213, 930, 213, 213, 213, 1405, 1405, 738, 213, 213, 213, 736, 213, 213, 213, 213, - 932, 1405, 739, 213, 741, 213, 213, 213, 213, 931, 737, 213, 213, 213, 213, 213, 213, 213, - 213, 738, 213, 213, 213, 933, 213, 213, 213, 213, 932, 740, 934, 213, 741, 213, 213, 213, - 213, 213, 935, 213, 1405, 213, 213, 213, 742, 213, 213, 1036, 1037, 1038, 743, 933, 213, 213, - 213, 213, 1405, 740, 934, 213, 213, 213, 213, 213, 213, 213, 935, 1039, 213, 744, 213, 213, - 742, 1040, 213, 1036, 1037, 1038, 743, 213, 1041, 213, - - 213, 1042, 213, 745, 1405, 213, 213, 213, 746, 213, 213, 213, 213, 1039, 213, 744, 213, 213, - 213, 1040, 213, 1043, 1044, 1045, 1046, 213, 1041, 213, 213, 1042, 213, 745, 747, 1405, 213, 213, - 746, 1047, 213, 213, 213, 213, 1048, 213, 213, 213, 213, 1049, 748, 1043, 1044, 1045, 1046, 213, - 213, 213, 213, 1405, 1405, 1050, 747, 749, 213, 213, 1051, 1047, 213, 1405, 213, 213, 1048, 213, - 213, 213, 1052, 1049, 748, 1405, 213, 1053, 213, 213, 213, 1054, 750, 213, 213, 1050, 213, 749, - 213, 213, 1051, 751, 1055, 752, 213, 1056, 213, 213, - - 1405, 213, 1052, 1405, 1057, 213, 213, 1053, 213, 1058, 1059, 1054, 750, 213, 213, 213, 213, 1405, - 213, 1060, 753, 751, 1055, 752, 213, 1056, 213, 213, 213, 754, 1405, 213, 1057, 213, 213, 1061, - 213, 1058, 1059, 1062, 1063, 213, 1405, 213, 213, 755, 1064, 1060, 753, 213, 213, 1405, 213, 756, - 213, 213, 213, 754, 757, 213, 213, 1405, 213, 1061, 213, 213, 1065, 1062, 1063, 213, 213, 1066, - 213, 755, 1064, 1067, 1405, 213, 213, 759, 1068, 756, 213, 213, 1405, 758, 757, 213, 213, 213, - 1405, 213, 213, 213, 1065, 1405, 213, 213, 213, 1066, - - 1405, 213, 213, 1067, 213, 1069, 1070, 759, 1068, 213, 1071, 760, 761, 758, 213, 213, 213, 213, - 213, 213, 213, 1405, 1072, 213, 213, 213, 1405, 1405, 213, 213, 213, 1075, 213, 1069, 1070, 1405, - 1076, 213, 1071, 760, 761, 1077, 213, 213, 213, 213, 213, 762, 213, 213, 1072, 213, 213, 213, - 1073, 213, 213, 1074, 213, 1075, 763, 764, 1078, 213, 1076, 213, 1405, 1405, 213, 1077, 1405, 213, - 1405, 213, 1079, 762, 213, 213, 1080, 1405, 213, 213, 1073, 213, 1081, 1074, 213, 1405, 763, 764, - 1078, 213, 1405, 213, 213, 213, 213, 767, 213, 213, - - 765, 213, 1079, 1082, 213, 766, 1080, 213, 1083, 1405, 1405, 1084, 1081, 1405, 213, 213, 1405, 213, - 1085, 1405, 768, 1086, 213, 213, 213, 767, 213, 213, 765, 213, 213, 1082, 213, 766, 769, 213, - 1083, 770, 213, 1084, 213, 213, 213, 213, 213, 213, 1085, 771, 768, 1086, 1087, 213, 213, 1405, - 213, 213, 1088, 213, 213, 1089, 1090, 213, 769, 1405, 1091, 770, 213, 772, 213, 213, 1405, 213, - 213, 1092, 213, 771, 773, 1405, 1087, 213, 1093, 213, 213, 213, 1088, 213, 213, 1089, 1090, 213, - 775, 213, 1091, 213, 213, 772, 1094, 1095, 213, 213, - - 213, 1092, 213, 213, 773, 213, 1096, 213, 1093, 213, 213, 1097, 213, 774, 213, 1098, 1099, 213, - 775, 213, 1100, 213, 213, 1405, 1094, 1095, 213, 1101, 213, 1405, 1102, 213, 213, 213, 1096, 213, - 776, 1405, 213, 1097, 213, 774, 213, 1098, 1099, 213, 777, 213, 1100, 1103, 1104, 213, 213, 1405, - 1105, 1101, 1106, 213, 1102, 1107, 213, 213, 1108, 780, 776, 213, 1109, 213, 1405, 1186, 213, 213, - 1405, 1405, 777, 213, 1405, 1103, 1104, 213, 213, 213, 1105, 1405, 1106, 213, 1405, 1107, 1187, 213, - 1108, 780, 1405, 213, 1109, 213, 778, 1186, 213, 213, - - 213, 213, 213, 781, 213, 213, 779, 1405, 213, 213, 213, 213, 1405, 1405, 782, 213, 1187, 1405, - 213, 213, 213, 213, 1405, 1405, 778, 213, 213, 1405, 213, 213, 213, 781, 213, 213, 779, 213, - 213, 1188, 213, 213, 213, 213, 782, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1189, 213, - 213, 783, 1190, 784, 213, 1191, 213, 213, 1192, 213, 213, 1188, 1405, 785, 213, 213, 1405, 213, - 213, 213, 213, 213, 1405, 1405, 213, 213, 1189, 213, 213, 783, 1190, 784, 213, 1191, 213, 213, - 1192, 213, 213, 1405, 786, 785, 213, 1193, 213, 213, - - 213, 213, 213, 213, 787, 213, 213, 1194, 1195, 213, 213, 213, 1405, 213, 1196, 1405, 1405, 789, - 788, 213, 1197, 213, 786, 213, 213, 1193, 213, 213, 213, 213, 1198, 1199, 787, 213, 213, 1194, - 1195, 213, 213, 213, 790, 213, 1196, 213, 213, 789, 788, 213, 1197, 213, 213, 213, 1200, 213, - 1201, 213, 791, 1202, 1198, 1199, 213, 1405, 1203, 213, 1405, 213, 1204, 213, 790, 794, 1205, 213, - 213, 1206, 213, 213, 1405, 1405, 213, 213, 1200, 213, 1201, 1405, 791, 1202, 1207, 1405, 213, 800, - 1203, 213, 792, 213, 1204, 213, 213, 794, 1205, 213, - - 213, 1206, 213, 213, 797, 213, 213, 213, 1208, 213, 213, 793, 1405, 1209, 1207, 213, 213, 800, - 1210, 1405, 792, 213, 1405, 1211, 213, 1212, 1405, 213, 213, 1213, 1405, 213, 797, 213, 213, 798, - 1208, 213, 213, 793, 213, 1209, 213, 213, 213, 795, 1210, 213, 799, 1405, 213, 1211, 213, 1212, - 213, 213, 213, 1213, 796, 1214, 213, 213, 1215, 798, 1405, 1216, 213, 1217, 213, 1218, 213, 1219, - 1220, 795, 1405, 213, 799, 801, 213, 1405, 213, 213, 213, 213, 213, 213, 796, 1214, 213, 213, - 1215, 213, 213, 1216, 213, 1217, 213, 1218, 1221, 1219, - - 1220, 213, 213, 1405, 1405, 801, 1222, 802, 1223, 213, 1224, 213, 213, 213, 803, 213, 804, 1225, - 213, 213, 213, 213, 1226, 213, 213, 213, 1221, 213, 213, 213, 213, 213, 805, 1405, 1222, 802, - 1223, 213, 1224, 213, 213, 1227, 803, 213, 804, 1225, 213, 1405, 806, 213, 1226, 213, 213, 213, - 1405, 213, 213, 213, 213, 213, 805, 213, 808, 1405, 1405, 213, 213, 807, 213, 1227, 1405, 213, - 213, 1405, 1405, 213, 806, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 213, 1228, 213, 213, - 808, 213, 213, 1405, 213, 807, 213, 1405, 213, 213, - - 213, 809, 213, 213, 1229, 213, 213, 213, 213, 213, 213, 213, 213, 811, 1230, 1228, 213, 213, - 1278, 213, 213, 812, 213, 213, 1405, 810, 213, 213, 213, 809, 213, 1405, 1229, 213, 213, 213, - 213, 1405, 1405, 213, 213, 811, 1230, 1405, 1405, 213, 1278, 1405, 1405, 812, 213, 213, 213, 810, - 213, 213, 213, 1405, 1280, 213, 813, 213, 1405, 213, 213, 213, 815, 1405, 213, 1281, 213, 814, - 213, 213, 213, 213, 816, 1282, 213, 213, 213, 1283, 213, 213, 213, 818, 1280, 213, 813, 1405, - 213, 213, 213, 213, 815, 213, 213, 1281, 213, 814, - - 213, 213, 213, 213, 816, 1282, 213, 213, 213, 1283, 213, 213, 213, 818, 1405, 213, 817, 819, - 213, 1405, 213, 213, 213, 213, 1405, 1284, 213, 213, 213, 1405, 820, 1405, 213, 1405, 1285, 213, - 213, 213, 213, 1405, 213, 1286, 213, 213, 817, 819, 1287, 213, 213, 213, 213, 213, 821, 1284, - 213, 213, 213, 823, 820, 213, 213, 822, 1285, 213, 1405, 213, 213, 213, 213, 1286, 213, 213, - 213, 213, 1287, 213, 213, 213, 1288, 213, 821, 1405, 824, 826, 825, 823, 1289, 213, 1290, 822, - 1405, 1291, 213, 213, 213, 213, 213, 1292, 828, 213, - - 213, 213, 1293, 213, 213, 213, 1288, 1294, 213, 827, 824, 826, 825, 213, 1289, 1295, 1290, 213, - 830, 1291, 213, 213, 1296, 213, 213, 1292, 828, 213, 213, 213, 1293, 213, 213, 213, 213, 1294, - 213, 827, 213, 213, 213, 213, 213, 1295, 1297, 213, 830, 213, 939, 829, 1296, 213, 213, 1405, - 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1298, 213, 213, 213, 1299, 213, 213, - 1297, 213, 1300, 213, 939, 829, 213, 213, 213, 213, 831, 213, 1326, 1328, 213, 832, 213, 1329, - 833, 213, 835, 1298, 834, 213, 213, 1299, 213, 213, - - 213, 213, 1300, 213, 1330, 1405, 213, 213, 213, 213, 831, 213, 1326, 1328, 213, 832, 213, 1329, - 833, 213, 835, 1405, 834, 213, 213, 1331, 213, 213, 213, 213, 1332, 213, 1330, 836, 213, 1333, - 213, 1334, 1335, 213, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 1405, 1405, 1405, 1331, - 1405, 213, 1405, 213, 1332, 1405, 1405, 836, 213, 1333, 1405, 1334, 1335, 213, 575, 575, 575, 575, - 575, 575, 575, 575, 575, 575, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, - 577, 577, 577, 577, 577, 577, 577, 577, 707, 707, - - 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 213, 1336, 213, 213, 213, 213, 937, 213, 213, 938, 213, 1337, 213, 1405, 213, 213, - 1279, 1279, 1405, 1338, 1405, 1355, 1356, 1405, 940, 1405, 1405, 1405, 213, 1336, 213, 213, 213, 213, - 937, 213, 213, 938, 213, 1337, 213, 213, 213, 213, 1405, 213, 213, 1338, 942, 1355, 1356, 213, - 940, 213, 941, 943, 1327, 1357, 213, 213, 213, 213, - - 944, 1358, 1405, 213, 1405, 213, 1405, 213, 1405, 1359, 213, 213, 213, 213, 942, 1303, 1279, 213, - 1362, 213, 941, 943, 1327, 1357, 213, 213, 213, 213, 944, 1358, 945, 213, 213, 213, 213, 946, - 213, 1359, 213, 213, 213, 213, 213, 213, 1354, 1354, 1362, 1405, 1405, 213, 213, 1369, 213, 1370, - 1405, 1341, 1373, 1405, 945, 213, 213, 1376, 213, 946, 213, 213, 1405, 213, 213, 213, 213, 213, - 213, 1361, 1354, 213, 213, 213, 213, 1369, 213, 1370, 213, 1341, 1373, 213, 213, 213, 1368, 1376, - 213, 947, 213, 213, 948, 213, 213, 213, 1405, 213, - - 213, 1378, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1380, 213, 213, 213, 1368, 1372, - 213, 947, 213, 213, 948, 213, 213, 949, 213, 213, 213, 1378, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 950, 1380, 213, 952, 213, 1405, 1372, 213, 213, 213, 213, 1405, 1382, 1384, 949, - 213, 1405, 213, 1386, 213, 213, 213, 1388, 1390, 213, 213, 213, 213, 950, 213, 213, 952, 1392, - 213, 1394, 213, 213, 213, 953, 213, 1382, 1384, 213, 1396, 951, 1405, 1386, 1405, 213, 213, 1388, - 1390, 1405, 1398, 1405, 1405, 1405, 213, 213, 213, 1392, - - 213, 1394, 213, 1405, 1405, 953, 213, 1405, 213, 213, 1396, 951, 955, 954, 213, 213, 213, 213, - 213, 213, 1398, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, 956, 213, 1405, 1405, - 213, 213, 213, 1405, 955, 954, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 1405, 213, 1405, - 1405, 213, 213, 1405, 213, 213, 956, 213, 959, 213, 958, 213, 213, 213, 213, 213, 1405, 213, - 1405, 213, 213, 213, 957, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 960, 213, 961, - 959, 213, 958, 213, 1405, 213, 213, 213, 213, 1405, - - 213, 213, 213, 213, 957, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 213, 960, 213, 961, - 962, 1405, 963, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 1405, 213, 1405, 1405, 213, 213, 1405, 1405, 1405, 962, 1405, 963, 1405, 213, 213, 213, 213, - 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 964, 1405, 1405, 1405, 213, 213, 1405, - 213, 213, 965, 213, 1405, 213, 1405, 213, 213, 213, 213, 966, 1405, 213, 213, 213, 1405, 213, - 1405, 213, 1405, 964, 213, 1405, 967, 1405, 213, 213, - - 213, 213, 965, 213, 1405, 213, 1405, 213, 213, 213, 213, 966, 1405, 213, 213, 213, 1405, 213, - 213, 213, 213, 969, 213, 1405, 967, 213, 968, 213, 1405, 970, 213, 971, 213, 1405, 213, 213, - 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 969, 1405, 213, 213, 213, - 968, 1405, 1405, 970, 213, 971, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 213, 213, - 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, - 1405, 213, 213, 213, 973, 974, 1405, 972, 1405, 213, - - 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, 975, 213, 1405, 213, 213, - 1405, 213, 213, 213, 973, 974, 213, 972, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, - 1405, 213, 213, 213, 1405, 975, 213, 976, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, - 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 976, - 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 977, 213, 213, 213, 213, 978, - 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, - - 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 977, 1405, 979, 213, 213, 978, - 213, 213, 213, 213, 213, 1405, 980, 213, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 213, 213, - 213, 213, 213, 1405, 1405, 213, 979, 213, 213, 213, 1405, 213, 982, 1405, 1405, 213, 980, 213, - 981, 213, 213, 1405, 1405, 983, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, - 213, 213, 984, 213, 982, 1405, 1405, 213, 213, 213, 981, 213, 1405, 1405, 1405, 983, 213, 213, - 990, 1405, 1405, 213, 213, 1405, 213, 1405, 213, 213, - - 213, 213, 984, 213, 1405, 987, 213, 213, 213, 985, 213, 213, 213, 1405, 213, 1405, 213, 213, - 990, 1405, 986, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 987, 213, 213, - 1405, 985, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 1405, 986, 213, 213, 213, 213, 213, - 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 1405, 213, - 213, 988, 1405, 1405, 1405, 213, 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, - - 213, 988, 989, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 213, - 991, 1405, 992, 993, 213, 1405, 213, 213, 213, 213, 213, 1405, 989, 213, 213, 1405, 1405, 213, - 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 991, 1405, 992, 993, 213, 1405, 1405, 213, - 994, 213, 213, 213, 213, 213, 213, 1405, 1405, 995, 213, 213, 213, 1405, 1405, 213, 213, 1405, - 1405, 1405, 213, 1405, 1405, 1405, 996, 213, 1405, 1405, 994, 213, 213, 213, 213, 213, 213, 213, - 1405, 995, 213, 213, 213, 1405, 1405, 213, 213, 213, - - 998, 1405, 213, 997, 213, 213, 996, 213, 1405, 213, 213, 213, 213, 1405, 1405, 213, 1405, 213, - 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, 998, 1405, 213, 997, 213, 213, 1405, 1405, - 213, 213, 213, 999, 1405, 213, 1405, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 213, 213, 213, - 213, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 1405, 213, 1000, 213, 999, 1405, 213, 1002, 1405, - 213, 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 1001, 213, 213, 1405, 213, - 213, 213, 1003, 1000, 213, 213, 213, 213, 1002, 1405, - - 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 1405, 213, 213, 1001, 213, 213, 1405, 1405, - 1004, 213, 1003, 1405, 213, 213, 213, 213, 213, 1005, 1405, 213, 213, 213, 213, 1006, 1405, 213, - 1405, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 1004, 1405, 213, 1405, 213, 213, 213, 213, - 213, 1005, 1405, 1405, 213, 213, 213, 1006, 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, - 213, 1405, 1405, 1007, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, - 213, 213, 213, 1008, 213, 213, 213, 213, 213, 1405, - - 213, 1009, 1010, 1007, 1405, 213, 1405, 213, 213, 1405, 213, 1011, 1405, 213, 213, 213, 213, 213, - 213, 213, 213, 1008, 1405, 213, 213, 213, 213, 213, 1405, 1009, 1010, 213, 1405, 213, 213, 213, - 213, 213, 1405, 1011, 213, 1405, 213, 1405, 213, 1405, 213, 213, 1012, 213, 213, 1013, 213, 1015, - 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 1405, 1405, 213, 1405, 1405, 1014, - 213, 213, 1405, 213, 1012, 213, 213, 1013, 213, 1015, 213, 1405, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1014, - - 1016, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 213, 1405, 1405, - 213, 1017, 213, 213, 213, 213, 213, 213, 1018, 1405, 1016, 213, 213, 213, 213, 1019, 213, 213, - 1405, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 1405, 1017, 213, 1405, 213, 213, 213, 213, - 1018, 1405, 1405, 213, 1020, 213, 213, 1019, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, - 213, 1405, 1405, 1405, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 1020, 213, 1405, 1405, - 213, 213, 1405, 1405, 213, 1405, 213, 213, 1405, 213, - - 213, 213, 213, 1405, 213, 1405, 1021, 213, 1405, 1022, 213, 213, 1023, 213, 213, 213, 1405, 1405, - 1405, 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 1021, 1405, - 1405, 1022, 1405, 213, 1023, 213, 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, - 1024, 1405, 213, 213, 213, 1405, 1025, 213, 213, 1405, 213, 213, 1027, 1405, 1405, 213, 213, 1026, - 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 1024, 1405, 213, 213, 213, 1405, 1025, 213, - 213, 1405, 213, 213, 1027, 1405, 1405, 213, 213, 1026, - - 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, 1028, 1030, 1029, 213, 213, 213, 1405, 213, 213, - 213, 1405, 213, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 1405, - 213, 1028, 1030, 1029, 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 213, 213, 1031, 213, - 213, 1405, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, - 1405, 213, 213, 1405, 1405, 213, 213, 1032, 1031, 213, 213, 213, 213, 1405, 1405, 213, 213, 1033, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - - 213, 213, 213, 1405, 1405, 1405, 1405, 1032, 1405, 213, 213, 213, 213, 213, 1405, 213, 1405, 1033, - 213, 1405, 1034, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1112, 1111, 1034, 1405, 213, 1405, 213, 213, - 213, 1405, 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, - 213, 213, 1112, 1111, 213, 1405, 213, 1405, 1405, 213, 213, 1113, 213, 213, 213, 213, 1405, 213, - 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, - - 1114, 1405, 213, 213, 213, 213, 1405, 1405, 1115, 213, 213, 1113, 213, 213, 213, 213, 213, 213, - 1405, 1405, 213, 213, 213, 213, 1116, 213, 1405, 1405, 1114, 213, 213, 213, 213, 213, 1405, 213, - 1115, 1117, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, 1116, 213, - 213, 1405, 1118, 213, 1405, 213, 213, 213, 213, 213, 213, 1117, 213, 213, 213, 213, 1119, 213, - 213, 213, 213, 1121, 1405, 213, 1120, 213, 1405, 1405, 213, 1405, 1118, 213, 1405, 213, 213, 213, - 213, 1405, 213, 1405, 213, 213, 213, 213, 1119, 1405, - - 213, 213, 213, 1121, 1405, 213, 1120, 213, 213, 1405, 1122, 213, 1405, 213, 213, 213, 213, 1405, - 1123, 1405, 213, 213, 1405, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 213, 1405, 213, 213, 1405, - 213, 1124, 1122, 213, 1405, 1405, 213, 213, 1405, 1405, 1123, 213, 213, 213, 1125, 1405, 213, 1405, - 213, 213, 1127, 1405, 213, 213, 213, 1126, 213, 213, 213, 1124, 213, 213, 213, 1405, 1405, 213, - 1405, 213, 213, 213, 213, 213, 1125, 1405, 1405, 1405, 213, 1405, 1127, 1405, 213, 213, 213, 1126, - 1405, 213, 213, 213, 213, 213, 213, 1128, 1405, 213, - - 1405, 213, 213, 213, 213, 213, 1131, 213, 1405, 1405, 213, 213, 213, 213, 1130, 213, 213, 213, - 1405, 213, 1405, 213, 1129, 1405, 213, 1128, 213, 213, 1405, 1405, 1405, 213, 1405, 213, 1131, 213, - 1405, 1132, 213, 213, 213, 213, 1130, 213, 213, 213, 1405, 213, 1405, 1405, 1129, 1405, 213, 213, - 213, 213, 1133, 1405, 213, 213, 213, 213, 213, 213, 1405, 1132, 213, 1405, 213, 213, 213, 213, - 213, 1134, 1135, 1405, 213, 1136, 213, 213, 1405, 213, 213, 1405, 1133, 1405, 213, 213, 213, 213, - 213, 213, 1405, 1137, 213, 1405, 213, 213, 213, 213, - - 213, 1134, 1135, 1405, 213, 1136, 213, 213, 1405, 213, 213, 1405, 1138, 1405, 213, 213, 213, 213, - 213, 213, 213, 1137, 1405, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 1405, 1405, 1405, 213, 213, - 213, 213, 1405, 1405, 1138, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, - 213, 1405, 213, 1405, 1140, 1139, 213, 213, 213, 213, 213, 1142, 213, 213, 1405, 213, 213, 1405, - 213, 213, 213, 1405, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 1141, 1140, 1139, 213, 213, - 213, 1405, 1405, 1142, 213, 213, 1405, 1405, 213, 213, - - 213, 213, 213, 1405, 213, 213, 1143, 1144, 213, 1405, 1405, 213, 213, 1141, 213, 1405, 1405, 1405, - 213, 213, 1405, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, 1143, 1144, - 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, - 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1145, 213, 213, 213, 213, 1405, 1405, 213, 213, - 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, - 213, 1145, 1405, 213, 1405, 213, 1405, 213, 213, 213, - - 213, 213, 213, 213, 213, 1146, 1147, 213, 1148, 213, 213, 1149, 213, 213, 1405, 1405, 213, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 213, 213, 213, 1150, 213, 213, 213, 213, 1146, 1147, 213, - 1148, 213, 213, 1149, 213, 213, 1405, 213, 213, 213, 1405, 1405, 1405, 1405, 213, 1405, 1151, 1405, - 213, 213, 1150, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 213, 1405, 213, 213, 213, 213, 1151, 213, 1405, 213, 213, 213, 213, 213, 213, 213, - 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, - - 213, 213, 213, 213, 213, 213, 1152, 213, 1153, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, - 1405, 1154, 1405, 1405, 1405, 1405, 1405, 1405, 213, 1405, 1405, 213, 213, 213, 213, 1405, 1152, 1405, - 1153, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, 1405, 1154, 1405, 1405, 213, 1155, 1405, 1156, - 213, 213, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, - 1405, 213, 1405, 1405, 1405, 1405, 213, 1155, 1405, 1156, 213, 213, 213, 213, 213, 213, 213, 213, - 1157, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, - - 1405, 213, 1405, 1158, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 1157, 1405, 1159, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 1158, 213, 213, 213, 213, - 213, 213, 1405, 213, 1405, 213, 213, 213, 1160, 213, 213, 1405, 1159, 213, 213, 213, 213, 213, - 1405, 213, 213, 1405, 1405, 1161, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, - 1160, 213, 213, 213, 1173, 213, 213, 213, 213, 213, 1163, 213, 213, 213, 213, 1161, 1162, 1405, - 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 213, - - 1405, 1164, 213, 213, 1173, 213, 1405, 213, 213, 213, 1163, 213, 1165, 213, 213, 213, 1162, 1405, - 213, 213, 213, 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1164, 213, 1405, 1405, 213, 1166, 213, - 213, 1167, 213, 213, 1165, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, - 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 1166, 213, 1405, 1167, 213, 1168, 213, 213, 213, 1405, - 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, - 1405, 1405, 1169, 1405, 213, 1168, 213, 213, 213, 1405, - - 213, 1405, 1405, 213, 213, 213, 213, 1170, 1405, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, - 1405, 1405, 1169, 1405, 213, 213, 1405, 213, 213, 1405, 1171, 213, 1172, 213, 213, 213, 213, 1170, - 1405, 1405, 213, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, 213, 1405, 213, - 213, 213, 1171, 213, 1172, 1174, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1405, - 213, 1405, 1405, 213, 1175, 213, 1405, 1176, 213, 213, 213, 213, 1405, 1405, 1405, 1174, 213, 1405, - 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1177, - - 1405, 1405, 213, 213, 1175, 1405, 1405, 1176, 213, 213, 213, 1178, 213, 1405, 1405, 1405, 213, 213, - 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 1177, 1405, 1405, 213, 213, 1405, 1405, 1405, 1405, - 213, 213, 213, 1178, 213, 1405, 1405, 1179, 213, 213, 1405, 213, 1405, 213, 213, 1405, 213, 213, - 213, 1180, 213, 1181, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 1179, - 1405, 1405, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1180, 213, 1181, 213, 1182, 213, 213, - 213, 213, 213, 1405, 213, 213, 213, 1405, 1183, 1405, - - 1405, 1184, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 1182, 213, 1405, - 1405, 213, 213, 213, 1405, 213, 213, 213, 1183, 1405, 1405, 1184, 213, 213, 1405, 213, 1405, 213, - 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 1405, 213, 1232, 213, 213, 213, - 213, 213, 1405, 1233, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, - 1405, 1405, 213, 1405, 1405, 1405, 1232, 213, 1405, 213, 213, 213, 213, 1233, 213, 213, 213, 1234, - 213, 213, 213, 1235, 213, 213, 213, 213, 213, 213, - - 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 1237, 213, 213, 213, 213, 213, 1234, - 1405, 213, 213, 1235, 213, 1405, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1236, - 1405, 1405, 213, 1237, 213, 213, 1405, 1238, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 213, 1405, - 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 1236, 213, 1405, 213, 1405, 213, 213, 1405, 1238, - 213, 213, 213, 1405, 1405, 1241, 213, 213, 1239, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, - 1240, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, - - 213, 213, 213, 1405, 1405, 1241, 1405, 213, 1239, 1405, 1405, 1405, 213, 1242, 213, 213, 213, 213, - 1240, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 1405, 213, 213, - 1243, 1244, 1405, 213, 213, 1242, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 1405, 213, - 213, 1405, 213, 1405, 213, 213, 213, 1405, 213, 213, 1243, 1244, 1405, 213, 213, 213, 1405, 213, - 213, 1405, 1245, 213, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 1405, - 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, - - 1246, 1405, 1245, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, - 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 1246, 213, 1405, 213, 1405, 213, 1405, 1405, - 213, 213, 213, 1248, 1405, 213, 1247, 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 1405, - 1405, 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, 213, 213, 1248, 1405, 213, 1247, 213, - 213, 213, 213, 1405, 213, 213, 213, 1249, 213, 1405, 213, 213, 213, 1405, 1250, 1405, 213, 1405, - 213, 213, 213, 1251, 213, 1405, 1405, 1405, 213, 213, - - 1405, 213, 213, 213, 213, 1405, 213, 1249, 1405, 1405, 213, 213, 1405, 1405, 1250, 213, 213, 213, - 213, 213, 213, 1251, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1405, 213, - 1405, 213, 1405, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, - 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, - 213, 213, 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 1252, 213, 1405, 1405, 213, 213, 213, - 213, 1405, 213, 1253, 213, 213, 213, 213, 1405, 1405, - - 213, 213, 1405, 213, 1405, 213, 213, 213, 1405, 1405, 1254, 1252, 213, 213, 213, 1405, 213, 213, - 213, 213, 213, 1253, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 1405, 213, 1255, - 213, 1405, 1254, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, - 213, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1255, 213, 1405, 1405, 213, 213, 1405, 1256, 213, - 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1257, 1405, - 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 1256, 213, - - 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1257, 1405, - 213, 1405, 213, 1405, 1259, 1405, 213, 213, 213, 213, 213, 213, 1405, 213, 1258, 213, 213, 1405, - 213, 1260, 213, 213, 1405, 1405, 1405, 213, 1405, 1405, 213, 1261, 1405, 1405, 1259, 213, 213, 213, - 213, 1405, 213, 213, 213, 213, 1258, 213, 213, 1405, 213, 1260, 213, 213, 213, 1405, 213, 213, - 1263, 1405, 1405, 1261, 1405, 213, 1262, 213, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 1405, 1264, 1265, 213, 213, 213, 1405, 213, 213, - - 1263, 213, 213, 213, 213, 213, 1262, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, - 213, 1405, 1264, 1265, 213, 1266, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, - 213, 213, 1405, 1405, 1267, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 1268, 1266, 1405, 1405, - 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, 1405, 1267, 213, 1405, 1405, - 1405, 213, 213, 213, 213, 213, 1268, 1269, 1405, 213, 213, 213, 1405, 1270, 213, 213, 213, 1405, - 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1271, - - 213, 1405, 213, 213, 1405, 213, 1405, 1269, 213, 213, 213, 1405, 213, 1270, 213, 1405, 1405, 213, - 1405, 213, 1405, 213, 213, 213, 213, 1405, 213, 1271, 213, 1405, 1272, 213, 1405, 213, 1405, 213, - 213, 213, 213, 213, 213, 213, 213, 1273, 1274, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, - 213, 1405, 1405, 1405, 1272, 213, 1405, 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 1273, - 1274, 213, 213, 213, 1405, 1405, 213, 213, 213, 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, - 1405, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, - - 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 1276, 213, 213, - 1275, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 1405, 213, 213, 213, 213, 213, 1276, 213, 213, 1275, 213, 1405, 213, 213, 213, 213, 1405, - 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, - 213, 1405, 1405, 213, 1302, 213, 1405, 213, 213, 1405, 1303, 1279, 213, 1405, 213, 1405, 1405, 213, - 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, - - 213, 1405, 1405, 213, 1302, 213, 1405, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1304, 1405, - 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 1305, 1405, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 1405, 213, 1304, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 1405, - 213, 213, 213, 213, 213, 1305, 213, 1306, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, - 1405, 213, 213, 1405, 213, 1405, 213, 1405, 213, 213, 1405, 213, 213, 1307, 1405, 213, 213, 1306, - 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, - - 213, 213, 213, 1308, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 1307, 213, 213, 213, 1405, - 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1308, 1405, 213, 213, 213, - 1405, 1405, 213, 213, 1405, 1405, 213, 213, 213, 1309, 1405, 1405, 213, 213, 213, 1405, 213, 1405, - 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 1405, 213, 1310, 1405, 213, 1405, 1405, 1405, 213, - 213, 1309, 213, 1405, 213, 1311, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, - 213, 1405, 213, 1310, 213, 213, 213, 1405, 1405, 1405, - - 213, 213, 213, 1405, 213, 1311, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 213, - 1405, 213, 213, 213, 213, 1405, 213, 1312, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 1313, - 213, 1405, 213, 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1314, 1405, 1405, 1312, - 213, 213, 1405, 1405, 1405, 213, 213, 1405, 213, 1313, 1315, 1405, 1405, 213, 213, 213, 1405, 1405, - 213, 213, 213, 213, 1405, 213, 1314, 213, 1405, 213, 213, 213, 1405, 1316, 213, 213, 213, 1405, - 213, 213, 1315, 1405, 213, 1405, 213, 213, 1405, 1405, - - 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1405, 1405, 1316, 213, 213, 1405, 1405, - 213, 213, 213, 1405, 213, 1405, 213, 213, 1317, 1405, 1405, 213, 213, 1405, 1318, 213, 213, 213, - 1405, 213, 1405, 213, 213, 1405, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, - 1317, 1405, 1405, 213, 213, 1405, 1318, 213, 213, 213, 1405, 213, 1405, 213, 213, 1405, 1405, 1405, - 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1319, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 1405, 213, 213, 1405, 1405, 1320, 213, 213, - - 1405, 1405, 213, 213, 213, 1405, 213, 1321, 213, 213, 1319, 1405, 1405, 213, 213, 213, 1405, 213, - 213, 213, 1405, 213, 213, 1405, 1405, 1320, 213, 213, 1405, 1323, 213, 213, 213, 213, 213, 1321, - 213, 213, 1322, 213, 1405, 213, 213, 1324, 213, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, - 213, 1405, 1405, 1323, 213, 1405, 213, 213, 1405, 213, 213, 213, 1322, 213, 1405, 213, 213, 1324, - 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1346, 1405, 1340, 1405, 213, - 213, 213, 213, 1405, 213, 213, 1405, 213, 1405, 213, - - 1405, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 213, 213, 213, 1346, 213, 1340, 1405, 213, - 213, 213, 213, 1405, 213, 213, 213, 1342, 1405, 213, 213, 213, 213, 213, 1405, 213, 213, 1405, - 1405, 213, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 1405, 213, 213, 213, 213, 1405, 213, 1342, - 213, 1405, 213, 213, 213, 1405, 213, 213, 213, 1405, 213, 213, 1343, 213, 213, 213, 213, 1405, - 213, 1405, 213, 213, 1405, 213, 213, 213, 1344, 1405, 213, 213, 213, 213, 1405, 1405, 213, 213, - 1405, 1405, 213, 213, 1343, 1405, 213, 213, 213, 213, - - 213, 1405, 213, 213, 213, 213, 1405, 213, 1344, 213, 213, 213, 213, 213, 1347, 213, 1405, 213, - 1345, 213, 213, 213, 1405, 1405, 1405, 213, 213, 213, 213, 1405, 1348, 213, 213, 213, 213, 213, - 1405, 213, 213, 213, 213, 1405, 1347, 213, 1405, 213, 1345, 213, 213, 213, 213, 1405, 1405, 213, - 213, 213, 213, 1405, 1348, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, - 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 213, 213, 213, 1350, 1405, 213, 213, - 1349, 1405, 1405, 213, 213, 213, 213, 1405, 213, 213, - - 1351, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1405, 213, 1405, 213, 1350, 1405, 213, 1405, - 1349, 1405, 1405, 213, 1405, 213, 213, 1352, 213, 1363, 1351, 213, 213, 213, 1405, 213, 213, 1405, - 213, 213, 1405, 213, 1361, 1354, 1405, 1405, 213, 1405, 213, 213, 1405, 213, 1405, 1405, 213, 1352, - 213, 1363, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 1364, 1405, 213, 213, - 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 213, 1405, 213, 213, 1405, 213, 213, 213, 213, - 213, 213, 1405, 213, 213, 213, 1364, 1405, 213, 213, - - 213, 213, 1405, 1405, 213, 213, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 213, 1365, - 213, 1405, 1405, 213, 213, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, - 213, 213, 213, 213, 213, 213, 1405, 1405, 213, 1365, 213, 1405, 1405, 213, 213, 213, 1405, 213, - 1405, 1405, 213, 1405, 213, 1405, 213, 1405, 1405, 213, 1405, 213, 1366, 213, 1405, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 1405, 213, 213, 213, 1405, 1405, 213, 1405, 1405, 1405, 213, 213, - 213, 213, 1405, 1405, 1366, 1405, 213, 213, 213, 213, - - 213, 213, 213, 213, 213, 1405, 213, 213, 213, 213, 1405, 1405, 1405, 213, 1405, 1374, 213, 213, - 213, 213, 213, 1405, 1405, 1405, 213, 213, 1405, 1405, 213, 1405, 213, 1405, 213, 1405, 213, 1405, - 1405, 213, 1405, 1405, 1405, 213, 213, 1374, 213, 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, - 1405, 1405, 1405, 1405, 213, 1405, 213, 1405, 1405, 1405, 1405, 213, 1405, 1405, 1405, 1405, 213, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 92, 1405, 1405, 92, 92, 92, 92, 92, 92, - 92, 98, 98, 1405, 98, 106, 106, 106, 192, 1405, - - 192, 192, 192, 192, 192, 192, 192, 194, 194, 194, 1405, 194, 194, 194, 194, 194, 194, 196, - 1405, 196, 196, 196, 196, 196, 196, 196, 196, 199, 1405, 199, 199, 199, 199, 199, 199, 199, - 199, 213, 1405, 213, 213, 213, 213, 213, 213, 213, 213, 299, 1405, 299, 299, 299, 299, 299, - 299, 299, 299, 96, 1405, 96, 304, 1405, 304, 307, 1405, 307, 575, 1405, 575, 577, 1405, 577, - 7, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}; - -static const flex_int16_t yy_chk[9253] = { - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 9, 9, 10, 10, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 16, 18, 19, 19, 19, 21, 21, 23, 1402, 24, 1401, 23, 1400, 31, 32, 1399, 24, - 23, 1397, 18, 51, 51, 1395, 24, 44, 44, 24, - - 23, 1393, 24, 1391, 26, 25, 26, 1389, 23, 25, 24, 26, 23, 25, 31, 32, 26, 24, - 23, 25, 18, 22, 25, 22, 24, 44, 44, 24, 23, 22, 24, 22, 26, 25, 26, 22, - 22, 25, 1387, 26, 28, 25, 45, 1385, 26, 58, 28, 25, 1383, 22, 25, 22, 29, 52, - 52, 1381, 58, 22, 37, 22, 29, 63, 63, 22, 22, 27, 29, 33, 28, 37, 45, 33, - 1379, 27, 28, 37, 27, 33, 96, 27, 29, 97, 27, 30, 107, 27, 37, 1377, 29, 30, - 30, 30, 1375, 27, 29, 33, 30, 37, 34, 33, - - 35, 27, 34, 37, 27, 33, 96, 27, 34, 97, 27, 30, 107, 27, 35, 90, 90, 30, - 30, 30, 35, 35, 1371, 36, 30, 1367, 34, 1360, 35, 39, 34, 36, 43, 39, 108, 36, - 34, 39, 36, 36, 43, 111, 35, 39, 1353, 42, 1339, 42, 35, 35, 42, 36, 61, 61, - 61, 99, 99, 39, 98, 36, 43, 39, 108, 36, 1325, 39, 36, 36, 43, 111, 1301, 39, - 40, 42, 40, 42, 98, 40, 42, 112, 40, 114, 40, 115, 40, 40, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 1277, 118, 109, 1231, - - 40, 1185, 40, 1110, 98, 40, 109, 112, 40, 114, 40, 115, 40, 40, 41, 1035, 121, 70, - 41, 70, 125, 41, 41, 70, 70, 118, 109, 110, 41, 70, 110, 41, 197, 197, 109, 303, - 303, 305, 305, 1193, 1193, 936, 41, 120, 121, 70, 41, 70, 125, 41, 41, 70, 70, 120, - 126, 110, 41, 70, 110, 41, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 120, - 127, 128, 128, 837, 113, 113, 60, 1326, 1326, 120, 126, 705, 573, 438, 302, 299, 208, 202, - 113, 199, 119, 119, 119, 71, 119, 192, 129, 71, - - 127, 128, 128, 71, 113, 113, 60, 64, 64, 71, 64, 64, 64, 64, 64, 64, 64, 64, - 113, 71, 119, 119, 119, 71, 119, 117, 129, 71, 64, 64, 64, 71, 117, 122, 64, 73, - 64, 71, 122, 73, 131, 132, 64, 133, 64, 73, 134, 71, 64, 64, 101, 135, 134, 117, - 95, 73, 136, 92, 64, 89, 117, 122, 64, 73, 64, 88, 122, 73, 131, 132, 64, 133, - 64, 73, 134, 137, 64, 64, 74, 135, 134, 62, 74, 73, 136, 64, 65, 65, 74, 65, - 65, 65, 65, 65, 65, 65, 65, 56, 74, 138, - - 54, 75, 140, 137, 53, 75, 74, 65, 65, 65, 74, 75, 141, 143, 65, 76, 74, 144, - 65, 76, 49, 75, 146, 147, 65, 76, 74, 138, 80, 75, 140, 148, 80, 75, 65, 76, - 47, 65, 80, 75, 141, 143, 65, 76, 20, 144, 65, 76, 80, 75, 146, 147, 65, 76, - 14, 139, 80, 11, 139, 148, 80, 7, 65, 76, 65, 66, 80, 81, 4, 66, 149, 81, - 66, 66, 3, 81, 80, 152, 150, 66, 150, 81, 66, 139, 0, 66, 139, 153, 85, 66, - 0, 81, 85, 66, 0, 81, 85, 66, 149, 81, - - 66, 66, 85, 81, 0, 152, 150, 66, 150, 81, 66, 155, 85, 66, 0, 153, 85, 66, - 67, 81, 85, 84, 67, 84, 85, 84, 67, 154, 84, 157, 85, 156, 67, 84, 156, 67, - 0, 154, 158, 155, 85, 0, 67, 0, 159, 0, 67, 0, 161, 84, 67, 84, 0, 84, - 67, 154, 84, 157, 0, 156, 67, 84, 156, 67, 86, 154, 158, 86, 86, 87, 67, 68, - 159, 87, 86, 68, 161, 162, 68, 87, 68, 68, 124, 124, 86, 68, 124, 163, 164, 87, - 68, 68, 86, 0, 165, 86, 86, 87, 0, 68, - - 0, 87, 86, 68, 0, 162, 68, 87, 68, 68, 124, 124, 86, 68, 124, 163, 164, 87, - 68, 68, 69, 123, 165, 123, 167, 169, 123, 69, 69, 0, 171, 69, 123, 0, 69, 174, - 175, 69, 166, 123, 69, 0, 166, 176, 130, 177, 130, 0, 69, 123, 130, 123, 167, 169, - 123, 69, 69, 130, 171, 69, 123, 130, 69, 174, 175, 69, 166, 123, 69, 72, 166, 176, - 130, 177, 130, 72, 72, 72, 130, 151, 178, 151, 72, 145, 180, 130, 0, 72, 0, 130, - 0, 0, 151, 145, 0, 0, 0, 72, 145, 145, - - 0, 168, 0, 72, 72, 72, 168, 151, 178, 151, 72, 145, 180, 170, 168, 72, 77, 179, - 173, 168, 151, 145, 172, 77, 170, 181, 145, 145, 179, 168, 77, 172, 173, 77, 168, 182, - 77, 77, 0, 172, 0, 170, 168, 0, 77, 179, 173, 168, 183, 185, 172, 77, 170, 181, - 186, 0, 179, 188, 77, 172, 173, 77, 184, 182, 77, 77, 78, 172, 183, 184, 188, 78, - 184, 78, 189, 187, 183, 185, 190, 78, 78, 187, 186, 78, 191, 188, 78, 78, 0, 0, - 184, 0, 0, 0, 78, 0, 183, 184, 188, 78, - - 184, 78, 189, 187, 304, 0, 190, 78, 78, 187, 0, 78, 191, 0, 78, 78, 79, 224, - 213, 224, 214, 214, 213, 79, 224, 214, 310, 79, 213, 224, 79, 214, 304, 79, 312, 313, - 79, 0, 213, 0, 315, 214, 0, 0, 79, 224, 213, 224, 214, 214, 213, 79, 224, 214, - 310, 79, 213, 224, 79, 214, 317, 79, 312, 313, 79, 82, 213, 82, 315, 214, 82, 82, - 0, 82, 216, 82, 216, 82, 82, 0, 222, 216, 216, 0, 222, 318, 216, 82, 317, 0, - 222, 0, 0, 82, 0, 82, 0, 0, 82, 82, - - 222, 82, 216, 82, 216, 82, 82, 215, 222, 216, 216, 215, 222, 318, 216, 82, 83, 215, - 222, 218, 83, 218, 215, 83, 83, 218, 218, 215, 222, 319, 83, 218, 320, 83, 321, 215, - 322, 324, 325, 215, 83, 0, 0, 0, 83, 215, 0, 218, 83, 218, 215, 83, 83, 218, - 218, 215, 326, 319, 83, 218, 320, 83, 321, 0, 322, 324, 325, 0, 83, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 0, 327, 328, 0, 0, 326, 329, 203, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 330, 232, 234, - - 232, 234, 331, 332, 0, 232, 234, 232, 327, 328, 232, 234, 333, 329, 203, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 330, 232, 234, 232, 234, 331, 332, 204, 232, 234, 232, - 0, 0, 232, 234, 333, 0, 0, 0, 334, 238, 239, 238, 239, 335, 336, 0, 238, 239, - 338, 339, 340, 238, 239, 0, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 334, 238, 239, 238, 239, 335, 336, 205, 238, 239, 338, 339, 340, 238, 239, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 0, 342, 0, - - 0, 343, 0, 0, 0, 0, 0, 205, 206, 206, 0, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 206, 217, 219, 221, 217, 323, 342, 323, 221, 343, 221, 219, 217, 219, 217, 221, - 344, 223, 219, 217, 221, 223, 323, 219, 217, 0, 0, 223, 345, 217, 219, 221, 217, 323, - 0, 323, 221, 223, 221, 219, 217, 219, 217, 221, 344, 223, 219, 217, 221, 223, 323, 219, - 217, 220, 220, 223, 345, 225, 347, 220, 348, 220, 337, 349, 350, 223, 220, 220, 225, 0, - 225, 220, 351, 0, 0, 225, 352, 337, 0, 0, - - 225, 220, 220, 0, 0, 225, 347, 220, 348, 220, 337, 349, 350, 0, 220, 220, 225, 227, - 225, 220, 351, 227, 228, 225, 352, 337, 228, 227, 225, 226, 226, 226, 228, 226, 0, 228, - 226, 227, 353, 0, 354, 226, 228, 355, 0, 227, 356, 358, 359, 227, 228, 360, 229, 0, - 228, 227, 229, 226, 226, 226, 228, 226, 229, 228, 226, 227, 353, 229, 354, 226, 228, 355, - 229, 0, 356, 358, 359, 233, 0, 360, 229, 233, 361, 236, 229, 0, 0, 233, 362, 0, - 229, 0, 236, 363, 236, 229, 0, 233, 240, 236, - - 229, 230, 240, 230, 236, 233, 230, 364, 240, 233, 361, 236, 230, 242, 230, 233, 362, 242, - 240, 230, 236, 363, 236, 242, 230, 233, 240, 236, 0, 230, 240, 230, 236, 242, 230, 364, - 240, 0, 365, 366, 230, 242, 230, 367, 368, 242, 240, 230, 357, 369, 370, 242, 230, 231, - 372, 231, 357, 373, 375, 231, 231, 242, 241, 231, 241, 231, 365, 366, 241, 241, 376, 367, - 368, 0, 241, 0, 357, 369, 370, 371, 0, 231, 372, 231, 357, 373, 375, 231, 231, 371, - 241, 231, 241, 231, 235, 235, 241, 241, 376, 243, - - 377, 243, 241, 235, 244, 235, 243, 371, 244, 378, 235, 243, 380, 381, 244, 235, 0, 371, - 0, 382, 379, 0, 235, 235, 244, 384, 385, 243, 377, 243, 379, 235, 244, 235, 243, 387, - 244, 378, 235, 243, 380, 381, 244, 235, 237, 245, 237, 382, 379, 245, 237, 0, 244, 384, - 385, 245, 237, 237, 379, 388, 0, 237, 0, 387, 389, 245, 237, 0, 247, 246, 247, 246, - 237, 245, 237, 247, 246, 245, 237, 246, 247, 246, 0, 245, 237, 237, 390, 388, 249, 237, - 249, 0, 389, 245, 237, 249, 247, 246, 247, 246, - - 249, 250, 0, 247, 246, 250, 391, 246, 247, 246, 248, 250, 248, 253, 390, 253, 249, 248, - 249, 248, 253, 250, 248, 249, 392, 253, 251, 393, 249, 250, 251, 0, 0, 250, 391, 395, - 251, 251, 248, 250, 248, 253, 0, 253, 0, 248, 251, 248, 253, 250, 248, 0, 392, 253, - 251, 393, 254, 0, 251, 394, 254, 0, 0, 395, 251, 251, 254, 0, 0, 255, 260, 397, - 260, 255, 251, 252, 254, 260, 394, 255, 398, 399, 260, 252, 254, 252, 400, 394, 254, 255, - 252, 252, 256, 256, 254, 252, 256, 255, 260, 397, - - 260, 255, 256, 252, 254, 260, 394, 255, 398, 399, 260, 252, 256, 252, 400, 0, 396, 255, - 252, 252, 256, 256, 401, 252, 256, 259, 402, 259, 261, 396, 256, 259, 259, 0, 403, 404, - 261, 259, 261, 405, 256, 257, 406, 261, 396, 257, 407, 257, 261, 257, 401, 257, 408, 259, - 402, 259, 261, 396, 0, 259, 259, 257, 403, 404, 261, 259, 261, 405, 410, 257, 406, 261, - 411, 257, 407, 257, 261, 257, 412, 257, 408, 413, 414, 415, 416, 0, 262, 417, 262, 257, - 258, 418, 258, 262, 262, 264, 410, 264, 262, 419, - - 411, 258, 264, 258, 420, 422, 412, 264, 258, 413, 414, 415, 416, 258, 262, 417, 262, 0, - 258, 418, 258, 262, 262, 264, 0, 264, 262, 419, 423, 258, 264, 258, 420, 422, 265, 264, - 258, 423, 0, 0, 424, 258, 263, 0, 263, 265, 0, 265, 0, 263, 263, 0, 265, 263, - 263, 0, 423, 265, 266, 425, 426, 425, 265, 0, 266, 423, 266, 267, 424, 267, 263, 266, - 263, 265, 267, 265, 266, 263, 263, 267, 265, 263, 263, 268, 427, 265, 266, 425, 426, 425, - 0, 268, 266, 268, 266, 267, 428, 267, 268, 266, - - 429, 430, 267, 268, 266, 270, 269, 267, 269, 270, 431, 268, 427, 269, 269, 270, 432, 0, - 269, 268, 0, 268, 0, 0, 428, 270, 268, 0, 429, 430, 0, 268, 434, 270, 269, 271, - 269, 270, 431, 271, 435, 269, 269, 270, 432, 271, 269, 433, 271, 578, 272, 433, 273, 270, - 272, 271, 273, 579, 272, 274, 434, 274, 273, 271, 272, 580, 274, 271, 435, 581, 582, 274, - 273, 271, 272, 433, 271, 578, 272, 433, 273, 583, 272, 271, 273, 579, 272, 274, 0, 274, - 273, 584, 272, 580, 274, 0, 0, 581, 582, 274, - - 273, 0, 272, 275, 585, 276, 0, 586, 275, 583, 276, 0, 276, 277, 275, 277, 275, 276, - 588, 584, 277, 275, 276, 278, 277, 277, 275, 278, 591, 278, 592, 275, 585, 276, 278, 586, - 275, 593, 276, 278, 276, 277, 275, 277, 275, 276, 588, 0, 277, 275, 276, 278, 277, 277, - 275, 278, 591, 278, 592, 594, 596, 0, 278, 0, 597, 593, 280, 278, 279, 598, 280, 281, - 599, 601, 280, 281, 602, 279, 0, 279, 280, 281, 0, 0, 279, 279, 0, 594, 596, 279, - 280, 281, 597, 0, 280, 603, 279, 598, 280, 281, - - 599, 601, 280, 281, 602, 279, 282, 279, 280, 281, 282, 283, 279, 279, 282, 283, 604, 279, - 280, 281, 282, 283, 285, 603, 283, 285, 605, 0, 0, 285, 282, 283, 284, 0, 282, 285, - 284, 0, 282, 283, 284, 606, 282, 283, 604, 285, 284, 607, 282, 283, 285, 287, 283, 285, - 605, 287, 284, 285, 282, 283, 284, 287, 608, 285, 284, 286, 286, 286, 284, 606, 0, 287, - 286, 285, 284, 607, 0, 286, 288, 287, 609, 289, 288, 287, 284, 289, 288, 612, 288, 287, - 608, 289, 289, 286, 286, 286, 0, 613, 288, 287, - - 286, 289, 614, 615, 290, 286, 288, 616, 609, 289, 288, 290, 617, 289, 288, 612, 288, 618, - 290, 289, 289, 290, 292, 292, 290, 613, 288, 292, 0, 289, 614, 615, 290, 292, 619, 616, - 621, 293, 0, 290, 617, 293, 622, 292, 623, 618, 290, 293, 0, 290, 292, 292, 290, 291, - 0, 292, 291, 293, 0, 0, 291, 292, 619, 291, 621, 293, 291, 624, 0, 293, 622, 292, - 623, 627, 0, 293, 291, 628, 0, 0, 294, 291, 294, 630, 291, 293, 294, 294, 291, 295, - 0, 291, 294, 295, 291, 624, 296, 0, 0, 295, - - 296, 627, 295, 297, 291, 628, 296, 297, 294, 295, 294, 630, 632, 297, 294, 294, 296, 295, - 297, 633, 294, 295, 445, 297, 296, 298, 445, 295, 296, 298, 295, 297, 445, 298, 296, 297, - 449, 295, 449, 298, 632, 297, 445, 449, 296, 634, 297, 633, 449, 298, 445, 297, 635, 298, - 445, 0, 0, 298, 0, 0, 445, 298, 0, 0, 449, 0, 449, 298, 0, 0, 445, 449, - 0, 634, 636, 637, 449, 298, 439, 439, 635, 439, 439, 439, 439, 439, 439, 439, 439, 439, - 439, 440, 440, 440, 440, 440, 440, 440, 440, 440, - - 440, 640, 636, 637, 644, 646, 647, 649, 440, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 442, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 640, 651, 0, 644, 646, 647, 649, - 440, 441, 441, 652, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 446, 447, 448, 0, - 446, 447, 448, 450, 651, 450, 446, 447, 448, 451, 450, 653, 0, 652, 0, 450, 446, 447, - 448, 0, 451, 0, 451, 0, 446, 447, 448, 451, 446, 447, 448, 450, 451, 450, 446, 447, - 448, 451, 450, 653, 452, 0, 452, 450, 446, 447, - - 448, 452, 451, 453, 451, 638, 452, 453, 454, 451, 0, 0, 454, 453, 451, 0, 638, 655, - 454, 656, 0, 0, 452, 453, 452, 457, 657, 457, 454, 452, 0, 453, 457, 638, 452, 453, - 454, 457, 456, 455, 454, 453, 456, 455, 638, 655, 454, 656, 456, 455, 0, 453, 658, 457, - 657, 457, 454, 455, 456, 455, 457, 458, 0, 458, 660, 457, 456, 455, 458, 661, 456, 455, - 0, 458, 0, 0, 456, 455, 650, 650, 658, 663, 0, 0, 664, 455, 456, 455, 665, 458, - 460, 458, 660, 666, 460, 461, 458, 661, 668, 461, - - 460, 458, 459, 460, 459, 461, 650, 650, 459, 663, 460, 461, 664, 0, 459, 461, 665, 0, - 460, 459, 0, 666, 460, 461, 459, 669, 668, 461, 460, 670, 459, 460, 459, 461, 671, 0, - 459, 672, 460, 461, 462, 463, 459, 461, 462, 463, 0, 459, 462, 0, 462, 463, 459, 669, - 464, 674, 463, 670, 464, 0, 462, 463, 671, 465, 464, 672, 0, 465, 462, 463, 675, 465, - 462, 463, 464, 676, 462, 465, 462, 463, 677, 0, 464, 674, 463, 0, 464, 465, 462, 463, - 680, 465, 464, 681, 466, 465, 466, 682, 675, 465, - - 468, 466, 464, 676, 468, 465, 466, 467, 677, 467, 468, 683, 684, 467, 467, 465, 0, 0, - 680, 467, 468, 681, 466, 0, 466, 682, 687, 0, 468, 466, 688, 0, 468, 690, 466, 467, - 691, 467, 468, 683, 684, 467, 467, 469, 470, 469, 470, 467, 468, 471, 469, 470, 692, 471, - 687, 469, 470, 0, 688, 471, 693, 690, 472, 694, 691, 695, 472, 0, 0, 471, 472, 469, - 470, 469, 470, 696, 472, 471, 469, 470, 692, 471, 0, 469, 470, 473, 472, 471, 693, 473, - 472, 694, 475, 695, 472, 473, 475, 471, 472, 697, - - 473, 0, 475, 696, 472, 473, 477, 0, 0, 474, 477, 474, 475, 473, 472, 474, 477, 473, - 698, 0, 475, 474, 478, 473, 475, 478, 477, 697, 473, 478, 475, 474, 476, 473, 477, 478, - 476, 474, 477, 474, 475, 700, 476, 474, 477, 478, 698, 476, 702, 474, 478, 479, 476, 478, - 477, 479, 704, 478, 0, 474, 476, 479, 479, 478, 476, 840, 842, 844, 480, 700, 476, 479, - 480, 478, 0, 476, 702, 481, 480, 479, 476, 481, 482, 479, 704, 845, 482, 481, 480, 479, - 479, 846, 482, 840, 842, 844, 480, 481, 847, 479, - - 480, 848, 482, 483, 0, 481, 480, 483, 484, 481, 482, 483, 484, 845, 482, 481, 480, 483, - 484, 846, 482, 849, 850, 851, 852, 481, 847, 483, 484, 848, 482, 483, 485, 0, 485, 483, - 484, 854, 485, 483, 484, 486, 855, 486, 485, 483, 484, 856, 486, 849, 850, 851, 852, 486, - 485, 483, 484, 0, 0, 857, 485, 487, 485, 487, 858, 854, 485, 0, 487, 486, 855, 486, - 485, 487, 859, 856, 486, 0, 488, 861, 488, 486, 485, 862, 488, 488, 489, 857, 489, 487, - 488, 487, 858, 489, 863, 490, 487, 864, 489, 490, - - 0, 487, 859, 0, 865, 490, 488, 861, 488, 866, 867, 862, 488, 488, 489, 490, 489, 0, - 488, 868, 491, 489, 863, 490, 491, 864, 489, 490, 491, 492, 0, 492, 865, 490, 491, 869, - 492, 866, 867, 870, 871, 492, 0, 490, 491, 493, 874, 868, 491, 493, 494, 0, 491, 493, - 494, 493, 491, 492, 494, 492, 494, 0, 491, 869, 492, 493, 875, 870, 871, 492, 494, 876, - 491, 493, 874, 877, 0, 493, 494, 496, 878, 493, 494, 493, 0, 495, 494, 495, 494, 496, - 0, 496, 495, 493, 875, 0, 496, 495, 494, 876, - - 0, 496, 497, 877, 497, 879, 882, 496, 878, 497, 885, 497, 498, 495, 497, 495, 498, 496, - 498, 496, 495, 0, 886, 498, 496, 495, 0, 0, 498, 496, 497, 888, 497, 879, 882, 0, - 891, 497, 885, 497, 498, 894, 497, 499, 498, 500, 498, 499, 501, 500, 886, 498, 501, 499, - 887, 500, 498, 887, 501, 888, 500, 501, 895, 499, 891, 500, 0, 0, 501, 894, 0, 499, - 0, 500, 896, 499, 501, 500, 897, 0, 501, 499, 887, 500, 898, 887, 501, 0, 500, 501, - 895, 499, 0, 500, 502, 503, 501, 504, 502, 503, - - 502, 504, 896, 899, 502, 503, 897, 504, 902, 0, 0, 903, 898, 0, 502, 503, 0, 504, - 904, 0, 505, 905, 502, 503, 505, 504, 502, 503, 502, 504, 505, 899, 502, 503, 506, 504, - 902, 507, 506, 903, 505, 507, 502, 503, 506, 504, 904, 507, 505, 905, 906, 508, 505, 0, - 506, 508, 908, 507, 505, 909, 910, 508, 506, 0, 912, 507, 506, 508, 505, 507, 0, 508, - 506, 913, 509, 507, 509, 0, 906, 508, 914, 509, 506, 508, 908, 507, 509, 909, 910, 508, - 512, 510, 912, 510, 512, 508, 915, 917, 510, 508, - - 512, 913, 509, 510, 509, 511, 918, 511, 914, 509, 512, 919, 511, 511, 509, 920, 921, 511, - 512, 510, 922, 510, 512, 0, 915, 917, 510, 923, 512, 0, 924, 510, 513, 511, 918, 511, - 513, 0, 512, 919, 511, 511, 513, 920, 921, 511, 514, 514, 922, 925, 927, 514, 513, 0, - 928, 923, 929, 514, 924, 931, 513, 516, 932, 516, 513, 516, 933, 514, 0, 1036, 513, 516, - 0, 0, 514, 514, 0, 925, 927, 514, 513, 516, 928, 0, 929, 514, 0, 931, 1038, 516, - 932, 516, 0, 516, 933, 514, 515, 1036, 518, 516, - - 515, 517, 518, 517, 515, 517, 515, 0, 518, 516, 515, 517, 0, 0, 518, 519, 1038, 0, - 518, 519, 515, 517, 0, 0, 515, 519, 518, 0, 515, 517, 518, 517, 515, 517, 515, 519, - 518, 1040, 515, 517, 520, 521, 518, 519, 520, 521, 518, 519, 515, 517, 520, 521, 1041, 519, - 522, 520, 1042, 521, 522, 1043, 520, 521, 1045, 519, 522, 1040, 0, 523, 520, 521, 0, 523, - 520, 521, 522, 523, 0, 0, 520, 521, 1041, 523, 522, 520, 1042, 521, 522, 1043, 520, 521, - 1045, 523, 522, 0, 524, 523, 524, 1047, 525, 523, - - 525, 524, 522, 523, 525, 525, 524, 1048, 1049, 523, 525, 526, 0, 526, 1050, 0, 0, 527, - 526, 523, 1051, 527, 524, 526, 524, 1047, 525, 527, 525, 524, 1053, 1055, 525, 525, 524, 1048, - 1049, 527, 525, 526, 528, 526, 1050, 529, 528, 527, 526, 529, 1051, 527, 528, 526, 1057, 529, - 1060, 527, 529, 1062, 1053, 1055, 528, 0, 1063, 529, 0, 527, 1064, 531, 528, 531, 1065, 529, - 528, 1072, 531, 529, 0, 0, 528, 531, 1057, 529, 1060, 0, 529, 1062, 1073, 0, 528, 536, - 1063, 529, 530, 536, 1064, 531, 530, 531, 1065, 536, - - 530, 1072, 531, 533, 533, 533, 530, 531, 1074, 536, 533, 530, 0, 1077, 1073, 533, 530, 536, - 1079, 0, 530, 536, 0, 1081, 530, 1083, 0, 536, 530, 1084, 0, 533, 533, 533, 530, 534, - 1074, 536, 533, 530, 534, 1077, 534, 533, 530, 532, 1079, 534, 535, 0, 535, 1081, 534, 1083, - 532, 535, 532, 1084, 532, 1085, 535, 532, 1086, 534, 0, 1087, 532, 1088, 534, 1090, 534, 1091, - 1092, 532, 0, 534, 535, 537, 535, 0, 534, 537, 532, 535, 532, 537, 532, 1085, 535, 532, - 1086, 537, 538, 1087, 532, 1088, 538, 1090, 1093, 1091, - - 1092, 537, 538, 0, 0, 537, 1095, 538, 1097, 537, 1099, 539, 538, 537, 539, 539, 540, 1100, - 540, 537, 538, 539, 1101, 540, 538, 541, 1093, 541, 540, 537, 538, 539, 541, 0, 1095, 538, - 1097, 541, 1099, 539, 538, 1102, 539, 539, 540, 1100, 540, 0, 542, 539, 1101, 540, 542, 541, - 0, 541, 540, 543, 542, 539, 541, 543, 544, 0, 0, 541, 544, 543, 542, 1102, 0, 545, - 544, 0, 0, 545, 542, 543, 0, 0, 542, 545, 544, 0, 0, 543, 542, 1103, 546, 543, - 544, 545, 546, 0, 544, 543, 542, 0, 546, 545, - - 544, 546, 548, 545, 1108, 543, 548, 547, 546, 545, 544, 547, 548, 548, 1109, 1103, 546, 547, - 1190, 545, 546, 549, 548, 549, 0, 547, 546, 547, 549, 546, 548, 0, 1108, 549, 548, 547, - 546, 0, 0, 547, 548, 548, 1109, 0, 0, 547, 1190, 0, 0, 549, 548, 549, 550, 547, - 550, 547, 549, 0, 1194, 550, 550, 549, 0, 551, 550, 551, 552, 0, 552, 1195, 551, 551, - 553, 552, 553, 551, 553, 1198, 552, 553, 550, 1199, 550, 555, 553, 555, 1194, 550, 550, 0, - 555, 551, 550, 551, 552, 555, 552, 1195, 551, 551, - - 553, 552, 553, 551, 553, 1198, 552, 553, 554, 1199, 554, 555, 553, 555, 0, 554, 554, 556, - 555, 0, 554, 556, 557, 555, 0, 1200, 557, 556, 558, 0, 558, 0, 557, 0, 1204, 558, - 554, 556, 554, 0, 558, 1207, 557, 554, 554, 556, 1208, 560, 554, 556, 557, 560, 559, 1200, - 557, 556, 558, 560, 558, 559, 557, 559, 1204, 558, 0, 556, 559, 560, 558, 1207, 557, 559, - 561, 562, 1208, 560, 561, 562, 1211, 560, 559, 0, 561, 562, 561, 560, 1212, 559, 1213, 559, - 0, 1214, 561, 562, 559, 560, 564, 1217, 564, 559, - - 561, 562, 1218, 564, 561, 562, 1211, 1219, 564, 563, 561, 562, 561, 563, 1212, 1222, 1213, 563, - 566, 1214, 561, 562, 1224, 563, 564, 1217, 564, 566, 712, 566, 1218, 564, 712, 563, 566, 1219, - 564, 563, 712, 566, 565, 563, 565, 1222, 1225, 563, 566, 565, 712, 565, 1224, 563, 565, 0, - 0, 566, 712, 566, 0, 0, 712, 563, 566, 0, 0, 1226, 712, 566, 565, 1227, 565, 567, - 1225, 567, 1228, 565, 712, 565, 567, 568, 565, 568, 567, 567, 1278, 1281, 568, 568, 569, 1285, - 569, 568, 570, 1226, 569, 569, 570, 1227, 570, 567, - - 569, 567, 1228, 570, 1286, 0, 567, 568, 570, 568, 567, 567, 1278, 1281, 568, 568, 569, 1285, - 569, 568, 570, 0, 569, 569, 570, 1289, 570, 571, 569, 571, 1290, 570, 1286, 571, 571, 1291, - 570, 1292, 1296, 571, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 0, 0, 0, 1289, - 0, 571, 0, 571, 1290, 0, 0, 571, 571, 1291, 0, 1292, 1296, 571, 575, 575, 575, 575, - 575, 575, 575, 575, 575, 575, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 577, 577, - 577, 577, 577, 577, 577, 577, 577, 577, 706, 706, - - 706, 706, 706, 706, 706, 706, 706, 706, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 710, 1297, 710, 711, 713, 711, 710, 710, 713, 711, 711, 1298, 710, 0, 713, 711, - 1279, 1279, 0, 1300, 0, 1327, 1328, 0, 713, 0, 0, 0, 710, 1297, 710, 711, 713, 711, - 710, 710, 713, 711, 711, 1298, 710, 714, 713, 711, 0, 714, 715, 1300, 715, 1327, 1328, 714, - 713, 715, 714, 716, 1279, 1331, 715, 716, 717, 714, - - 717, 1334, 0, 716, 0, 717, 0, 714, 0, 1337, 717, 714, 715, 716, 715, 1303, 1303, 714, - 1341, 715, 714, 716, 1279, 1331, 715, 716, 717, 714, 717, 1334, 718, 716, 719, 717, 718, 720, - 719, 1337, 717, 720, 718, 716, 719, 720, 1354, 1354, 1341, 0, 0, 720, 718, 1355, 719, 1359, - 0, 1303, 1362, 0, 718, 720, 719, 1368, 718, 720, 719, 721, 0, 720, 718, 721, 719, 720, - 722, 1361, 1361, 721, 722, 720, 718, 1355, 719, 1359, 722, 1303, 1362, 721, 724, 720, 1354, 1368, - 724, 723, 722, 721, 724, 723, 724, 721, 0, 723, - - 722, 1372, 0, 721, 722, 723, 724, 0, 0, 0, 722, 0, 1376, 721, 724, 723, 1354, 1361, - 724, 723, 722, 725, 724, 723, 724, 725, 726, 723, 727, 1372, 726, 725, 727, 723, 724, 729, - 726, 729, 727, 726, 1376, 725, 729, 723, 0, 1361, 726, 729, 727, 725, 0, 1378, 1380, 725, - 726, 0, 727, 1382, 726, 725, 727, 1384, 1386, 729, 726, 729, 727, 726, 728, 725, 729, 1388, - 728, 1390, 726, 729, 727, 730, 728, 1378, 1380, 730, 1392, 728, 0, 1382, 0, 730, 728, 1384, - 1386, 0, 1394, 0, 0, 0, 728, 730, 731, 1388, - - 728, 1390, 731, 0, 0, 730, 728, 0, 731, 730, 1392, 728, 733, 731, 733, 730, 728, 732, - 731, 733, 1394, 732, 0, 0, 733, 730, 731, 732, 0, 0, 731, 734, 734, 734, 0, 0, - 731, 732, 734, 0, 733, 731, 733, 734, 0, 732, 731, 733, 0, 732, 0, 0, 733, 0, - 0, 732, 736, 0, 736, 734, 734, 734, 737, 736, 736, 732, 734, 735, 736, 735, 0, 734, - 0, 737, 735, 737, 735, 0, 0, 735, 737, 738, 0, 738, 736, 737, 736, 738, 738, 739, - 737, 736, 736, 738, 0, 735, 736, 735, 739, 0, - - 739, 737, 735, 737, 735, 739, 0, 735, 737, 738, 739, 738, 0, 737, 740, 738, 738, 739, - 740, 0, 741, 738, 741, 742, 740, 742, 739, 741, 739, 743, 742, 743, 741, 739, 740, 742, - 743, 0, 739, 0, 0, 743, 740, 0, 0, 0, 740, 0, 741, 0, 741, 742, 740, 742, - 0, 741, 0, 743, 742, 743, 741, 0, 740, 742, 743, 744, 0, 0, 0, 743, 745, 0, - 745, 744, 745, 744, 0, 745, 0, 746, 744, 746, 745, 746, 0, 744, 746, 747, 0, 747, - 0, 746, 0, 744, 747, 0, 747, 0, 745, 747, - - 745, 744, 745, 744, 0, 745, 0, 746, 744, 746, 745, 746, 0, 744, 746, 747, 0, 747, - 748, 746, 748, 749, 747, 0, 747, 748, 748, 747, 0, 750, 748, 751, 749, 0, 749, 751, - 0, 0, 0, 749, 750, 751, 750, 0, 749, 0, 748, 750, 748, 749, 0, 751, 750, 748, - 748, 0, 0, 750, 748, 751, 749, 752, 749, 751, 0, 752, 0, 749, 750, 751, 750, 752, - 749, 0, 0, 750, 0, 0, 0, 751, 750, 752, 753, 0, 754, 0, 753, 0, 754, 752, - 0, 755, 753, 752, 754, 755, 0, 753, 0, 752, - - 0, 755, 753, 0, 754, 0, 0, 0, 0, 752, 753, 755, 754, 756, 753, 0, 754, 756, - 0, 755, 753, 756, 754, 755, 757, 753, 0, 756, 757, 755, 753, 0, 754, 0, 757, 0, - 0, 756, 758, 755, 0, 756, 758, 759, 757, 756, 0, 759, 758, 756, 0, 759, 757, 0, - 0, 756, 757, 759, 758, 0, 0, 0, 757, 0, 0, 756, 758, 759, 0, 0, 758, 759, - 757, 760, 0, 759, 758, 760, 761, 759, 0, 0, 761, 760, 760, 759, 758, 762, 761, 762, - 763, 0, 763, 760, 762, 759, 0, 763, 761, 762, - - 0, 760, 763, 0, 0, 760, 761, 764, 0, 764, 761, 760, 760, 0, 764, 762, 761, 762, - 763, 764, 763, 760, 762, 0, 765, 763, 761, 762, 765, 0, 763, 0, 0, 0, 765, 764, - 767, 764, 767, 0, 0, 766, 764, 767, 765, 766, 0, 764, 767, 0, 0, 766, 765, 768, - 766, 768, 765, 0, 0, 768, 768, 766, 765, 0, 767, 768, 767, 0, 769, 766, 769, 767, - 765, 766, 769, 769, 767, 0, 0, 766, 769, 768, 766, 768, 0, 0, 0, 768, 768, 766, - 779, 0, 0, 768, 779, 0, 769, 0, 769, 771, - - 779, 771, 769, 769, 0, 772, 771, 772, 769, 770, 779, 771, 772, 0, 770, 0, 770, 772, - 779, 0, 770, 770, 779, 0, 0, 0, 770, 771, 779, 771, 0, 0, 0, 772, 771, 772, - 0, 770, 779, 771, 772, 0, 770, 0, 770, 772, 0, 0, 770, 770, 773, 774, 773, 774, - 770, 0, 0, 773, 774, 775, 0, 775, 773, 774, 0, 776, 775, 776, 0, 0, 0, 775, - 776, 776, 0, 0, 0, 776, 773, 774, 773, 774, 0, 0, 0, 773, 774, 775, 0, 775, - 773, 774, 0, 776, 775, 776, 777, 0, 777, 775, - - 776, 776, 778, 777, 778, 776, 0, 780, 777, 778, 0, 780, 0, 782, 778, 782, 0, 780, - 781, 0, 782, 782, 781, 0, 777, 782, 777, 780, 781, 0, 778, 777, 778, 0, 0, 780, - 777, 778, 781, 780, 0, 782, 778, 782, 0, 780, 781, 0, 782, 782, 781, 0, 0, 782, - 783, 780, 781, 784, 783, 784, 783, 0, 0, 784, 784, 783, 781, 0, 0, 784, 783, 0, - 0, 0, 785, 0, 0, 0, 785, 786, 0, 0, 783, 786, 785, 784, 783, 784, 783, 786, - 0, 784, 784, 783, 785, 0, 0, 784, 783, 786, - - 788, 0, 785, 787, 788, 787, 785, 786, 0, 787, 788, 786, 785, 0, 0, 787, 0, 786, - 0, 0, 788, 0, 785, 0, 0, 787, 789, 786, 788, 0, 789, 787, 788, 787, 0, 0, - 789, 787, 788, 789, 0, 791, 0, 787, 0, 791, 789, 0, 788, 0, 0, 791, 790, 787, - 789, 0, 790, 0, 789, 0, 0, 791, 790, 0, 789, 790, 793, 789, 0, 791, 793, 0, - 790, 791, 789, 0, 793, 792, 0, 791, 790, 792, 0, 0, 790, 792, 793, 792, 0, 791, - 790, 794, 795, 790, 793, 794, 795, 792, 793, 0, - - 790, 794, 795, 0, 793, 792, 0, 0, 0, 792, 0, 794, 795, 792, 793, 792, 0, 0, - 796, 794, 795, 0, 796, 794, 795, 792, 796, 797, 0, 794, 795, 797, 796, 798, 0, 797, - 0, 798, 0, 794, 795, 797, 796, 798, 0, 0, 796, 0, 799, 0, 796, 797, 799, 798, - 796, 797, 0, 0, 799, 797, 796, 798, 800, 797, 0, 798, 800, 0, 799, 797, 796, 798, - 800, 0, 0, 800, 799, 0, 0, 797, 799, 798, 800, 0, 0, 801, 799, 803, 802, 801, - 800, 803, 802, 801, 800, 801, 799, 803, 802, 0, - - 800, 802, 803, 800, 0, 801, 0, 803, 802, 0, 800, 804, 0, 801, 804, 803, 802, 801, - 804, 803, 802, 801, 0, 801, 804, 803, 802, 805, 0, 802, 803, 805, 0, 801, 804, 803, - 802, 805, 0, 804, 806, 0, 804, 0, 806, 0, 804, 805, 806, 807, 806, 807, 804, 809, - 0, 805, 807, 809, 0, 805, 806, 807, 804, 809, 0, 805, 0, 0, 806, 0, 0, 808, - 806, 809, 0, 805, 806, 807, 806, 807, 808, 809, 808, 0, 807, 809, 810, 808, 806, 807, - 810, 809, 808, 811, 0, 0, 810, 811, 0, 808, - - 812, 809, 812, 811, 0, 0, 810, 812, 808, 0, 808, 0, 812, 811, 810, 808, 0, 0, - 810, 813, 808, 811, 814, 813, 810, 811, 814, 0, 812, 813, 812, 811, 814, 815, 810, 812, - 0, 815, 0, 813, 812, 811, 814, 815, 0, 0, 0, 813, 816, 0, 814, 813, 816, 815, - 814, 0, 0, 813, 816, 817, 814, 815, 818, 817, 0, 815, 818, 813, 816, 817, 814, 815, - 818, 0, 0, 0, 816, 0, 0, 817, 816, 815, 818, 0, 0, 0, 816, 817, 0, 0, - 818, 817, 0, 0, 818, 0, 816, 817, 0, 819, - - 818, 819, 820, 0, 820, 0, 819, 817, 0, 820, 818, 819, 822, 821, 820, 821, 0, 0, - 0, 0, 821, 822, 0, 822, 0, 821, 0, 819, 822, 819, 820, 0, 820, 822, 819, 0, - 0, 820, 0, 819, 822, 821, 820, 821, 0, 823, 0, 823, 821, 822, 0, 822, 823, 821, - 823, 0, 822, 823, 824, 0, 824, 822, 825, 0, 825, 824, 826, 0, 0, 825, 824, 825, - 0, 823, 825, 823, 0, 826, 0, 826, 823, 0, 823, 0, 826, 823, 824, 0, 824, 826, - 825, 0, 825, 824, 826, 0, 0, 825, 824, 825, - - 0, 827, 825, 827, 0, 826, 0, 826, 827, 827, 829, 828, 826, 827, 829, 0, 828, 826, - 828, 0, 829, 0, 0, 828, 0, 0, 0, 0, 828, 827, 829, 827, 0, 0, 0, 0, - 827, 827, 829, 828, 0, 827, 829, 0, 828, 0, 828, 0, 829, 830, 831, 828, 830, 830, - 831, 0, 828, 0, 829, 830, 831, 0, 0, 832, 833, 0, 0, 832, 833, 830, 831, 0, - 0, 832, 833, 0, 0, 830, 831, 832, 830, 830, 831, 832, 833, 0, 0, 830, 831, 834, - 835, 832, 833, 834, 835, 832, 833, 830, 831, 834, - - 835, 832, 833, 0, 0, 0, 0, 832, 0, 834, 835, 832, 833, 836, 0, 836, 0, 834, - 835, 0, 836, 834, 835, 0, 937, 836, 937, 834, 835, 0, 0, 937, 938, 939, 938, 939, - 937, 834, 835, 938, 939, 836, 0, 836, 938, 939, 941, 939, 836, 0, 941, 0, 937, 836, - 937, 0, 941, 0, 0, 937, 938, 939, 938, 939, 937, 0, 941, 938, 939, 940, 0, 940, - 938, 939, 941, 939, 940, 0, 941, 0, 0, 940, 942, 943, 941, 944, 942, 943, 0, 944, - 0, 0, 942, 943, 941, 944, 0, 940, 0, 940, - - 944, 0, 942, 943, 940, 944, 0, 0, 945, 940, 942, 943, 945, 944, 942, 943, 945, 944, - 0, 0, 942, 943, 945, 944, 946, 946, 0, 0, 944, 946, 942, 943, 945, 944, 0, 946, - 945, 947, 0, 947, 945, 0, 0, 947, 945, 946, 0, 0, 0, 947, 945, 0, 946, 946, - 948, 0, 948, 946, 0, 947, 945, 948, 949, 946, 949, 947, 948, 947, 950, 949, 949, 947, - 950, 946, 949, 951, 0, 947, 950, 951, 0, 0, 948, 0, 948, 951, 0, 947, 950, 948, - 949, 0, 949, 0, 948, 951, 950, 949, 949, 0, - - 950, 952, 949, 951, 0, 952, 950, 951, 953, 0, 953, 952, 0, 951, 954, 953, 950, 0, - 954, 0, 953, 952, 0, 951, 954, 0, 0, 955, 0, 952, 0, 955, 0, 952, 954, 0, - 953, 955, 953, 952, 0, 0, 954, 953, 0, 0, 954, 955, 953, 952, 956, 0, 954, 0, - 956, 955, 958, 0, 956, 955, 958, 957, 954, 957, 956, 955, 958, 959, 957, 0, 0, 959, - 0, 957, 956, 955, 958, 959, 956, 0, 0, 0, 956, 0, 958, 0, 956, 959, 958, 957, - 0, 957, 956, 960, 958, 959, 957, 960, 0, 959, - - 0, 957, 956, 960, 958, 959, 963, 961, 0, 0, 963, 961, 962, 960, 962, 959, 963, 961, - 0, 962, 0, 960, 961, 0, 962, 960, 963, 961, 0, 0, 0, 960, 0, 964, 963, 961, - 0, 964, 963, 961, 962, 960, 962, 964, 963, 961, 0, 962, 0, 0, 961, 0, 962, 964, - 963, 961, 965, 0, 966, 967, 965, 964, 966, 967, 0, 964, 965, 0, 966, 967, 968, 964, - 968, 966, 967, 0, 965, 968, 966, 967, 0, 964, 968, 0, 965, 0, 966, 967, 965, 969, - 966, 967, 0, 969, 965, 0, 966, 967, 968, 969, - - 968, 966, 967, 0, 965, 968, 966, 967, 0, 969, 968, 0, 970, 0, 970, 971, 972, 969, - 970, 971, 972, 969, 0, 0, 970, 971, 972, 969, 0, 0, 0, 0, 0, 0, 970, 971, - 972, 969, 0, 0, 970, 973, 970, 971, 972, 973, 970, 971, 972, 0, 0, 973, 970, 971, - 972, 0, 974, 0, 974, 973, 974, 973, 970, 971, 972, 976, 974, 976, 0, 973, 975, 0, - 976, 973, 975, 0, 974, 976, 0, 973, 975, 0, 0, 0, 974, 975, 974, 973, 974, 973, - 975, 0, 0, 976, 974, 976, 0, 0, 975, 977, - - 976, 977, 975, 0, 974, 976, 977, 978, 975, 0, 0, 977, 978, 975, 978, 0, 0, 0, - 975, 978, 0, 979, 0, 979, 978, 0, 0, 977, 979, 977, 0, 0, 0, 979, 977, 978, - 980, 0, 980, 977, 978, 0, 978, 980, 0, 0, 0, 978, 980, 979, 0, 979, 978, 0, - 0, 981, 979, 981, 982, 0, 982, 979, 981, 981, 980, 982, 980, 981, 0, 0, 982, 980, - 983, 0, 983, 0, 980, 0, 0, 983, 0, 0, 0, 981, 983, 981, 982, 0, 982, 0, - 981, 981, 0, 982, 0, 981, 0, 984, 982, 984, - - 983, 986, 983, 986, 984, 984, 985, 983, 986, 984, 985, 986, 983, 986, 0, 0, 985, 0, - 0, 0, 0, 0, 0, 0, 0, 984, 985, 984, 987, 986, 987, 986, 984, 984, 985, 987, - 986, 984, 985, 986, 987, 986, 0, 988, 985, 988, 0, 0, 0, 0, 988, 0, 990, 0, - 985, 988, 987, 989, 987, 989, 990, 0, 990, 987, 989, 0, 0, 990, 987, 989, 0, 988, - 990, 988, 991, 0, 991, 992, 988, 992, 990, 991, 0, 988, 992, 989, 991, 989, 990, 992, - 990, 0, 989, 0, 0, 990, 0, 989, 0, 0, - - 990, 994, 991, 994, 991, 992, 993, 992, 994, 991, 993, 0, 992, 994, 991, 0, 993, 992, - 0, 995, 0, 0, 0, 0, 0, 0, 993, 0, 0, 994, 995, 994, 995, 0, 993, 0, - 994, 995, 993, 0, 0, 994, 995, 996, 993, 996, 0, 995, 0, 0, 996, 996, 0, 997, - 993, 996, 0, 997, 995, 997, 995, 0, 0, 0, 997, 995, 0, 0, 0, 997, 995, 996, - 0, 996, 0, 0, 0, 0, 996, 996, 0, 997, 998, 996, 998, 997, 999, 997, 999, 998, - 998, 0, 997, 999, 998, 0, 0, 997, 999, 1000, - - 0, 1000, 0, 1001, 0, 1002, 1000, 1001, 0, 1002, 998, 1000, 998, 1001, 999, 1002, 999, 998, - 998, 0, 1002, 999, 998, 1001, 0, 1002, 999, 1000, 0, 1000, 0, 1001, 1006, 1002, 1000, 1001, - 1006, 1002, 0, 1000, 0, 1001, 1006, 1002, 1003, 1003, 1004, 0, 1002, 1003, 1004, 1001, 1006, 1002, - 0, 1003, 1004, 0, 0, 1004, 1006, 0, 0, 0, 1006, 1003, 1004, 0, 0, 1019, 1006, 1019, - 1003, 1003, 1004, 1005, 1019, 1003, 1004, 1005, 1006, 1019, 1007, 1003, 1004, 1005, 1007, 1004, 1005, 0, - 0, 0, 1007, 1003, 1004, 1005, 0, 1019, 0, 1019, - - 0, 1008, 1007, 1005, 1019, 1008, 0, 1005, 1009, 1019, 1007, 1008, 1009, 1005, 1007, 1010, 1005, 0, - 1009, 1010, 1007, 1008, 0, 1005, 0, 1010, 0, 0, 1009, 1008, 1007, 0, 0, 1008, 1011, 1010, - 1009, 1012, 1011, 1008, 1009, 1012, 1011, 1010, 0, 1012, 1009, 1010, 1011, 1008, 0, 1012, 0, 1010, - 0, 0, 1009, 0, 1011, 0, 0, 1012, 1011, 1010, 0, 1012, 1011, 1013, 1013, 1012, 1011, 0, - 1013, 1012, 0, 0, 1011, 1014, 1013, 1012, 0, 1014, 0, 0, 0, 0, 1011, 1014, 1013, 1012, - 0, 0, 1014, 0, 1015, 1013, 1013, 1014, 1015, 0, - - 1013, 0, 0, 1016, 1015, 1014, 1013, 1016, 0, 1014, 0, 0, 0, 1016, 1015, 1014, 1013, 0, - 0, 0, 1014, 0, 1015, 1016, 0, 1014, 1015, 0, 1017, 1017, 1018, 1016, 1015, 1017, 1018, 1016, - 0, 0, 1018, 1017, 0, 1016, 1015, 0, 1018, 0, 0, 0, 0, 1017, 0, 1016, 0, 1020, - 1018, 1020, 1017, 1017, 1018, 1020, 1020, 1017, 1018, 0, 0, 1020, 1018, 1017, 1021, 0, 1021, 0, - 1018, 0, 0, 1021, 1021, 1017, 0, 1022, 1021, 1020, 1018, 1020, 0, 0, 0, 1020, 1020, 0, - 1022, 0, 1022, 1020, 0, 0, 1021, 1022, 1021, 1023, - - 0, 0, 1022, 1021, 1021, 0, 0, 1022, 1021, 1024, 1023, 1024, 1023, 0, 0, 0, 1024, 1023, - 1022, 0, 1022, 1024, 1023, 0, 1025, 1022, 1025, 1023, 0, 0, 1022, 1025, 0, 0, 0, 0, - 1025, 1024, 1023, 1024, 1023, 0, 0, 1026, 1024, 1023, 0, 1026, 0, 1024, 1023, 0, 1025, 1026, - 1025, 1027, 1027, 1028, 1029, 1025, 1027, 1028, 1029, 1026, 1025, 0, 1027, 1028, 1029, 0, 0, 1026, - 0, 0, 0, 1026, 1027, 1028, 1029, 0, 1030, 1026, 1030, 1027, 1027, 1028, 1029, 1030, 1027, 1028, - 1029, 1026, 1030, 0, 1027, 1028, 1029, 0, 1031, 0, - - 0, 1032, 0, 0, 1027, 1028, 1029, 0, 1030, 1031, 1030, 1031, 1032, 0, 1032, 1030, 1031, 0, - 0, 1032, 1030, 1031, 0, 1033, 1032, 1033, 1031, 0, 0, 1032, 1033, 1034, 0, 1034, 0, 1033, - 0, 1031, 1034, 1031, 1032, 0, 1032, 1034, 1031, 0, 0, 1032, 0, 1031, 1111, 1033, 1032, 1033, - 1111, 1113, 0, 1113, 1033, 1034, 1111, 1034, 1113, 1033, 1112, 0, 1034, 1113, 1112, 0, 1111, 1034, - 0, 0, 1112, 0, 0, 0, 1111, 1114, 0, 1114, 1111, 1113, 1112, 1113, 1114, 1115, 1111, 1115, - 1113, 1114, 1112, 1116, 1115, 1113, 1112, 1116, 1111, 1115, - - 0, 0, 1112, 1116, 1118, 0, 1118, 1114, 0, 1114, 0, 1118, 1112, 1116, 1114, 1115, 1118, 1115, - 0, 1114, 1117, 1116, 1115, 0, 1117, 1116, 1119, 1115, 1119, 0, 1117, 1116, 1118, 1119, 1118, 1117, - 0, 0, 1119, 1118, 1117, 1116, 0, 1120, 1118, 1120, 0, 0, 1117, 0, 1120, 0, 1117, 0, - 1119, 1120, 1119, 1121, 1117, 1121, 0, 1119, 0, 1117, 1121, 0, 1119, 0, 1117, 1121, 0, 1120, - 1122, 1120, 1122, 0, 0, 1124, 1120, 1122, 1122, 0, 0, 1120, 1122, 1121, 1124, 1121, 1124, 1123, - 1123, 1123, 1121, 1124, 0, 0, 1123, 1121, 1124, 0, - - 1122, 1123, 1122, 0, 0, 1124, 0, 1122, 1122, 0, 0, 0, 1122, 1125, 1124, 1125, 1124, 1123, - 1123, 1123, 1125, 1124, 0, 0, 1123, 1125, 1124, 0, 1126, 1123, 1126, 0, 1127, 0, 1127, 1126, - 1126, 1128, 0, 1127, 1126, 1125, 0, 1125, 1127, 0, 0, 1128, 1125, 1128, 0, 0, 0, 1125, - 1128, 0, 1126, 0, 1126, 1128, 1127, 0, 1127, 1126, 1126, 1128, 0, 1127, 1126, 1129, 0, 1129, - 1127, 0, 1130, 1128, 1129, 1128, 0, 0, 0, 1129, 1128, 1130, 1131, 1130, 1131, 1128, 0, 0, - 1130, 1131, 0, 0, 0, 1130, 1131, 1129, 1132, 1129, - - 1132, 0, 1130, 0, 1129, 1132, 0, 0, 0, 1129, 1132, 1130, 1131, 1130, 1131, 1133, 0, 1133, - 1130, 1131, 0, 0, 1133, 1130, 1131, 0, 1132, 1133, 1132, 1134, 0, 1134, 0, 1132, 0, 0, - 1134, 1137, 1132, 1137, 0, 1134, 1135, 1133, 1137, 1133, 1135, 0, 0, 1137, 1133, 0, 1135, 0, - 0, 1133, 1136, 1134, 0, 1134, 1136, 0, 1135, 0, 1134, 1137, 1136, 1137, 0, 1134, 1135, 1138, - 1137, 1138, 1135, 0, 1136, 1137, 1138, 1138, 1135, 0, 1139, 1138, 1136, 0, 1139, 0, 1136, 0, - 1135, 1140, 1139, 1140, 1136, 0, 0, 0, 1140, 1138, - - 0, 1138, 1139, 1140, 1136, 0, 1138, 1138, 0, 0, 1139, 1138, 0, 0, 1139, 1141, 1142, 1141, - 1142, 1140, 1139, 1140, 1141, 1142, 0, 0, 1140, 1141, 1142, 0, 1139, 1140, 0, 0, 0, 1143, - 0, 1143, 0, 0, 0, 0, 1143, 1141, 1142, 1141, 1142, 1143, 0, 0, 1141, 1142, 1144, 0, - 1144, 1141, 1142, 0, 0, 1144, 1145, 0, 1145, 1143, 1144, 1143, 1146, 1145, 1146, 0, 1143, 0, - 1145, 1146, 0, 1143, 0, 1147, 1146, 1147, 1144, 0, 1144, 1147, 1147, 0, 0, 1144, 1145, 1147, - 1145, 0, 1144, 1148, 1146, 1145, 1146, 1148, 0, 0, - - 1145, 1146, 0, 1148, 0, 1147, 1146, 1147, 0, 0, 1149, 1147, 1147, 1148, 1149, 0, 1150, 1147, - 1149, 1151, 1150, 1148, 0, 1151, 1149, 1148, 1150, 0, 1152, 1151, 1152, 1148, 0, 0, 1149, 1152, - 1150, 0, 1149, 1151, 1152, 1148, 1149, 1153, 1150, 1153, 1149, 1151, 1150, 0, 1153, 1151, 1149, 0, - 1150, 1153, 1152, 1151, 1152, 0, 0, 0, 1149, 1152, 1150, 0, 0, 1151, 1152, 0, 1154, 1153, - 1154, 1153, 1155, 0, 1155, 1154, 1153, 0, 0, 1155, 1154, 1153, 0, 1157, 1155, 1157, 1156, 0, - 0, 0, 1157, 0, 0, 0, 0, 1157, 1154, 1156, - - 1154, 1156, 1155, 0, 1155, 1154, 1156, 0, 0, 1155, 1154, 1156, 0, 1157, 1155, 1157, 1156, 0, - 1159, 0, 1157, 0, 1159, 0, 1158, 1157, 1158, 1156, 1159, 1156, 0, 1158, 1158, 1160, 1156, 0, - 1158, 1160, 1159, 1156, 0, 0, 0, 1160, 0, 0, 1159, 1161, 0, 0, 1159, 1161, 1158, 1160, - 1158, 0, 1159, 1161, 1162, 1158, 1158, 1160, 1162, 0, 1158, 1160, 1159, 1161, 1162, 0, 1163, 1160, - 1163, 0, 0, 1161, 0, 1163, 1162, 1161, 0, 1160, 1163, 0, 0, 1161, 1162, 1164, 0, 1164, - 1162, 0, 1165, 1166, 1164, 1161, 1162, 0, 1163, 1164, - - 1163, 1165, 1166, 1165, 1166, 1163, 1162, 0, 1165, 1166, 1163, 0, 0, 1165, 1166, 1164, 1167, 1164, - 1167, 0, 1165, 1166, 1164, 1167, 0, 0, 0, 1164, 1167, 1165, 1166, 1165, 1166, 1168, 0, 1168, - 1165, 1166, 0, 0, 1168, 1165, 1166, 0, 1167, 1168, 1167, 1169, 1170, 1169, 1170, 1167, 0, 0, - 1169, 1170, 1167, 0, 0, 1169, 1170, 1168, 1171, 1168, 1171, 0, 0, 0, 1168, 1171, 0, 0, - 0, 1168, 1171, 1169, 1170, 1169, 1170, 1172, 0, 1172, 1169, 1170, 0, 1174, 1172, 1169, 1170, 0, - 1171, 1172, 1171, 1173, 0, 1173, 1174, 1171, 1174, 1175, - - 1173, 0, 1171, 1174, 0, 1173, 0, 1172, 1174, 1172, 1175, 0, 1175, 1174, 1172, 0, 0, 1175, - 0, 1172, 0, 1173, 1175, 1173, 1174, 0, 1174, 1175, 1173, 0, 1176, 1174, 0, 1173, 0, 1177, - 1174, 1177, 1175, 1176, 1175, 1176, 1177, 1177, 1178, 1175, 1176, 1177, 0, 0, 1175, 1176, 1178, 0, - 1178, 0, 0, 0, 1176, 1178, 0, 0, 0, 1177, 1178, 1177, 1179, 1176, 1179, 1176, 1177, 1177, - 1178, 1179, 1176, 1177, 0, 0, 1179, 1176, 1178, 1180, 1178, 1180, 0, 0, 0, 1178, 1180, 0, - 0, 0, 1178, 1180, 1179, 1181, 1179, 1181, 1182, 0, - - 1182, 1179, 1181, 0, 0, 1182, 1179, 1181, 0, 1180, 1182, 1180, 1183, 0, 1183, 1184, 1180, 1184, - 1183, 1183, 0, 1180, 1184, 1181, 1183, 1181, 1182, 1184, 1182, 1232, 1181, 1232, 1233, 1182, 1233, 1181, - 1232, 0, 1182, 1233, 1183, 1232, 1183, 1184, 1233, 1184, 1183, 1183, 0, 1234, 1184, 1234, 1183, 0, - 0, 1184, 1234, 1232, 0, 1232, 1233, 1234, 1233, 1235, 1232, 1235, 0, 1233, 0, 1232, 1235, 0, - 1233, 0, 0, 1235, 1236, 1234, 0, 1234, 1236, 0, 1239, 1239, 1234, 0, 1236, 0, 0, 1234, - 1237, 1235, 0, 1235, 1237, 1238, 1236, 0, 1235, 1238, - - 1237, 0, 0, 1235, 1236, 1238, 0, 0, 1236, 1239, 1237, 0, 0, 1239, 1236, 1238, 1240, 0, - 1237, 1239, 1240, 0, 1237, 1238, 1236, 0, 1240, 1238, 1237, 1239, 1242, 1241, 0, 1238, 1242, 1241, - 1240, 1239, 1237, 1241, 1242, 1239, 0, 1238, 1240, 1241, 0, 1239, 1240, 0, 1242, 0, 0, 0, - 1240, 1241, 1243, 1239, 1242, 1241, 1243, 1244, 1242, 1241, 1240, 1244, 1243, 1241, 1242, 0, 1245, 1244, - 0, 1241, 1245, 0, 1243, 0, 1242, 0, 1245, 1244, 0, 1241, 1243, 1245, 0, 1247, 1243, 1244, - 1245, 1247, 0, 1244, 1243, 0, 1248, 1247, 1245, 1244, - - 1248, 1246, 1245, 1246, 1243, 1246, 1248, 1247, 1245, 1244, 1249, 1246, 0, 1245, 1249, 1247, 1248, 0, - 1245, 1247, 1249, 1246, 0, 0, 1248, 1247, 0, 0, 1248, 1246, 1249, 1246, 0, 1246, 1248, 1247, - 0, 0, 1249, 1246, 0, 0, 1249, 1250, 1248, 1250, 0, 0, 1249, 1246, 1250, 0, 1251, 0, - 1251, 1250, 0, 0, 1249, 1251, 1252, 0, 1252, 0, 1251, 1253, 0, 1252, 0, 0, 0, 1250, - 1252, 1250, 1253, 0, 1253, 1254, 1250, 1254, 1251, 1253, 1251, 1250, 1254, 0, 1253, 1251, 1252, 1254, - 1252, 0, 1251, 1253, 1255, 1252, 1255, 0, 0, 0, - - 1252, 1255, 1253, 0, 1253, 1254, 1255, 1254, 1256, 1253, 1256, 0, 1254, 0, 1253, 1256, 0, 1254, - 0, 1257, 1256, 1257, 1255, 0, 1255, 1257, 1257, 0, 0, 1255, 0, 1257, 0, 0, 1255, 1258, - 1256, 0, 1256, 1258, 1259, 0, 0, 1256, 1259, 1258, 0, 1257, 1256, 1257, 1259, 0, 0, 1257, - 1257, 1258, 0, 0, 0, 1257, 1259, 0, 1260, 1258, 1260, 0, 0, 1258, 1259, 1260, 0, 0, - 1259, 1258, 1260, 1261, 0, 1261, 1259, 1262, 0, 1262, 1261, 1258, 0, 1263, 1262, 1261, 1259, 0, - 1260, 1262, 1260, 0, 1263, 0, 1263, 1260, 0, 0, - - 0, 1263, 1260, 1261, 0, 1261, 1263, 1262, 0, 1262, 1261, 0, 0, 1263, 1262, 1261, 0, 0, - 1264, 1262, 1264, 0, 1263, 0, 1263, 1264, 1264, 0, 0, 1263, 1264, 0, 1265, 1265, 1263, 1265, - 0, 1266, 0, 1266, 1265, 0, 0, 0, 1266, 1265, 1264, 0, 1264, 1266, 1267, 0, 1267, 1264, - 1264, 0, 0, 1267, 1264, 0, 1265, 1265, 1267, 1265, 0, 1266, 0, 1266, 1265, 0, 0, 0, - 1266, 1265, 1268, 0, 1268, 1266, 1267, 0, 1267, 1268, 1268, 0, 0, 1267, 1268, 1269, 0, 1269, - 1267, 1270, 0, 1270, 1269, 0, 0, 1270, 1270, 1269, - - 0, 0, 1268, 1270, 1268, 0, 1271, 1271, 1271, 1268, 1268, 0, 0, 1271, 1268, 1269, 0, 1269, - 1271, 1270, 0, 1270, 1269, 0, 0, 1270, 1270, 1269, 0, 1273, 1272, 1270, 1272, 1273, 1271, 1271, - 1271, 1272, 1272, 1273, 0, 1271, 1272, 1274, 1275, 0, 1271, 1274, 1275, 1273, 0, 0, 0, 1274, - 1275, 0, 0, 1273, 1272, 0, 1272, 1273, 0, 1274, 1275, 1272, 1272, 1273, 0, 1276, 1272, 1274, - 1275, 1276, 1302, 1274, 1275, 1273, 1302, 1276, 0, 1274, 1275, 1314, 1302, 1314, 0, 1302, 0, 1276, - 1314, 1274, 1275, 0, 1302, 1314, 0, 1276, 0, 1304, - - 0, 1276, 1302, 1304, 0, 0, 1302, 1276, 0, 1304, 1305, 1314, 1302, 1314, 1305, 1302, 0, 1276, - 1314, 1304, 1305, 0, 1302, 1314, 1306, 1305, 0, 1304, 1306, 1307, 1305, 1304, 0, 1307, 1306, 0, - 0, 1304, 1305, 1307, 0, 0, 1305, 0, 1306, 0, 0, 1304, 1305, 1307, 1308, 0, 1306, 1305, - 1308, 0, 1306, 1307, 1305, 0, 1308, 1307, 1306, 0, 1309, 1310, 1309, 1307, 1309, 1310, 1308, 0, - 1306, 0, 1309, 1310, 0, 1307, 1308, 1311, 1310, 0, 1308, 1311, 1309, 1310, 0, 0, 1308, 1311, - 0, 0, 1309, 1310, 1309, 0, 1309, 1310, 1308, 1311, - - 1312, 0, 1309, 1310, 1312, 1313, 0, 1311, 1310, 1313, 1312, 1311, 1309, 1310, 1315, 1313, 0, 1311, - 1313, 1315, 1312, 1315, 0, 0, 0, 1313, 1315, 1311, 1312, 0, 1316, 1315, 1312, 1313, 1316, 1317, - 0, 1313, 1312, 1317, 1316, 0, 1315, 1313, 0, 1317, 1313, 1315, 1312, 1315, 1316, 0, 0, 1313, - 1315, 1317, 1318, 0, 1316, 1315, 1318, 1319, 1316, 1317, 0, 1319, 1318, 1317, 1316, 0, 1320, 1319, - 0, 1317, 1320, 1321, 1318, 0, 1316, 1321, 1320, 1319, 0, 1317, 1318, 1321, 1321, 0, 1318, 1319, - 1320, 0, 0, 1319, 1318, 1321, 1322, 0, 1320, 1319, - - 1322, 1323, 1320, 1321, 1318, 1323, 1322, 1321, 1320, 1319, 0, 1323, 0, 1321, 1321, 0, 1322, 0, - 1320, 0, 0, 1323, 0, 1321, 1322, 1324, 1324, 1342, 1322, 1323, 1324, 1342, 0, 1323, 1322, 0, - 1324, 1342, 0, 1323, 1340, 1340, 0, 0, 1322, 0, 1324, 1342, 0, 1323, 0, 0, 1343, 1324, - 1324, 1342, 1343, 0, 1324, 1342, 0, 1345, 1343, 1345, 1324, 1342, 1344, 1340, 1345, 0, 1344, 1340, - 1343, 1345, 1324, 1342, 1344, 1340, 0, 0, 1343, 1346, 0, 1346, 1343, 0, 1344, 1340, 1346, 1345, - 1343, 1345, 0, 1346, 1344, 1340, 1345, 0, 1344, 1340, - - 1343, 1345, 0, 0, 1344, 1340, 1347, 0, 1347, 1346, 1348, 1346, 1348, 1347, 1344, 1340, 1346, 1348, - 1347, 0, 0, 1346, 1348, 1349, 0, 1349, 0, 0, 0, 0, 1349, 0, 0, 0, 1347, 1349, - 1347, 1350, 1348, 1350, 1348, 1347, 0, 0, 1350, 1348, 1347, 0, 0, 1350, 1348, 1349, 0, 1349, - 0, 0, 1351, 0, 1349, 0, 1351, 0, 0, 1349, 0, 1350, 1351, 1350, 0, 1352, 1363, 1364, - 1350, 1352, 1363, 1364, 1351, 1350, 0, 1352, 1363, 1364, 0, 0, 1351, 0, 0, 0, 1351, 1352, - 1363, 1364, 0, 0, 1351, 0, 1365, 1352, 1363, 1364, - - 1365, 1352, 1363, 1364, 1351, 0, 1365, 1352, 1363, 1364, 0, 0, 0, 1366, 0, 1366, 1365, 1352, - 1363, 1364, 1366, 0, 0, 0, 1365, 1366, 0, 0, 1365, 0, 1374, 0, 1374, 0, 1365, 0, - 0, 1374, 0, 0, 0, 1366, 1374, 1366, 1365, 0, 0, 0, 1366, 0, 0, 0, 0, 1366, - 0, 0, 0, 0, 1374, 0, 1374, 0, 0, 0, 0, 1374, 0, 0, 0, 0, 1374, 1406, - 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1407, 0, 0, 1407, 1407, 1407, 1407, 1407, 1407, - 1407, 1408, 1408, 0, 1408, 1409, 1409, 1409, 1410, 0, - - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1411, 1411, 1411, 0, 1411, 1411, 1411, 1411, 1411, 1411, 1412, - 0, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1413, 0, 1413, 1413, 1413, 1413, 1413, 1413, 1413, - 1413, 1414, 0, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1415, 0, 1415, 1415, 1415, 1415, 1415, - 1415, 1415, 1415, 1416, 0, 1416, 1417, 0, 1417, 1418, 0, 1418, 1419, 0, 1419, 1420, 0, 1420, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, - 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -#line 1 "flex_lexer.l" -/** - * lexer - * - * - */ -/*************************** - ** Section 1: Definitions - ***************************/ -#line 12 "flex_lexer.l" - -#include -#include -#include -#include "../sql/Expr.h" -#include "bison_parser.h" - -#define TOKEN(name) \ - { \ - return SQL_##name; \ - } - -static thread_local std::stringstream strbuf; - -#line 3180 "flex_lexer.cpp" - -/*************************** - ** Section 2: Rules - ***************************/ -/* Define the output files */ -/* Make reentrant */ -/* performance tweeks */ -/* other flags */ -/* %option nodefault */ - -/*************************** - ** Section 3: Rules - ***************************/ -#line 3194 "flex_lexer.cpp" - -#define INITIAL 0 -#define singlequotedstring 1 -#define COMMENT 2 - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void* -#endif - -/* Holds the entire state of the reentrant scanner. */ -struct yyguts_t { - /* User-defined. Not touched by flex. */ - YY_EXTRA_TYPE yyextra_r; - - /* The rest are the same as the globals declared in the non-reentrant scanner. */ - FILE *yyin_r, *yyout_r; - size_t yy_buffer_stack_top; /**< index of top of stack. */ - size_t yy_buffer_stack_max; /**< capacity of stack. */ - YY_BUFFER_STATE* yy_buffer_stack; /**< Stack as an array. */ - char yy_hold_char; - int yy_n_chars; - int yyleng_r; - char* yy_c_buf_p; - int yy_init; - int yy_start; - int yy_did_buffer_switch_on_eof; - int yy_start_stack_ptr; - int yy_start_stack_depth; - int* yy_start_stack; - yy_state_type yy_last_accepting_state; - char* yy_last_accepting_cpos; - - int yylineno_r; - int yy_flex_debug_r; - - char* yytext_r; - int yy_more_flag; - int yy_more_len; - - YYSTYPE* yylval_r; - - YYLTYPE* yylloc_r; - -}; /* end struct yyguts_t */ - -static int yy_init_globals(yyscan_t yyscanner); - -/* This must go here because YYSTYPE and YYLTYPE are included - * from bison output in section 1.*/ -#define yylval yyg->yylval_r - -#define yylloc yyg->yylloc_r - -int yylex_init(yyscan_t* scanner); - -int yylex_init_extra(YY_EXTRA_TYPE user_defined, yyscan_t* scanner); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy(yyscan_t yyscanner); - -int yyget_debug(yyscan_t yyscanner); - -void yyset_debug(int debug_flag, yyscan_t yyscanner); - -YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner); - -void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner); - -FILE* yyget_in(yyscan_t yyscanner); - -void yyset_in(FILE* _in_str, yyscan_t yyscanner); - -FILE* yyget_out(yyscan_t yyscanner); - -void yyset_out(FILE* _out_str, yyscan_t yyscanner); - -int yyget_leng(yyscan_t yyscanner); - -char* yyget_text(yyscan_t yyscanner); - -int yyget_lineno(yyscan_t yyscanner); - -void yyset_lineno(int _line_number, yyscan_t yyscanner); - -int yyget_column(yyscan_t yyscanner); - -void yyset_column(int _column_no, yyscan_t yyscanner); - -YYSTYPE* yyget_lval(yyscan_t yyscanner); - -void yyset_lval(YYSTYPE* yylval_param, yyscan_t yyscanner); - -YYLTYPE* yyget_lloc(yyscan_t yyscanner); - -void yyset_lloc(YYLTYPE* yylloc_param, yyscan_t yyscanner); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap(yyscan_t yyscanner); -#else -extern int yywrap(yyscan_t yyscanner); -#endif -#endif - -#ifndef YY_NO_UNPUT - -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy(char*, const char*, int, yyscan_t yyscanner); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen(const char*, yyscan_t yyscanner); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput(yyscan_t yyscanner); -#else -static int input(yyscan_t yyscanner); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO \ - do { \ - if (fwrite(yytext, (size_t)yyleng, 1, yyout)) { \ - } \ - } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf, result, max_size) \ - if (YY_CURRENT_BUFFER_LVALUE->yy_is_interactive) { \ - int c = '*'; \ - int n; \ - for (n = 0; n < max_size && (c = getc(yyin)) != EOF && c != '\n'; ++n) buf[n] = (char)c; \ - if (c == '\n') buf[n++] = (char)c; \ - if (c == EOF && ferror(yyin)) YY_FATAL_ERROR("input in flex scanner failed"); \ - result = n; \ - } else { \ - errno = 0; \ - while ((result = (int)fread(buf, 1, (yy_size_t)max_size, yyin)) == 0 && ferror(yyin)) { \ - if (errno != EINTR) { \ - YY_FATAL_ERROR("input in flex scanner failed"); \ - break; \ - } \ - errno = 0; \ - clearerr(yyin); \ - } \ - } - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error(msg, yyscanner) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner); - -#define YY_DECL int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK /*LINTED*/ break; -#endif - -#define YY_RULE_SETUP YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL { - yy_state_type yy_current_state; - char *yy_cp, *yy_bp; - int yy_act; - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - yylval = yylval_param; - - yylloc = yylloc_param; - - if (!yyg->yy_init) { - yyg->yy_init = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if (!yyg->yy_start) yyg->yy_start = 1; /* first start state */ - - if (!yyin) yyin = stdin; - - if (!yyout) yyout = stdout; - - if (!YY_CURRENT_BUFFER) { - yyensure_buffer_stack(yyscanner); - YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); - } - - yy_load_buffer_state(yyscanner); - } - - { -#line 57 "flex_lexer.l" - -#line 3481 "flex_lexer.cpp" - - while (/*CONSTCOND*/ 1) /* loops until end-of-file is reached */ - { - yy_cp = yyg->yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yyg->yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yyg->yy_start; - yy_match: - do { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if (yy_accept[yy_current_state]) { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { - yy_current_state = (int)yy_def[yy_current_state]; - if (yy_current_state >= 1406) yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - ++yy_cp; - } while (yy_current_state != 1405); - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - - yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - - do_action: /* This label is used only to access EOF actions. */ - - switch (yy_act) { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yyg->yy_hold_char; - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - - case 1: - YY_RULE_SETUP -#line 59 "flex_lexer.l" - BEGIN(COMMENT); - YY_BREAK - case 2: - YY_RULE_SETUP -#line 60 "flex_lexer.l" - /* skipping comment content until a end of line is read */; - YY_BREAK - case 3: - /* rule 3 can match eol */ - YY_RULE_SETUP -#line 61 "flex_lexer.l" - BEGIN(INITIAL); - YY_BREAK - case 4: - /* rule 4 can match eol */ - YY_RULE_SETUP -#line 63 "flex_lexer.l" - /* skip whitespace */; - YY_BREAK - case 5: - YY_RULE_SETUP -#line 65 "flex_lexer.l" - TOKEN(ADD) - YY_BREAK - case 6: - YY_RULE_SETUP -#line 66 "flex_lexer.l" - TOKEN(AFTER) - YY_BREAK - case 7: - YY_RULE_SETUP -#line 67 "flex_lexer.l" - TOKEN(ALL) - YY_BREAK - case 8: - YY_RULE_SETUP -#line 68 "flex_lexer.l" - TOKEN(ALTER) - YY_BREAK - case 9: - YY_RULE_SETUP -#line 69 "flex_lexer.l" - TOKEN(ANALYZE) - YY_BREAK - case 10: - YY_RULE_SETUP -#line 70 "flex_lexer.l" - TOKEN(AND) - YY_BREAK - case 11: - YY_RULE_SETUP -#line 71 "flex_lexer.l" - TOKEN(ARRAY) - YY_BREAK - case 12: - YY_RULE_SETUP -#line 72 "flex_lexer.l" - TOKEN(AS) - YY_BREAK - case 13: - YY_RULE_SETUP -#line 73 "flex_lexer.l" - TOKEN(ASC) - YY_BREAK - case 14: - YY_RULE_SETUP -#line 74 "flex_lexer.l" - TOKEN(BEFORE) - YY_BREAK - case 15: - YY_RULE_SETUP -#line 75 "flex_lexer.l" - TOKEN(BEGIN) - YY_BREAK - case 16: - YY_RULE_SETUP -#line 76 "flex_lexer.l" - TOKEN(BETWEEN) - YY_BREAK - case 17: - YY_RULE_SETUP -#line 77 "flex_lexer.l" - TOKEN(BIGINT) - YY_BREAK - case 18: - YY_RULE_SETUP -#line 78 "flex_lexer.l" - TOKEN(BOOLEAN) - YY_BREAK - case 19: - YY_RULE_SETUP -#line 79 "flex_lexer.l" - TOKEN(BY) - YY_BREAK - case 20: - YY_RULE_SETUP -#line 80 "flex_lexer.l" - TOKEN(CALL) - YY_BREAK - case 21: - YY_RULE_SETUP -#line 81 "flex_lexer.l" - TOKEN(CASCADE) - YY_BREAK - case 22: - YY_RULE_SETUP -#line 82 "flex_lexer.l" - TOKEN(CASE) - YY_BREAK - case 23: - YY_RULE_SETUP -#line 83 "flex_lexer.l" - TOKEN(CAST) - YY_BREAK - case 24: - YY_RULE_SETUP -#line 84 "flex_lexer.l" - TOKEN(CHAR) - YY_BREAK - case 25: - YY_RULE_SETUP -#line 85 "flex_lexer.l" - TOKEN(COLUMN) - YY_BREAK - case 26: - YY_RULE_SETUP -#line 86 "flex_lexer.l" - TOKEN(COLUMNS) - YY_BREAK - case 27: - YY_RULE_SETUP -#line 87 "flex_lexer.l" - TOKEN(COMMIT) - YY_BREAK - case 28: - YY_RULE_SETUP -#line 88 "flex_lexer.l" - TOKEN(CONTROL) - YY_BREAK - case 29: - YY_RULE_SETUP -#line 89 "flex_lexer.l" - TOKEN(COPY) - YY_BREAK - case 30: - YY_RULE_SETUP -#line 90 "flex_lexer.l" - TOKEN(CREATE) - YY_BREAK - case 31: - YY_RULE_SETUP -#line 91 "flex_lexer.l" - TOKEN(CROSS) - YY_BREAK - case 32: - YY_RULE_SETUP -#line 92 "flex_lexer.l" - TOKEN(DATE) - YY_BREAK - case 33: - YY_RULE_SETUP -#line 93 "flex_lexer.l" - TOKEN(DATETIME) - YY_BREAK - case 34: - YY_RULE_SETUP -#line 94 "flex_lexer.l" - TOKEN(DAY) - YY_BREAK - case 35: - YY_RULE_SETUP -#line 95 "flex_lexer.l" - TOKEN(DAYS) - YY_BREAK - case 36: - YY_RULE_SETUP -#line 96 "flex_lexer.l" - TOKEN(DEALLOCATE) - YY_BREAK - case 37: - YY_RULE_SETUP -#line 97 "flex_lexer.l" - TOKEN(DECIMAL) - YY_BREAK - case 38: - YY_RULE_SETUP -#line 98 "flex_lexer.l" - TOKEN(DEFAULT) - YY_BREAK - case 39: - YY_RULE_SETUP -#line 99 "flex_lexer.l" - TOKEN(DELETE) - YY_BREAK - case 40: - YY_RULE_SETUP -#line 100 "flex_lexer.l" - TOKEN(DELTA) - YY_BREAK - case 41: - YY_RULE_SETUP -#line 101 "flex_lexer.l" - TOKEN(DESC) - YY_BREAK - case 42: - YY_RULE_SETUP -#line 102 "flex_lexer.l" - TOKEN(DESCRIBE) - YY_BREAK - case 43: - YY_RULE_SETUP -#line 103 "flex_lexer.l" - TOKEN(DIRECT) - YY_BREAK - case 44: - YY_RULE_SETUP -#line 104 "flex_lexer.l" - TOKEN(DISTINCT) - YY_BREAK - case 45: - YY_RULE_SETUP -#line 105 "flex_lexer.l" - TOKEN(DIV) - YY_BREAK - case 46: - YY_RULE_SETUP -#line 106 "flex_lexer.l" - TOKEN(DOUBLE) - YY_BREAK - case 47: - YY_RULE_SETUP -#line 107 "flex_lexer.l" - TOKEN(DROP) - YY_BREAK - case 48: - YY_RULE_SETUP -#line 108 "flex_lexer.l" - TOKEN(ELSE) - YY_BREAK - case 49: - YY_RULE_SETUP -#line 109 "flex_lexer.l" - TOKEN(ENCODING) - YY_BREAK - case 50: - YY_RULE_SETUP -#line 110 "flex_lexer.l" - TOKEN(END) - YY_BREAK - case 51: - YY_RULE_SETUP -#line 111 "flex_lexer.l" - TOKEN(ESCAPE) - YY_BREAK - case 52: - YY_RULE_SETUP -#line 112 "flex_lexer.l" - TOKEN(EXCEPT) - YY_BREAK - case 53: - YY_RULE_SETUP -#line 113 "flex_lexer.l" - TOKEN(EXECUTE) - YY_BREAK - case 54: - YY_RULE_SETUP -#line 114 "flex_lexer.l" - TOKEN(EXISTS) - YY_BREAK - case 55: - YY_RULE_SETUP -#line 115 "flex_lexer.l" - TOKEN(EXPLAIN) - YY_BREAK - case 56: - YY_RULE_SETUP -#line 116 "flex_lexer.l" - TOKEN(EXTRACT) - YY_BREAK - case 57: - YY_RULE_SETUP -#line 117 "flex_lexer.l" - TOKEN(FALSE) - YY_BREAK - case 58: - YY_RULE_SETUP -#line 118 "flex_lexer.l" - TOKEN(FILE) - YY_BREAK - case 59: - YY_RULE_SETUP -#line 119 "flex_lexer.l" - TOKEN(FLOAT) - YY_BREAK - case 60: - YY_RULE_SETUP -#line 120 "flex_lexer.l" - TOKEN(FOLLOWING) - YY_BREAK - case 61: - YY_RULE_SETUP -#line 121 "flex_lexer.l" - TOKEN(FOR) - YY_BREAK - case 62: - YY_RULE_SETUP -#line 122 "flex_lexer.l" - TOKEN(FOREIGN) - YY_BREAK - case 63: - YY_RULE_SETUP -#line 123 "flex_lexer.l" - TOKEN(FORMAT) - YY_BREAK - case 64: - YY_RULE_SETUP -#line 124 "flex_lexer.l" - TOKEN(FROM) - YY_BREAK - case 65: - YY_RULE_SETUP -#line 125 "flex_lexer.l" - TOKEN(FULL) - YY_BREAK - case 66: - YY_RULE_SETUP -#line 126 "flex_lexer.l" - TOKEN(GLOBAL) - YY_BREAK - case 67: - YY_RULE_SETUP -#line 127 "flex_lexer.l" - TOKEN(GROUP) - YY_BREAK - case 68: - YY_RULE_SETUP -#line 128 "flex_lexer.l" - TOKEN(GROUPS) - YY_BREAK - case 69: - YY_RULE_SETUP -#line 129 "flex_lexer.l" - TOKEN(HASH) - YY_BREAK - case 70: - YY_RULE_SETUP -#line 130 "flex_lexer.l" - TOKEN(HAVING) - YY_BREAK - case 71: - YY_RULE_SETUP -#line 131 "flex_lexer.l" - TOKEN(HINT) - YY_BREAK - case 72: - YY_RULE_SETUP -#line 132 "flex_lexer.l" - TOKEN(HOUR) - YY_BREAK - case 73: - YY_RULE_SETUP -#line 133 "flex_lexer.l" - TOKEN(HOURS) - YY_BREAK - case 74: - YY_RULE_SETUP -#line 134 "flex_lexer.l" - TOKEN(IF) - YY_BREAK - case 75: - YY_RULE_SETUP -#line 135 "flex_lexer.l" - TOKEN(ILIKE) - YY_BREAK - case 76: - YY_RULE_SETUP -#line 136 "flex_lexer.l" - TOKEN(IMPORT) - YY_BREAK - case 77: - YY_RULE_SETUP -#line 137 "flex_lexer.l" - TOKEN(IN) - YY_BREAK - case 78: - YY_RULE_SETUP -#line 138 "flex_lexer.l" - TOKEN(INDEX) - YY_BREAK - case 79: - YY_RULE_SETUP -#line 139 "flex_lexer.l" - TOKEN(INNER) - YY_BREAK - case 80: - YY_RULE_SETUP -#line 140 "flex_lexer.l" - TOKEN(INSERT) - YY_BREAK - case 81: - YY_RULE_SETUP -#line 141 "flex_lexer.l" - TOKEN(INT) - YY_BREAK - case 82: - YY_RULE_SETUP -#line 142 "flex_lexer.l" - TOKEN(INTEGER) - YY_BREAK - case 83: - YY_RULE_SETUP -#line 143 "flex_lexer.l" - TOKEN(INTERSECT) - YY_BREAK - case 84: - YY_RULE_SETUP -#line 144 "flex_lexer.l" - TOKEN(INTERVAL) - YY_BREAK - case 85: - YY_RULE_SETUP -#line 145 "flex_lexer.l" - TOKEN(INTO) - YY_BREAK - case 86: - YY_RULE_SETUP -#line 146 "flex_lexer.l" - TOKEN(IS) - YY_BREAK - case 87: - YY_RULE_SETUP -#line 147 "flex_lexer.l" - TOKEN(ISNULL) - YY_BREAK - case 88: - YY_RULE_SETUP -#line 148 "flex_lexer.l" - TOKEN(JOIN) - YY_BREAK - case 89: - YY_RULE_SETUP -#line 149 "flex_lexer.l" - TOKEN(KEY) - YY_BREAK - case 90: - YY_RULE_SETUP -#line 150 "flex_lexer.l" - TOKEN(LEFT) - YY_BREAK - case 91: - YY_RULE_SETUP -#line 151 "flex_lexer.l" - TOKEN(LIKE) - YY_BREAK - case 92: - YY_RULE_SETUP -#line 152 "flex_lexer.l" - TOKEN(LIMIT) - YY_BREAK - case 93: - YY_RULE_SETUP -#line 153 "flex_lexer.l" - TOKEN(LOAD) - YY_BREAK - case 94: - YY_RULE_SETUP -#line 154 "flex_lexer.l" - TOKEN(LOCAL) - YY_BREAK - case 95: - YY_RULE_SETUP -#line 155 "flex_lexer.l" - TOKEN(LOCKED) - YY_BREAK - case 96: - YY_RULE_SETUP -#line 156 "flex_lexer.l" - TOKEN(LONG) - YY_BREAK - case 97: - YY_RULE_SETUP -#line 157 "flex_lexer.l" - TOKEN(MERGE) - YY_BREAK - case 98: - YY_RULE_SETUP -#line 158 "flex_lexer.l" - TOKEN(MINUS) - YY_BREAK - case 99: - YY_RULE_SETUP -#line 159 "flex_lexer.l" - TOKEN(MINUTE) - YY_BREAK - case 100: - YY_RULE_SETUP -#line 160 "flex_lexer.l" - TOKEN(MINUTES) - YY_BREAK - case 101: - YY_RULE_SETUP -#line 161 "flex_lexer.l" - TOKEN(MOD) - YY_BREAK - case 102: - YY_RULE_SETUP -#line 162 "flex_lexer.l" - TOKEN(MONTH) - YY_BREAK - case 103: - YY_RULE_SETUP -#line 163 "flex_lexer.l" - TOKEN(MONTHS) - YY_BREAK - case 104: - YY_RULE_SETUP -#line 164 "flex_lexer.l" - TOKEN(NATURAL) - YY_BREAK - case 105: - YY_RULE_SETUP -#line 165 "flex_lexer.l" - TOKEN(NO) - YY_BREAK - case 106: - YY_RULE_SETUP -#line 166 "flex_lexer.l" - TOKEN(NOT) - YY_BREAK - case 107: - YY_RULE_SETUP -#line 167 "flex_lexer.l" - TOKEN(NOWAIT) - YY_BREAK - case 108: - YY_RULE_SETUP -#line 168 "flex_lexer.l" - TOKEN(NULL) - YY_BREAK - case 109: - YY_RULE_SETUP -#line 169 "flex_lexer.l" - TOKEN(NVARCHAR) - YY_BREAK - case 110: - YY_RULE_SETUP -#line 170 "flex_lexer.l" - TOKEN(OF) - YY_BREAK - case 111: - YY_RULE_SETUP -#line 171 "flex_lexer.l" - TOKEN(OFF) - YY_BREAK - case 112: - YY_RULE_SETUP -#line 172 "flex_lexer.l" - TOKEN(OFFSET) - YY_BREAK - case 113: - YY_RULE_SETUP -#line 173 "flex_lexer.l" - TOKEN(ON) - YY_BREAK - case 114: - YY_RULE_SETUP -#line 174 "flex_lexer.l" - TOKEN(OR) - YY_BREAK - case 115: - YY_RULE_SETUP -#line 175 "flex_lexer.l" - TOKEN(ORDER) - YY_BREAK - case 116: - YY_RULE_SETUP -#line 176 "flex_lexer.l" - TOKEN(OUTER) - YY_BREAK - case 117: - YY_RULE_SETUP -#line 177 "flex_lexer.l" - TOKEN(OVER) - YY_BREAK - case 118: - YY_RULE_SETUP -#line 178 "flex_lexer.l" - TOKEN(PARAMETERS) - YY_BREAK - case 119: - YY_RULE_SETUP -#line 179 "flex_lexer.l" - TOKEN(PARTITION) - YY_BREAK - case 120: - YY_RULE_SETUP -#line 180 "flex_lexer.l" - TOKEN(PLAN) - YY_BREAK - case 121: - YY_RULE_SETUP -#line 181 "flex_lexer.l" - TOKEN(PRECEDING) - YY_BREAK - case 122: - YY_RULE_SETUP -#line 182 "flex_lexer.l" - TOKEN(PREPARE) - YY_BREAK - case 123: - YY_RULE_SETUP -#line 183 "flex_lexer.l" - TOKEN(PRIMARY) - YY_BREAK - case 124: - YY_RULE_SETUP -#line 184 "flex_lexer.l" - TOKEN(RANGE) - YY_BREAK - case 125: - YY_RULE_SETUP -#line 185 "flex_lexer.l" - TOKEN(REAL) - YY_BREAK - case 126: - YY_RULE_SETUP -#line 186 "flex_lexer.l" - TOKEN(REFERENCES) - YY_BREAK - case 127: - YY_RULE_SETUP -#line 187 "flex_lexer.l" - TOKEN(RENAME) - YY_BREAK - case 128: - YY_RULE_SETUP -#line 188 "flex_lexer.l" - TOKEN(RESTRICT) - YY_BREAK - case 129: - YY_RULE_SETUP -#line 189 "flex_lexer.l" - TOKEN(RIGHT) - YY_BREAK - case 130: - YY_RULE_SETUP -#line 190 "flex_lexer.l" - TOKEN(ROLLBACK) - YY_BREAK - case 131: - YY_RULE_SETUP -#line 191 "flex_lexer.l" - TOKEN(ROWS) - YY_BREAK - case 132: - YY_RULE_SETUP -#line 192 "flex_lexer.l" - TOKEN(SCHEMA) - YY_BREAK - case 133: - YY_RULE_SETUP -#line 193 "flex_lexer.l" - TOKEN(SCHEMAS) - YY_BREAK - case 134: - YY_RULE_SETUP -#line 194 "flex_lexer.l" - TOKEN(SECOND) - YY_BREAK - case 135: - YY_RULE_SETUP -#line 195 "flex_lexer.l" - TOKEN(SECONDS) - YY_BREAK - case 136: - YY_RULE_SETUP -#line 196 "flex_lexer.l" - TOKEN(SELECT) - YY_BREAK - case 137: - YY_RULE_SETUP -#line 197 "flex_lexer.l" - TOKEN(SET) - YY_BREAK - case 138: - YY_RULE_SETUP -#line 198 "flex_lexer.l" - TOKEN(SHARE) - YY_BREAK - case 139: - YY_RULE_SETUP -#line 199 "flex_lexer.l" - TOKEN(SHOW) - YY_BREAK - case 140: - YY_RULE_SETUP -#line 200 "flex_lexer.l" - TOKEN(SKIP) - YY_BREAK - case 141: - YY_RULE_SETUP -#line 201 "flex_lexer.l" - TOKEN(SMALLINT) - YY_BREAK - case 142: - YY_RULE_SETUP -#line 202 "flex_lexer.l" - TOKEN(SORTED) - YY_BREAK - case 143: - YY_RULE_SETUP -#line 203 "flex_lexer.l" - TOKEN(SPATIAL) - YY_BREAK - case 144: - YY_RULE_SETUP -#line 204 "flex_lexer.l" - TOKEN(TABLE) - YY_BREAK - case 145: - YY_RULE_SETUP -#line 205 "flex_lexer.l" - TOKEN(TABLES) - YY_BREAK - case 146: - YY_RULE_SETUP -#line 206 "flex_lexer.l" - TOKEN(TEMPORARY) - YY_BREAK - case 147: - YY_RULE_SETUP -#line 207 "flex_lexer.l" - TOKEN(TEXT) - YY_BREAK - case 148: - YY_RULE_SETUP -#line 208 "flex_lexer.l" - TOKEN(THEN) - YY_BREAK - case 149: - YY_RULE_SETUP -#line 209 "flex_lexer.l" - TOKEN(TIME) - YY_BREAK - case 150: - YY_RULE_SETUP -#line 210 "flex_lexer.l" - TOKEN(TIMESTAMP) - YY_BREAK - case 151: - YY_RULE_SETUP -#line 211 "flex_lexer.l" - TOKEN(TO) - YY_BREAK - case 152: - YY_RULE_SETUP -#line 212 "flex_lexer.l" - TOKEN(TOP) - YY_BREAK - case 153: - YY_RULE_SETUP -#line 213 "flex_lexer.l" - TOKEN(TRANSACTION) - YY_BREAK - case 154: - YY_RULE_SETUP -#line 214 "flex_lexer.l" - TOKEN(TRUE) - YY_BREAK - case 155: - YY_RULE_SETUP -#line 215 "flex_lexer.l" - TOKEN(TRUNCATE) - YY_BREAK - case 156: - YY_RULE_SETUP -#line 216 "flex_lexer.l" - TOKEN(UNBOUNDED) - YY_BREAK - case 157: - YY_RULE_SETUP -#line 217 "flex_lexer.l" - TOKEN(UNION) - YY_BREAK - case 158: - YY_RULE_SETUP -#line 218 "flex_lexer.l" - TOKEN(UNIQUE) - YY_BREAK - case 159: - YY_RULE_SETUP -#line 219 "flex_lexer.l" - TOKEN(UNLOAD) - YY_BREAK - case 160: - YY_RULE_SETUP -#line 220 "flex_lexer.l" - TOKEN(UPDATE) - YY_BREAK - case 161: - YY_RULE_SETUP -#line 221 "flex_lexer.l" - TOKEN(USING) - YY_BREAK - case 162: - YY_RULE_SETUP -#line 222 "flex_lexer.l" - TOKEN(VALUES) - YY_BREAK - case 163: - YY_RULE_SETUP -#line 223 "flex_lexer.l" - TOKEN(VARCHAR) - YY_BREAK - case 164: - YY_RULE_SETUP -#line 224 "flex_lexer.l" - TOKEN(VIEW) - YY_BREAK - case 165: - YY_RULE_SETUP -#line 225 "flex_lexer.l" - TOKEN(VIRTUAL) - YY_BREAK - case 166: - YY_RULE_SETUP -#line 226 "flex_lexer.l" - TOKEN(WHEN) - YY_BREAK - case 167: - YY_RULE_SETUP -#line 227 "flex_lexer.l" - TOKEN(WHERE) - YY_BREAK - case 168: - YY_RULE_SETUP -#line 228 "flex_lexer.l" - TOKEN(WITH) - YY_BREAK - case 169: - YY_RULE_SETUP -#line 229 "flex_lexer.l" - TOKEN(YEAR) - YY_BREAK - case 170: - YY_RULE_SETUP -#line 230 "flex_lexer.l" - TOKEN(YEARS) - YY_BREAK - case 171: - /* rule 171 can match eol */ - YY_RULE_SETUP -#line 232 "flex_lexer.l" - TOKEN(CURRENT_ROW) - YY_BREAK - case 172: - /* rule 172 can match eol */ - YY_RULE_SETUP -#line 233 "flex_lexer.l" - TOKEN(CHARACTER_VARYING) - YY_BREAK - /* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ - case 173: - YY_RULE_SETUP -#line 236 "flex_lexer.l" - TOKEN(EQUALS) - YY_BREAK - case 174: - YY_RULE_SETUP -#line 237 "flex_lexer.l" - TOKEN(NULLSAFEEQUALS) - YY_BREAK - case 175: - YY_RULE_SETUP -#line 238 "flex_lexer.l" - TOKEN(NOTEQUALS) - YY_BREAK - case 176: - YY_RULE_SETUP -#line 239 "flex_lexer.l" - TOKEN(NOTEQUALS) - YY_BREAK - case 177: - YY_RULE_SETUP -#line 240 "flex_lexer.l" - TOKEN(LESSEQ) - YY_BREAK - case 178: - YY_RULE_SETUP -#line 241 "flex_lexer.l" - TOKEN(GREATEREQ) - YY_BREAK - case 179: - YY_RULE_SETUP -#line 242 "flex_lexer.l" - TOKEN(LOGICALAND) - YY_BREAK - case 180: - YY_RULE_SETUP -#line 243 "flex_lexer.l" - TOKEN(LOGICALOR) - YY_BREAK - case 181: - YY_RULE_SETUP -#line 244 "flex_lexer.l" - TOKEN(BITSHIFTLEFT) - YY_BREAK - case 182: - YY_RULE_SETUP -#line 245 "flex_lexer.l" - TOKEN(BITSHIFTRIGHT) - YY_BREAK - case 183: - YY_RULE_SETUP -#line 247 "flex_lexer.l" - { - return yytext[0]; - } - YY_BREAK - case 184: -#line 250 "flex_lexer.l" - case 185: -#line 251 "flex_lexer.l" - case 186: - YY_RULE_SETUP -#line 251 "flex_lexer.l" - { - yylval->fval = atof(yytext); - return SQL_FLOATVAL; - } - YY_BREAK - /* - * Regularly, negative literals are treated as . This does not work for LLONG_MIN, as it has no - * positive equivalent. We thus match for LLONG_MIN specifically. This is not an issue for floats, where - * numeric_limits::lowest() == -numeric_limits::max(); - */ - case 187: - YY_RULE_SETUP -#line 261 "flex_lexer.l" - { - yylval->ival = LLONG_MIN; - return SQL_INTVAL; - } - YY_BREAK - case 188: - YY_RULE_SETUP -#line 266 "flex_lexer.l" - { - errno = 0; - yylval->ival = strtoll(yytext, nullptr, 0); - if (errno) { - yylval->sval = strdup(yytext); - return SQL_BIGINTVAL; - } - return SQL_INTVAL; - } - YY_BREAK - case 189: - YY_RULE_SETUP -#line 276 "flex_lexer.l" - { - // Crop the leading and trailing quote char - yylval->sval = hsql::substr(yytext, 1, strlen(yytext) - 1); - return SQL_IDENTIFIER; - } - YY_BREAK - case 190: - YY_RULE_SETUP -#line 282 "flex_lexer.l" - { - // Crop the leading and trailing quote char - yylval->sval = hsql::substr(yytext, 1, strlen(yytext) - 1); - return SQL_IDENTIFIER; - } - YY_BREAK - case 191: - YY_RULE_SETUP -#line 288 "flex_lexer.l" - { - yylval->sval = strdup(yytext); - return SQL_IDENTIFIER; - } - YY_BREAK - case 192: - YY_RULE_SETUP -#line 293 "flex_lexer.l" - { - BEGIN singlequotedstring; - strbuf.clear(); - strbuf.str(""); - } // Clear strbuf manually, see #170 - YY_BREAK - case 193: - YY_RULE_SETUP -#line 294 "flex_lexer.l" - { - strbuf << '\''; - } - YY_BREAK - case 194: - /* rule 194 can match eol */ - YY_RULE_SETUP -#line 295 "flex_lexer.l" - { - strbuf << yytext; - } - YY_BREAK - case 195: - YY_RULE_SETUP -#line 296 "flex_lexer.l" - { - BEGIN 0; - yylval->sval = strdup(strbuf.str().c_str()); - return SQL_STRING; - } - YY_BREAK - case YY_STATE_EOF(singlequotedstring): -#line 297 "flex_lexer.l" - { - fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); - return 0; - } - YY_BREAK - case 196: - YY_RULE_SETUP -#line 299 "flex_lexer.l" - { - fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); - return 0; - } - YY_BREAK - case 197: - YY_RULE_SETUP -#line 301 "flex_lexer.l" - ECHO; - YY_BREAK -#line 4553 "flex_lexer.cpp" - case YY_STATE_EOF(INITIAL): - case YY_STATE_EOF(COMMENT): - yyterminate(); - - case YY_END_OF_BUFFER: { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int)(yy_cp - yyg->yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yyg->yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW) { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if (yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]) { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(yyscanner); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans(yy_current_state, yyscanner); - - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - - if (yy_next_state) { - /* Consume the NUL. */ - yy_cp = ++yyg->yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else { - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - goto yy_find_action; - } - } - - else - switch (yy_get_next_buffer(yyscanner)) { - case EOB_ACT_END_OF_FILE: { - yyg->yy_did_buffer_switch_on_eof = 0; - - if (yywrap(yyscanner)) { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else { - if (!yyg->yy_did_buffer_switch_on_eof) YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(yyscanner); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yyg->yy_c_buf_p = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; - - yy_current_state = yy_get_previous_state(yyscanner); - - yy_cp = yyg->yy_c_buf_p; - yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR("fatal flex scanner internal error--no action found"); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - char* dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - char* source = yyg->yytext_ptr; - int number_to_move, i; - int ret_val; - - if (yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1]) - YY_FATAL_ERROR("fatal flex scanner internal error--end of buffer missed"); - - if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) { /* Don't try to fill the buffer, so this is an EOF. */ - if (yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1) { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int)(yyg->yy_c_buf_p - yyg->yytext_ptr - 1); - - for (i = 0; i < number_to_move; ++i) *(dest++) = *(source++); - - if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; - - else { - int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while (num_to_read <= 0) { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; - - int yy_c_buf_p_offset = (int)(yyg->yy_c_buf_p - b->yy_ch_buf); - - if (b->yy_is_our_buffer) { - int new_size = b->yy_buf_size * 2; - - if (new_size <= 0) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char*) - /* Include room in for 2 EOB chars. */ - yyrealloc((void*)b->yy_ch_buf, (yy_size_t)(b->yy_buf_size + 2), yyscanner); - } else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; - - if (!b->yy_ch_buf) YY_FATAL_ERROR("fatal error - scanner input buffer overflow"); - - yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - } - - if (num_to_read > YY_READ_BUF_SIZE) num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), yyg->yy_n_chars, num_to_read); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - if (yyg->yy_n_chars == 0) { - if (number_to_move == YY_MORE_ADJ) { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin, yyscanner); - } - - else { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = - (char*)yyrealloc((void*)YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t)new_size, yyscanner); - if (!YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) YY_FATAL_ERROR("out of dynamic memory in yy_get_next_buffer()"); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int)(new_size - 2); - } - - yyg->yy_n_chars += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state(yyscan_t yyscanner) { - yy_state_type yy_current_state; - char* yy_cp; - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - yy_current_state = yyg->yy_start; - - for (yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp) { - YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if (yy_accept[yy_current_state]) { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { - yy_current_state = (int)yy_def[yy_current_state]; - if (yy_current_state >= 1406) yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ -static yy_state_type yy_try_NUL_trans(yy_state_type yy_current_state, yyscan_t yyscanner) { - int yy_is_jam; - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ - char* yy_cp = yyg->yy_c_buf_p; - - YY_CHAR yy_c = 1; - if (yy_accept[yy_current_state]) { - yyg->yy_last_accepting_state = yy_current_state; - yyg->yy_last_accepting_cpos = yy_cp; - } - while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { - yy_current_state = (int)yy_def[yy_current_state]; - if (yy_current_state >= 1406) yy_c = yy_meta[yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1405); - - (void)yyg; - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_UNPUT - -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput(yyscan_t yyscanner) -#else -static int input(yyscan_t yyscanner) -#endif - -{ - int c; - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - *yyg->yy_c_buf_p = yyg->yy_hold_char; - - if (*yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR) { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if (yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]) /* This was really a NUL. */ - *yyg->yy_c_buf_p = '\0'; - - else { /* need more input */ - int offset = (int)(yyg->yy_c_buf_p - yyg->yytext_ptr); - ++yyg->yy_c_buf_p; - - switch (yy_get_next_buffer(yyscanner)) { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin, yyscanner); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: { - if (yywrap(yyscanner)) return 0; - - if (!yyg->yy_did_buffer_switch_on_eof) YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(yyscanner); -#else - return input(yyscanner); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yyg->yy_c_buf_p = yyg->yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char*)yyg->yy_c_buf_p; /* cast for 8-bit char's */ - *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ - yyg->yy_hold_char = *++yyg->yy_c_buf_p; - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * @param yyscanner The scanner object. - * @note This function does not reset the start condition to @c INITIAL . - */ -void yyrestart(FILE* input_file, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - if (!YY_CURRENT_BUFFER) { - yyensure_buffer_stack(yyscanner); - YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner); - } - - yy_init_buffer(YY_CURRENT_BUFFER, input_file, yyscanner); - yy_load_buffer_state(yyscanner); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * @param yyscanner The scanner object. - */ -void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack(yyscanner); - if (YY_CURRENT_BUFFER == new_buffer) return; - - if (YY_CURRENT_BUFFER) { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state(yyscanner); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yyg->yy_did_buffer_switch_on_eof = 1; -} - -static void yy_load_buffer_state(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - yyg->yy_hold_char = *yyg->yy_c_buf_p; -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * @param yyscanner The scanner object. - * @return the allocated buffer state. - */ -YY_BUFFER_STATE yy_create_buffer(FILE* file, int size, yyscan_t yyscanner) { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE)yyalloc(sizeof(struct yy_buffer_state), yyscanner); - if (!b) YY_FATAL_ERROR("out of dynamic memory in yy_create_buffer()"); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char*)yyalloc((yy_size_t)(b->yy_buf_size + 2), yyscanner); - if (!b->yy_ch_buf) YY_FATAL_ERROR("out of dynamic memory in yy_create_buffer()"); - - b->yy_is_our_buffer = 1; - - yy_init_buffer(b, file, yyscanner); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * @param yyscanner The scanner object. - */ -void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - if (!b) return; - - if (b == YY_CURRENT_BUFFER) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE)0; - - if (b->yy_is_our_buffer) yyfree((void*)b->yy_ch_buf, yyscanner); - - yyfree((void*)b, yyscanner); -} - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ -static void yy_init_buffer(YY_BUFFER_STATE b, FILE* file, yyscan_t yyscanner) - -{ - int oerrno = errno; - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - yy_flush_buffer(b, yyscanner); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER) { - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * @param yyscanner The scanner object. - */ -void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if (!b) return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if (b == YY_CURRENT_BUFFER) yy_load_buffer_state(yyscanner); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * @param yyscanner The scanner object. - */ -void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if (new_buffer == NULL) return; - - yyensure_buffer_stack(yyscanner); - - /* This block is copied from yy_switch_to_buffer. */ - if (YY_CURRENT_BUFFER) { - /* Flush out information for old buffer. */ - *yyg->yy_c_buf_p = yyg->yy_hold_char; - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) yyg->yy_buffer_stack_top++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state(yyscanner); - yyg->yy_did_buffer_switch_on_eof = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * @param yyscanner The scanner object. - */ -void yypop_buffer_state(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - if (!YY_CURRENT_BUFFER) return; - - yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner); - YY_CURRENT_BUFFER_LVALUE = NULL; - if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state(yyscanner); - yyg->yy_did_buffer_switch_on_eof = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack(yyscan_t yyscanner) { - yy_size_t num_to_alloc; - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - if (!yyg->yy_buffer_stack) { - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc(num_to_alloc * sizeof(struct yy_buffer_state*), yyscanner); - if (!yyg->yy_buffer_stack) YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); - - memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - yyg->yy_buffer_stack_max = num_to_alloc; - yyg->yy_buffer_stack_top = 0; - return; - } - - if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1) { - /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = yyg->yy_buffer_stack_max + grow_size; - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc( - yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*), yyscanner); - if (!yyg->yy_buffer_stack) YY_FATAL_ERROR("out of dynamic memory in yyensure_buffer_stack()"); - - /* zero only the new slots.*/ - memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); - yyg->yy_buffer_stack_max = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer(char* base, yy_size_t size, yyscan_t yyscanner) { - YY_BUFFER_STATE b; - - if (size < 2 || base[size - 2] != YY_END_OF_BUFFER_CHAR || base[size - 1] != YY_END_OF_BUFFER_CHAR) - /* They forgot to leave room for the EOB's. */ - return NULL; - - b = (YY_BUFFER_STATE)yyalloc(sizeof(struct yy_buffer_state), yyscanner); - if (!b) YY_FATAL_ERROR("out of dynamic memory in yy_scan_buffer()"); - - b->yy_buf_size = (int)(size - 2); /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer(b, yyscanner); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string(const char* yystr, yyscan_t yyscanner) { - return yy_scan_bytes(yystr, (int)strlen(yystr), yyscanner); -} - -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will - * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes(const char* yybytes, int _yybytes_len, yyscan_t yyscanner) { - YY_BUFFER_STATE b; - char* buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t)(_yybytes_len + 2); - buf = (char*)yyalloc(n, yyscanner); - if (!buf) YY_FATAL_ERROR("out of dynamic memory in yy_scan_bytes()"); - - for (i = 0; i < _yybytes_len; ++i) buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len + 1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer(buf, n, yyscanner); - if (!b) YY_FATAL_ERROR("bad buffer in yy_scan_bytes()"); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yynoreturn yy_fatal_error(const char* msg, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - fprintf(stderr, "%s\n", msg); - exit(YY_EXIT_FAILURE); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg); \ - yytext[yyleng] = yyg->yy_hold_char; \ - yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ - yyg->yy_hold_char = *yyg->yy_c_buf_p; \ - *yyg->yy_c_buf_p = '\0'; \ - yyleng = yyless_macro_arg; \ - } while (0) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the user-defined data for this scanner. - * @param yyscanner The scanner object. - */ -YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yyextra; -} - -/** Get the current line number. - * @param yyscanner The scanner object. - */ -int yyget_lineno(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - if (!YY_CURRENT_BUFFER) return 0; - - return yylineno; -} - -/** Get the current column number. - * @param yyscanner The scanner object. - */ -int yyget_column(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - if (!YY_CURRENT_BUFFER) return 0; - - return yycolumn; -} - -/** Get the input stream. - * @param yyscanner The scanner object. - */ -FILE* yyget_in(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yyin; -} - -/** Get the output stream. - * @param yyscanner The scanner object. - */ -FILE* yyget_out(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yyout; -} - -/** Get the length of the current token. - * @param yyscanner The scanner object. - */ -int yyget_leng(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yyleng; -} - -/** Get the current token. - * @param yyscanner The scanner object. - */ - -char* yyget_text(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yytext; -} - -/** Set the user-defined data. This data is never touched by the scanner. - * @param user_defined The data to be associated with this scanner. - * @param yyscanner The scanner object. - */ -void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yyextra = user_defined; -} - -/** Set the current line number. - * @param _line_number line number - * @param yyscanner The scanner object. - */ -void yyset_lineno(int _line_number, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - /* lineno is only valid if an input buffer exists. */ - if (!YY_CURRENT_BUFFER) YY_FATAL_ERROR("yyset_lineno called with no buffer"); - - yylineno = _line_number; -} - -/** Set the current column. - * @param _column_no column number - * @param yyscanner The scanner object. - */ -void yyset_column(int _column_no, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - /* column is only valid if an input buffer exists. */ - if (!YY_CURRENT_BUFFER) YY_FATAL_ERROR("yyset_column called with no buffer"); - - yycolumn = _column_no; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param _in_str A readable stream. - * @param yyscanner The scanner object. - * @see yy_switch_to_buffer - */ -void yyset_in(FILE* _in_str, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yyin = _in_str; -} - -void yyset_out(FILE* _out_str, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yyout = _out_str; -} - -int yyget_debug(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yy_flex_debug; -} - -void yyset_debug(int _bdebug, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yy_flex_debug = _bdebug; -} - -/* Accessor methods for yylval and yylloc */ - -YYSTYPE* yyget_lval(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yylval; -} - -void yyset_lval(YYSTYPE* yylval_param, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yylval = yylval_param; -} - -YYLTYPE* yyget_lloc(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - return yylloc; -} - -void yyset_lloc(YYLTYPE* yylloc_param, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - yylloc = yylloc_param; -} - -/* User-visible API */ - -/* yylex_init is special because it creates the scanner itself, so it is - * the ONLY reentrant function that doesn't take the scanner as the last argument. - * That's why we explicitly handle the declaration, instead of using our macros. - */ -int yylex_init(yyscan_t* ptr_yy_globals) { - if (ptr_yy_globals == NULL) { - errno = EINVAL; - return 1; - } - - *ptr_yy_globals = (yyscan_t)yyalloc(sizeof(struct yyguts_t), NULL); - - if (*ptr_yy_globals == NULL) { - errno = ENOMEM; - return 1; - } - - /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals, 0x00, sizeof(struct yyguts_t)); - - return yy_init_globals(*ptr_yy_globals); -} - -/* yylex_init_extra has the same functionality as yylex_init, but follows the - * convention of taking the scanner as the last argument. Note however, that - * this is a *pointer* to a scanner, as it will be allocated by this call (and - * is the reason, too, why this function also must handle its own declaration). - * The user defined value in the first argument will be available to yyalloc in - * the yyextra field. - */ -int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals) { - struct yyguts_t dummy_yyguts; - - yyset_extra(yy_user_defined, &dummy_yyguts); - - if (ptr_yy_globals == NULL) { - errno = EINVAL; - return 1; - } - - *ptr_yy_globals = (yyscan_t)yyalloc(sizeof(struct yyguts_t), &dummy_yyguts); - - if (*ptr_yy_globals == NULL) { - errno = ENOMEM; - return 1; - } - - /* By setting to 0xAA, we expose bugs in - yy_init_globals. Leave at 0x00 for releases. */ - memset(*ptr_yy_globals, 0x00, sizeof(struct yyguts_t)); - - yyset_extra(yy_user_defined, *ptr_yy_globals); - - return yy_init_globals(*ptr_yy_globals); -} - -static int yy_init_globals(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - yyg->yy_buffer_stack = NULL; - yyg->yy_buffer_stack_top = 0; - yyg->yy_buffer_stack_max = 0; - yyg->yy_c_buf_p = NULL; - yyg->yy_init = 0; - yyg->yy_start = 0; - - yyg->yy_start_stack_ptr = 0; - yyg->yy_start_stack_depth = 0; - yyg->yy_start_stack = NULL; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = NULL; - yyout = NULL; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy(yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - - /* Pop the buffer stack, destroying each element. */ - while (YY_CURRENT_BUFFER) { - yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(yyscanner); - } - - /* Destroy the stack itself. */ - yyfree(yyg->yy_buffer_stack, yyscanner); - yyg->yy_buffer_stack = NULL; - - /* Destroy the start condition stack. */ - yyfree(yyg->yy_start_stack, yyscanner); - yyg->yy_start_stack = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ - yy_init_globals(yyscanner); - - /* Destroy the main struct (reentrant only). */ - yyfree(yyscanner, yyscanner); - yyscanner = NULL; - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy(char* s1, const char* s2, int n, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - - int i; - for (i = 0; i < n; ++i) s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen(const char* s, yyscan_t yyscanner) { - int n; - for (n = 0; s[n]; ++n); - - return n; -} -#endif - -void* yyalloc(yy_size_t size, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - return malloc(size); -} - -void* yyrealloc(void* ptr, yy_size_t size, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return realloc(ptr, size); -} - -void yyfree(void* ptr, yyscan_t yyscanner) { - struct yyguts_t* yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - free((char*)ptr); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 301 "flex_lexer.l" - -/*************************** - ** Section 3: User code - ***************************/ - -int yyerror(const char* msg) { - fprintf(stderr, "[SQL-Lexer-Error] %s\n", msg); - return 0; -} diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.h b/extern/hyrise_sql_parser/src/parser/flex_lexer.h deleted file mode 100644 index 5dd7c61b4a..0000000000 --- a/extern/hyrise_sql_parser/src/parser/flex_lexer.h +++ /dev/null @@ -1,733 +0,0 @@ -#ifndef hsql_HEADER_H -#define hsql_HEADER_H 1 -#define hsql_IN_HEADER 1 - -#line 5 "flex_lexer.h" - -#line 7 "flex_lexer.h" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -#ifdef yy_create_buffer -#define hsql__create_buffer_ALREADY_DEFINED -#else -#define yy_create_buffer hsql__create_buffer -#endif - -#ifdef yy_delete_buffer -#define hsql__delete_buffer_ALREADY_DEFINED -#else -#define yy_delete_buffer hsql__delete_buffer -#endif - -#ifdef yy_scan_buffer -#define hsql__scan_buffer_ALREADY_DEFINED -#else -#define yy_scan_buffer hsql__scan_buffer -#endif - -#ifdef yy_scan_string -#define hsql__scan_string_ALREADY_DEFINED -#else -#define yy_scan_string hsql__scan_string -#endif - -#ifdef yy_scan_bytes -#define hsql__scan_bytes_ALREADY_DEFINED -#else -#define yy_scan_bytes hsql__scan_bytes -#endif - -#ifdef yy_init_buffer -#define hsql__init_buffer_ALREADY_DEFINED -#else -#define yy_init_buffer hsql__init_buffer -#endif - -#ifdef yy_flush_buffer -#define hsql__flush_buffer_ALREADY_DEFINED -#else -#define yy_flush_buffer hsql__flush_buffer -#endif - -#ifdef yy_load_buffer_state -#define hsql__load_buffer_state_ALREADY_DEFINED -#else -#define yy_load_buffer_state hsql__load_buffer_state -#endif - -#ifdef yy_switch_to_buffer -#define hsql__switch_to_buffer_ALREADY_DEFINED -#else -#define yy_switch_to_buffer hsql__switch_to_buffer -#endif - -#ifdef yypush_buffer_state -#define hsql_push_buffer_state_ALREADY_DEFINED -#else -#define yypush_buffer_state hsql_push_buffer_state -#endif - -#ifdef yypop_buffer_state -#define hsql_pop_buffer_state_ALREADY_DEFINED -#else -#define yypop_buffer_state hsql_pop_buffer_state -#endif - -#ifdef yyensure_buffer_stack -#define hsql_ensure_buffer_stack_ALREADY_DEFINED -#else -#define yyensure_buffer_stack hsql_ensure_buffer_stack -#endif - -#ifdef yylex -#define hsql_lex_ALREADY_DEFINED -#else -#define yylex hsql_lex -#endif - -#ifdef yyrestart -#define hsql_restart_ALREADY_DEFINED -#else -#define yyrestart hsql_restart -#endif - -#ifdef yylex_init -#define hsql_lex_init_ALREADY_DEFINED -#else -#define yylex_init hsql_lex_init -#endif - -#ifdef yylex_init_extra -#define hsql_lex_init_extra_ALREADY_DEFINED -#else -#define yylex_init_extra hsql_lex_init_extra -#endif - -#ifdef yylex_destroy -#define hsql_lex_destroy_ALREADY_DEFINED -#else -#define yylex_destroy hsql_lex_destroy -#endif - -#ifdef yyget_debug -#define hsql_get_debug_ALREADY_DEFINED -#else -#define yyget_debug hsql_get_debug -#endif - -#ifdef yyset_debug -#define hsql_set_debug_ALREADY_DEFINED -#else -#define yyset_debug hsql_set_debug -#endif - -#ifdef yyget_extra -#define hsql_get_extra_ALREADY_DEFINED -#else -#define yyget_extra hsql_get_extra -#endif - -#ifdef yyset_extra -#define hsql_set_extra_ALREADY_DEFINED -#else -#define yyset_extra hsql_set_extra -#endif - -#ifdef yyget_in -#define hsql_get_in_ALREADY_DEFINED -#else -#define yyget_in hsql_get_in -#endif - -#ifdef yyset_in -#define hsql_set_in_ALREADY_DEFINED -#else -#define yyset_in hsql_set_in -#endif - -#ifdef yyget_out -#define hsql_get_out_ALREADY_DEFINED -#else -#define yyget_out hsql_get_out -#endif - -#ifdef yyset_out -#define hsql_set_out_ALREADY_DEFINED -#else -#define yyset_out hsql_set_out -#endif - -#ifdef yyget_leng -#define hsql_get_leng_ALREADY_DEFINED -#else -#define yyget_leng hsql_get_leng -#endif - -#ifdef yyget_text -#define hsql_get_text_ALREADY_DEFINED -#else -#define yyget_text hsql_get_text -#endif - -#ifdef yyget_lineno -#define hsql_get_lineno_ALREADY_DEFINED -#else -#define yyget_lineno hsql_get_lineno -#endif - -#ifdef yyset_lineno -#define hsql_set_lineno_ALREADY_DEFINED -#else -#define yyset_lineno hsql_set_lineno -#endif - -#ifdef yyget_column -#define hsql_get_column_ALREADY_DEFINED -#else -#define yyget_column hsql_get_column -#endif - -#ifdef yyset_column -#define hsql_set_column_ALREADY_DEFINED -#else -#define yyset_column hsql_set_column -#endif - -#ifdef yywrap -#define hsql_wrap_ALREADY_DEFINED -#else -#define yywrap hsql_wrap -#endif - -#ifdef yyget_lval -#define hsql_get_lval_ALREADY_DEFINED -#else -#define yyget_lval hsql_get_lval -#endif - -#ifdef yyset_lval -#define hsql_set_lval_ALREADY_DEFINED -#else -#define yyset_lval hsql_set_lval -#endif - -#ifdef yyget_lloc -#define hsql_get_lloc_ALREADY_DEFINED -#else -#define yyget_lloc hsql_get_lloc -#endif - -#ifdef yyset_lloc -#define hsql_set_lloc_ALREADY_DEFINED -#else -#define yyset_lloc hsql_set_lloc -#endif - -#ifdef yyalloc -#define hsql_alloc_ALREADY_DEFINED -#else -#define yyalloc hsql_alloc -#endif - -#ifdef yyrealloc -#define hsql_realloc_ALREADY_DEFINED -#else -#define yyrealloc hsql_realloc -#endif - -#ifdef yyfree -#define hsql_free_ALREADY_DEFINED -#else -#define yyfree hsql_free -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767 - 1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647 - 1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -/* begin standard C++ headers. */ - -/* TODO: this is always defined, so inline it */ -#define yyconst const - -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) -#else -#define yynoreturn -#endif - -/* An opaque pointer. */ -#ifndef YY_TYPEDEF_YY_SCANNER_T -#define YY_TYPEDEF_YY_SCANNER_T -typedef void* yyscan_t; -#endif - -/* For convenience, these vars (plus the bison vars far below) - are macros in the reentrant scanner. */ -#define yyin yyg->yyin_r -#define yyout yyg->yyout_r -#define yyextra yyg->yyextra_r -#define yyleng yyg->yyleng_r -#define yytext yyg->yytext_r -#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) -#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) -#define yy_flex_debug yyg->yy_flex_debug_r - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state* YY_BUFFER_STATE; -#endif - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state { - FILE* yy_input_file; - - char* yy_ch_buf; /* input buffer */ - char* yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - int yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -}; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -void yyrestart(FILE* input_file, yyscan_t yyscanner); -void yy_switch_to_buffer(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); -YY_BUFFER_STATE yy_create_buffer(FILE* file, int size, yyscan_t yyscanner); -void yy_delete_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); -void yy_flush_buffer(YY_BUFFER_STATE b, yyscan_t yyscanner); -void yypush_buffer_state(YY_BUFFER_STATE new_buffer, yyscan_t yyscanner); -void yypop_buffer_state(yyscan_t yyscanner); - -YY_BUFFER_STATE yy_scan_buffer(char* base, yy_size_t size, yyscan_t yyscanner); -YY_BUFFER_STATE yy_scan_string(const char* yy_str, yyscan_t yyscanner); -YY_BUFFER_STATE yy_scan_bytes(const char* bytes, int len, yyscan_t yyscanner); - -void* yyalloc(yy_size_t, yyscan_t yyscanner); -void* yyrealloc(void*, yy_size_t, yyscan_t yyscanner); -void yyfree(void*, yyscan_t yyscanner); - -/* Begin user sect3 */ - -#define hsql_wrap(yyscanner) (/*CONSTCOND*/ 1) -#define YY_SKIP_YYWRAP - -#define yytext_ptr yytext_r - -#ifdef YY_HEADER_EXPORT_START_CONDITIONS -#define INITIAL 0 -#define singlequotedstring 1 -#define COMMENT 2 - -#endif - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void* -#endif - -int yylex_init(yyscan_t* scanner); - -int yylex_init_extra(YY_EXTRA_TYPE user_defined, yyscan_t* scanner); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy(yyscan_t yyscanner); - -int yyget_debug(yyscan_t yyscanner); - -void yyset_debug(int debug_flag, yyscan_t yyscanner); - -YY_EXTRA_TYPE yyget_extra(yyscan_t yyscanner); - -void yyset_extra(YY_EXTRA_TYPE user_defined, yyscan_t yyscanner); - -FILE* yyget_in(yyscan_t yyscanner); - -void yyset_in(FILE* _in_str, yyscan_t yyscanner); - -FILE* yyget_out(yyscan_t yyscanner); - -void yyset_out(FILE* _out_str, yyscan_t yyscanner); - -int yyget_leng(yyscan_t yyscanner); - -char* yyget_text(yyscan_t yyscanner); - -int yyget_lineno(yyscan_t yyscanner); - -void yyset_lineno(int _line_number, yyscan_t yyscanner); - -int yyget_column(yyscan_t yyscanner); - -void yyset_column(int _column_no, yyscan_t yyscanner); - -YYSTYPE* yyget_lval(yyscan_t yyscanner); - -void yyset_lval(YYSTYPE* yylval_param, yyscan_t yyscanner); - -YYLTYPE* yyget_lloc(yyscan_t yyscanner); - -void yyset_lloc(YYLTYPE* yylloc_param, yyscan_t yyscanner); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap(yyscan_t yyscanner); -#else -extern int yywrap(yyscan_t yyscanner); -#endif -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy(char*, const char*, int, yyscan_t yyscanner); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen(const char*, yyscan_t yyscanner); -#endif - -#ifndef YY_NO_INPUT - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner); - -#define YY_DECL int yylex(YYSTYPE* yylval_param, YYLTYPE* yylloc_param, yyscan_t yyscanner) -#endif /* !YY_DECL */ - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -#undef YY_NEW_FILE -#undef YY_FLUSH_BUFFER -#undef yy_set_bol -#undef yy_new_buffer -#undef yy_set_interactive -#undef YY_DO_BEFORE_ACTION - -#ifdef YY_DECL_IS_OURS -#undef YY_DECL_IS_OURS -#undef YY_DECL -#endif - -#ifndef hsql__create_buffer_ALREADY_DEFINED -#undef yy_create_buffer -#endif -#ifndef hsql__delete_buffer_ALREADY_DEFINED -#undef yy_delete_buffer -#endif -#ifndef hsql__scan_buffer_ALREADY_DEFINED -#undef yy_scan_buffer -#endif -#ifndef hsql__scan_string_ALREADY_DEFINED -#undef yy_scan_string -#endif -#ifndef hsql__scan_bytes_ALREADY_DEFINED -#undef yy_scan_bytes -#endif -#ifndef hsql__init_buffer_ALREADY_DEFINED -#undef yy_init_buffer -#endif -#ifndef hsql__flush_buffer_ALREADY_DEFINED -#undef yy_flush_buffer -#endif -#ifndef hsql__load_buffer_state_ALREADY_DEFINED -#undef yy_load_buffer_state -#endif -#ifndef hsql__switch_to_buffer_ALREADY_DEFINED -#undef yy_switch_to_buffer -#endif -#ifndef hsql_push_buffer_state_ALREADY_DEFINED -#undef yypush_buffer_state -#endif -#ifndef hsql_pop_buffer_state_ALREADY_DEFINED -#undef yypop_buffer_state -#endif -#ifndef hsql_ensure_buffer_stack_ALREADY_DEFINED -#undef yyensure_buffer_stack -#endif -#ifndef hsql_lex_ALREADY_DEFINED -#undef yylex -#endif -#ifndef hsql_restart_ALREADY_DEFINED -#undef yyrestart -#endif -#ifndef hsql_lex_init_ALREADY_DEFINED -#undef yylex_init -#endif -#ifndef hsql_lex_init_extra_ALREADY_DEFINED -#undef yylex_init_extra -#endif -#ifndef hsql_lex_destroy_ALREADY_DEFINED -#undef yylex_destroy -#endif -#ifndef hsql_get_debug_ALREADY_DEFINED -#undef yyget_debug -#endif -#ifndef hsql_set_debug_ALREADY_DEFINED -#undef yyset_debug -#endif -#ifndef hsql_get_extra_ALREADY_DEFINED -#undef yyget_extra -#endif -#ifndef hsql_set_extra_ALREADY_DEFINED -#undef yyset_extra -#endif -#ifndef hsql_get_in_ALREADY_DEFINED -#undef yyget_in -#endif -#ifndef hsql_set_in_ALREADY_DEFINED -#undef yyset_in -#endif -#ifndef hsql_get_out_ALREADY_DEFINED -#undef yyget_out -#endif -#ifndef hsql_set_out_ALREADY_DEFINED -#undef yyset_out -#endif -#ifndef hsql_get_leng_ALREADY_DEFINED -#undef yyget_leng -#endif -#ifndef hsql_get_text_ALREADY_DEFINED -#undef yyget_text -#endif -#ifndef hsql_get_lineno_ALREADY_DEFINED -#undef yyget_lineno -#endif -#ifndef hsql_set_lineno_ALREADY_DEFINED -#undef yyset_lineno -#endif -#ifndef hsql_get_column_ALREADY_DEFINED -#undef yyget_column -#endif -#ifndef hsql_set_column_ALREADY_DEFINED -#undef yyset_column -#endif -#ifndef hsql_wrap_ALREADY_DEFINED -#undef yywrap -#endif -#ifndef hsql_get_lval_ALREADY_DEFINED -#undef yyget_lval -#endif -#ifndef hsql_set_lval_ALREADY_DEFINED -#undef yyset_lval -#endif -#ifndef hsql_get_lloc_ALREADY_DEFINED -#undef yyget_lloc -#endif -#ifndef hsql_set_lloc_ALREADY_DEFINED -#undef yyset_lloc -#endif -#ifndef hsql_alloc_ALREADY_DEFINED -#undef yyalloc -#endif -#ifndef hsql_realloc_ALREADY_DEFINED -#undef yyrealloc -#endif -#ifndef hsql_free_ALREADY_DEFINED -#undef yyfree -#endif -#ifndef hsql_text_ALREADY_DEFINED -#undef yytext -#endif -#ifndef hsql_leng_ALREADY_DEFINED -#undef yyleng -#endif -#ifndef hsql_in_ALREADY_DEFINED -#undef yyin -#endif -#ifndef hsql_out_ALREADY_DEFINED -#undef yyout -#endif -#ifndef hsql__flex_debug_ALREADY_DEFINED -#undef yy_flex_debug -#endif -#ifndef hsql_lineno_ALREADY_DEFINED -#undef yylineno -#endif -#ifndef hsql_tables_fload_ALREADY_DEFINED -#undef yytables_fload -#endif -#ifndef hsql_tables_destroy_ALREADY_DEFINED -#undef yytables_destroy -#endif -#ifndef hsql_TABLES_NAME_ALREADY_DEFINED -#undef yyTABLES_NAME -#endif - -#line 301 "flex_lexer.l" - -#line 736 "flex_lexer.h" -#undef hsql_IN_HEADER -#endif /* hsql_HEADER_H */ diff --git a/extern/hyrise_sql_parser/src/parser/flex_lexer.l b/extern/hyrise_sql_parser/src/parser/flex_lexer.l deleted file mode 100644 index 1468ccafa3..0000000000 --- a/extern/hyrise_sql_parser/src/parser/flex_lexer.l +++ /dev/null @@ -1,308 +0,0 @@ -/** - * lexer - * - * - */ - - -/*************************** - ** Section 1: Definitions - ***************************/ -%{ - -#include "../sql/Expr.h" -#include "bison_parser.h" -#include -#include -#include - -#define TOKEN(name) { return SQL_##name; } - -static thread_local std::stringstream strbuf; - -%} -%x singlequotedstring - -/*************************** - ** Section 2: Rules - ***************************/ - -/* Define the output files */ -%option header-file="flex_lexer.h" -%option outfile="flex_lexer.cpp" - -/* Make reentrant */ -%option reentrant -%option bison-bridge - -/* performance tweeks */ -%option never-interactive -%option batch - -/* other flags */ -%option noyywrap -%option nounput -%option warn -%option case-insensitive -%option prefix="hsql_" -%option bison-locations -/* %option nodefault */ - - -%s COMMENT - -/*************************** - ** Section 3: Rules - ***************************/ -%% - --- BEGIN(COMMENT); -[^\n]* /* skipping comment content until a end of line is read */; -\n BEGIN(INITIAL); - -[ \t\n]+ /* skip whitespace */; - -ADD TOKEN(ADD) -AFTER TOKEN(AFTER) -ALL TOKEN(ALL) -ALTER TOKEN(ALTER) -ANALYZE TOKEN(ANALYZE) -AND TOKEN(AND) -ARRAY TOKEN(ARRAY) -AS TOKEN(AS) -ASC TOKEN(ASC) -BEFORE TOKEN(BEFORE) -BEGIN TOKEN(BEGIN) -BETWEEN TOKEN(BETWEEN) -BIGINT TOKEN(BIGINT) -BOOLEAN TOKEN(BOOLEAN) -BY TOKEN(BY) -CALL TOKEN(CALL) -CASCADE TOKEN(CASCADE) -CASE TOKEN(CASE) -CAST TOKEN(CAST) -CHAR TOKEN(CHAR) -COLUMN TOKEN(COLUMN) -COLUMNS TOKEN(COLUMNS) -COMMIT TOKEN(COMMIT) -CONTROL TOKEN(CONTROL) -COPY TOKEN(COPY) -CREATE TOKEN(CREATE) -CROSS TOKEN(CROSS) -DATE TOKEN(DATE) -DATETIME TOKEN(DATETIME) -DAY TOKEN(DAY) -DAYS TOKEN(DAYS) -DEALLOCATE TOKEN(DEALLOCATE) -DECIMAL TOKEN(DECIMAL) -DEFAULT TOKEN(DEFAULT) -DELETE TOKEN(DELETE) -DELTA TOKEN(DELTA) -DESC TOKEN(DESC) -DESCRIBE TOKEN(DESCRIBE) -DIRECT TOKEN(DIRECT) -DISTINCT TOKEN(DISTINCT) -DIV TOKEN(DIV) -DOUBLE TOKEN(DOUBLE) -DROP TOKEN(DROP) -ELSE TOKEN(ELSE) -ENCODING TOKEN(ENCODING) -END TOKEN(END) -ESCAPE TOKEN(ESCAPE) -EXCEPT TOKEN(EXCEPT) -EXECUTE TOKEN(EXECUTE) -EXISTS TOKEN(EXISTS) -EXPLAIN TOKEN(EXPLAIN) -EXTRACT TOKEN(EXTRACT) -FALSE TOKEN(FALSE) -FILE TOKEN(FILE) -FLOAT TOKEN(FLOAT) -FOLLOWING TOKEN(FOLLOWING) -FOR TOKEN(FOR) -FOREIGN TOKEN(FOREIGN) -FORMAT TOKEN(FORMAT) -FROM TOKEN(FROM) -FULL TOKEN(FULL) -GLOBAL TOKEN(GLOBAL) -GROUP TOKEN(GROUP) -GROUPS TOKEN(GROUPS) -HASH TOKEN(HASH) -HAVING TOKEN(HAVING) -HINT TOKEN(HINT) -HOUR TOKEN(HOUR) -HOURS TOKEN(HOURS) -IF TOKEN(IF) -ILIKE TOKEN(ILIKE) -IMPORT TOKEN(IMPORT) -IN TOKEN(IN) -INDEX TOKEN(INDEX) -INNER TOKEN(INNER) -INSERT TOKEN(INSERT) -INT TOKEN(INT) -INTEGER TOKEN(INTEGER) -INTERSECT TOKEN(INTERSECT) -INTERVAL TOKEN(INTERVAL) -INTO TOKEN(INTO) -IS TOKEN(IS) -ISNULL TOKEN(ISNULL) -JOIN TOKEN(JOIN) -KEY TOKEN(KEY) -LEFT TOKEN(LEFT) -LIKE TOKEN(LIKE) -LIMIT TOKEN(LIMIT) -LOAD TOKEN(LOAD) -LOCAL TOKEN(LOCAL) -LOCKED TOKEN(LOCKED) -LONG TOKEN(LONG) -MERGE TOKEN(MERGE) -MINUS TOKEN(MINUS) -MINUTE TOKEN(MINUTE) -MINUTES TOKEN(MINUTES) -MOD TOKEN(MOD) -MONTH TOKEN(MONTH) -MONTHS TOKEN(MONTHS) -NATURAL TOKEN(NATURAL) -NO TOKEN(NO) -NOT TOKEN(NOT) -NOWAIT TOKEN(NOWAIT) -NULL TOKEN(NULL) -NVARCHAR TOKEN(NVARCHAR) -OF TOKEN(OF) -OFF TOKEN(OFF) -OFFSET TOKEN(OFFSET) -ON TOKEN(ON) -OR TOKEN(OR) -ORDER TOKEN(ORDER) -OUTER TOKEN(OUTER) -OVER TOKEN(OVER) -PARAMETERS TOKEN(PARAMETERS) -PARTITION TOKEN(PARTITION) -PLAN TOKEN(PLAN) -PRECEDING TOKEN(PRECEDING) -PREPARE TOKEN(PREPARE) -PRIMARY TOKEN(PRIMARY) -RANGE TOKEN(RANGE) -REAL TOKEN(REAL) -REFERENCES TOKEN(REFERENCES) -RENAME TOKEN(RENAME) -RESTRICT TOKEN(RESTRICT) -RIGHT TOKEN(RIGHT) -ROLLBACK TOKEN(ROLLBACK) -ROWS TOKEN(ROWS) -SCHEMA TOKEN(SCHEMA) -SCHEMAS TOKEN(SCHEMAS) -SECOND TOKEN(SECOND) -SECONDS TOKEN(SECONDS) -SELECT TOKEN(SELECT) -SET TOKEN(SET) -SHARE TOKEN(SHARE) -SHOW TOKEN(SHOW) -SKIP TOKEN(SKIP) -SMALLINT TOKEN(SMALLINT) -SORTED TOKEN(SORTED) -SPATIAL TOKEN(SPATIAL) -TABLE TOKEN(TABLE) -TABLES TOKEN(TABLES) -TEMPORARY TOKEN(TEMPORARY) -TEXT TOKEN(TEXT) -THEN TOKEN(THEN) -TIME TOKEN(TIME) -TIMESTAMP TOKEN(TIMESTAMP) -TO TOKEN(TO) -TOP TOKEN(TOP) -TRANSACTION TOKEN(TRANSACTION) -TRUE TOKEN(TRUE) -TRUNCATE TOKEN(TRUNCATE) -UNBOUNDED TOKEN(UNBOUNDED) -UNION TOKEN(UNION) -UNIQUE TOKEN(UNIQUE) -UNLOAD TOKEN(UNLOAD) -UPDATE TOKEN(UPDATE) -USING TOKEN(USING) -VALUES TOKEN(VALUES) -VARCHAR TOKEN(VARCHAR) -VIEW TOKEN(VIEW) -VIRTUAL TOKEN(VIRTUAL) -WHEN TOKEN(WHEN) -WHERE TOKEN(WHERE) -WITH TOKEN(WITH) -YEAR TOKEN(YEAR) -YEARS TOKEN(YEARS) - -CURRENT[ \t\n]+ROW TOKEN(CURRENT_ROW) -CHARACTER[ \t\n]+VARYING TOKEN(CHARACTER_VARYING) - - /* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ -"==" TOKEN(EQUALS) -"<=>" TOKEN(NULLSAFEEQUALS) -"!=" TOKEN(NOTEQUALS) -"<>" TOKEN(NOTEQUALS) -"<=" TOKEN(LESSEQ) -">=" TOKEN(GREATEREQ) -"&&" TOKEN(LOGICALAND) -"||" TOKEN(LOGICALOR) -"<<" TOKEN(BITSHIFTLEFT) -">>" TOKEN(BITSHIFTRIGHT) - -[-+*/(){},.;<>=^%:?[\]|&] { return yytext[0]; } - -[0-9]+"."[0-9]*([eE][-+]?[0-9]+)? | -"."[0-9]+([eE][-+]?[0-9]+)? | -[0-9]+[eE][-+]?[0-9]+ { - yylval->fval = atof(yytext); - return SQL_FLOATVAL; -} - - /* - * Regularly, negative literals are treated as . This does not work for LLONG_MIN, as it has no - * positive equivalent. We thus match for LLONG_MIN specifically. This is not an issue for floats, where - * numeric_limits::lowest() == -numeric_limits::max(); - */ --9223372036854775808 { - yylval->ival = LLONG_MIN; - return SQL_INTVAL; -} - -[0-9]+ { - errno = 0; - yylval->ival = strtoll(yytext, nullptr, 0); - if (errno) { - yylval->sval = strdup(yytext); - return SQL_BIGINTVAL; - } - return SQL_INTVAL; -} - -\"[^\"\n]+\" { - // Crop the leading and trailing quote char - yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); - return SQL_IDENTIFIER; -} - -`[^`\n]+` { - // Crop the leading and trailing quote char - yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); - return SQL_IDENTIFIER; -} - -[A-Za-z_][A-Za-z0-9_]* { - yylval->sval = strdup(yytext); - return SQL_IDENTIFIER; -} - -\' { BEGIN singlequotedstring; strbuf.clear(); strbuf.str(""); } // Clear strbuf manually, see #170 -\'\' { strbuf << '\''; } -[^']* { strbuf << yytext; } -\' { BEGIN 0; yylval->sval = strdup(strbuf.str().c_str()); return SQL_STRING; } -<> { fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); return 0; } - -. { fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); return 0; } - -%% -/*************************** - ** Section 3: User code - ***************************/ - -int yyerror(const char *msg) { - fprintf(stderr, "[SQL-Lexer-Error] %s\n",msg); return 0; -} diff --git a/extern/hyrise_sql_parser/src/parser/keywordlist_generator.py b/extern/hyrise_sql_parser/src/parser/keywordlist_generator.py deleted file mode 100644 index c4e3fcbf13..0000000000 --- a/extern/hyrise_sql_parser/src/parser/keywordlist_generator.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import print_function -import math - - -with open("sql_keywords.txt", 'r') as fh: - keywords = [line.strip() for line in fh.readlines() if not line.strip().startswith("//") and len(line.strip()) > 0] - - keywords = sorted(set(keywords)) # Sort by name - keywords = sorted(keywords, key=lambda x: len(x), reverse=True) # Sort by length - - ################# - # Flex - - max_len = len(max(keywords, key=lambda x: len(x))) + 1 - max_len = 4 * int(math.ceil(max_len / 4.0)) - - for keyword in keywords: - len_diff = (max_len) - len(keyword) - num_tabs = int(math.floor(len_diff / 4.0)) - - if len_diff % 4 != 0: num_tabs += 1 - - tabs = ''.join(['\t' for _ in range(num_tabs)]) - print("%s%sTOKEN(%s)" % (keyword, tabs, keyword)) - - # - ################# - - - ################# - # Bison - line = "%token" - max_len = 60 - - print("/* SQL Keywords */") - for keyword in keywords: - - if len(line + " " + keyword) > max_len: - print(line) - line = "%token " + keyword - else: - line = line + " " + keyword - print(line) - - # - ################# diff --git a/extern/hyrise_sql_parser/src/parser/parser_typedef.h b/extern/hyrise_sql_parser/src/parser/parser_typedef.h deleted file mode 100644 index 61afef4a20..0000000000 --- a/extern/hyrise_sql_parser/src/parser/parser_typedef.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef __PARSER_TYPEDEF_H__ -#define __PARSER_TYPEDEF_H__ - -#include - -#ifndef YYtypeDEF_YY_SCANNER_T -#define YYtypeDEF_YY_SCANNER_T -typedef void* yyscan_t; -#endif - -#define YYSTYPE HSQL_STYPE -#define YYLTYPE HSQL_LTYPE - -struct HSQL_CUST_LTYPE { - int first_line; - int first_column; - int last_line; - int last_column; - - int total_column; - - // Length of the string in the SQL query string - int string_length; - - // Parameters. - // int param_id; - std::vector param_list; -}; - -#define HSQL_LTYPE HSQL_CUST_LTYPE -#define HSQL_LTYPE_IS_DECLARED 1 - -#endif diff --git a/extern/hyrise_sql_parser/src/parser/sql_keywords.txt b/extern/hyrise_sql_parser/src/parser/sql_keywords.txt deleted file mode 100644 index ba4bfa19fb..0000000000 --- a/extern/hyrise_sql_parser/src/parser/sql_keywords.txt +++ /dev/null @@ -1,163 +0,0 @@ -// Possible source for more tokens https://www.sqlite.org/lang_keywords.html - -////////////////////////// -// Select Statement -SELECT -TOP -FROM -WHERE -GROUP -BY -HAVING -ORDER -ASC -DESC -LIMIT -DISTINCT -OFFSET -UNION -ALL -EXCEPT -MINUS -INTERSECT - -// Join clause -JOIN -ON -INNER -OUTER -LEFT -RIGHT -FULL -CROSS -USING -NATURAL -// Select Statement -////////////////////// -// Data Definition -CREATE -TABLE -SCHEMA -INDEX -VIEW -IF -NOT -EXISTS -GLOBAL -LOCAL -TEMPORARY -UNIQUE -VIRTUAL - -INDEX -UNIQUE -HASH -SPATIAL -PRIMARY -KEY -ON - -DROP -TABLE -SCHEMA -RESTRICT -CASCADE - -ALTER -ADD -COLUMN -BEFORE -AFTER -// Data Definition -//////////////////////// -// Data Manipulation -INSERT -VALUES -DIRECT -SORTED - -COPY -FORMAT - -IMPORT -FILE -CONTROL - -UPDATE -SET - -DELETE - -TRUNCATE - -MERGE -DELTA -OF - -LOAD -UNLOAD - -DELETE - -// Prepared Statements -DEALLOCATE -PREPARE -EXECUTE - -/////////////////////////////// -// other statements -RENAME -EXPLAIN -PLAN -ANALYZE - -SHOW -SCHEMAS -TABLES -COLUMNS - -// misc. -COLUMN -INTO -AS -SET -DEFAULT -CALL -FOR -TO -ARRAY - - -// Expressions -NOT -AND -OR -NULL -LIKE -IN -IS -ISNULL -BETWEEN -ESCAPE -CASE -WHEN -THEN -ELSE -END - -// With -WITH -HINT -PARAMETERS -ON -OFF - -// Data types -DATE -TIME -TIMESTAMP -INTEGER -INT -DOUBLE -NVARCHAR -TEXT diff --git a/extern/hyrise_sql_parser/src/sql/AlterStatement.h b/extern/hyrise_sql_parser/src/sql/AlterStatement.h deleted file mode 100644 index 096ed7cf52..0000000000 --- a/extern/hyrise_sql_parser/src/sql/AlterStatement.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef SQLPARSER_ALTER_STATEMENT_H -#define SQLPARSER_ALTER_STATEMENT_H - -#include "SQLStatement.h" - -// Note: Implementations of constructors and destructors can be found in statements.cpp. -namespace hsql { - -enum ActionType { - DropColumn, -}; - -struct AlterAction { - AlterAction(ActionType type); - ActionType type; - virtual ~AlterAction(); -}; - -struct DropColumnAction : AlterAction { - DropColumnAction(char* column_name); - char* columnName; - bool ifExists; - - ~DropColumnAction() override; -}; - -// Represents SQL Alter Table statements. -// Example "ALTER TABLE students DROP COLUMN name;" -struct AlterStatement : SQLStatement { - AlterStatement(char* name, AlterAction* action); - ~AlterStatement() override; - - char* schema; - bool ifTableExists; - char* name; - AlterAction* action; -}; -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/ColumnType.h b/extern/hyrise_sql_parser/src/sql/ColumnType.h deleted file mode 100644 index 127f84b5bc..0000000000 --- a/extern/hyrise_sql_parser/src/sql/ColumnType.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef SQLPARSER_COLUMN_TYPE_H -#define SQLPARSER_COLUMN_TYPE_H - -#include -#include - -namespace hsql { -enum class DataType { - UNKNOWN, - BIGINT, - BOOLEAN, - CHAR, - DATE, - DATETIME, - DECIMAL, - DOUBLE, - FLOAT, - INT, - LONG, - REAL, - SMALLINT, - TEXT, - TIME, - VARCHAR, -}; - -// Represents the type of a column, e.g., FLOAT or VARCHAR(10) -struct ColumnType { - ColumnType() = default; - ColumnType(DataType data_type, int64_t length = 0, int64_t precision = 0, int64_t scale = 0); - DataType data_type; - int64_t length; // Used for, e.g., VARCHAR(10) - int64_t precision; // Used for, e.g., DECIMAL (6, 4) or TIME (5) - int64_t scale; // Used for DECIMAL (6, 4) -}; - -bool operator==(const ColumnType& lhs, const ColumnType& rhs); -bool operator!=(const ColumnType& lhs, const ColumnType& rhs); -std::ostream& operator<<(std::ostream&, const ColumnType&); - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/CreateStatement.cpp b/extern/hyrise_sql_parser/src/sql/CreateStatement.cpp deleted file mode 100644 index c6340838dc..0000000000 --- a/extern/hyrise_sql_parser/src/sql/CreateStatement.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include "CreateStatement.h" -#include "SelectStatement.h" - -namespace hsql { - -std::ostream& operator<<(std::ostream& os, const ConstraintType constraint_type) { - switch (constraint_type) { - case ConstraintType::Null: - os << "NULL"; - break; - case ConstraintType::NotNull: - os << "NOT NULL"; - break; - case ConstraintType::ForeignKey: - os << "FOREIGN KEY"; - break; - case ConstraintType::PrimaryKey: - os << "PRIMARY KEY"; - break; - case ConstraintType::Unique: - os << "UNIQUE"; - break; - } - return os; -} - -// Constraints -TableConstraint::TableConstraint(ConstraintType type, std::vector* columnNames) - : type(type), columnNames(columnNames) {} - -TableConstraint::~TableConstraint() { - for (auto* column : *columnNames) { - free(column); - } - delete columnNames; -} - -// Foreign key constraint -ReferencesSpecification::ReferencesSpecification(char* schema, char* table, std::vector* columns) - : schema{schema}, table{table}, columns{columns} {}; - -ReferencesSpecification::~ReferencesSpecification() { - free(schema); - free(table); - if (columns) { - for (auto* column : *columns) { - free(column); - } - delete columns; - } -} - -ForeignKeyConstraint::ForeignKeyConstraint(std::vector* columnNames, ReferencesSpecification* references) - : TableConstraint(ConstraintType::ForeignKey, columnNames), references{references} {} - -ForeignKeyConstraint::~ForeignKeyConstraint() { delete references; } - -ColumnConstraints::ColumnConstraints() - : constraints{new std::unordered_set()}, references{new std::vector} {} - -// ColumnDefinition -ColumnDefinition::ColumnDefinition(char* name, ColumnType type, std::unordered_set* column_constraints, - std::vector* references) - : column_constraints(column_constraints), name(name), type(type), nullable(true), references(references) {} - -ColumnDefinition::~ColumnDefinition() { - free(name); - delete column_constraints; - if (references) { - for (auto* ref : *references) { - delete ref; - } - } - delete references; -} - -bool ColumnDefinition::trySetNullableExplicit() { - if (column_constraints->count(ConstraintType::NotNull) || column_constraints->count(ConstraintType::PrimaryKey)) { - if (column_constraints->count(ConstraintType::Null)) { - return false; - } - nullable = false; - } - - return true; -} - -// CreateStatemnet -CreateStatement::CreateStatement(CreateType type) - : SQLStatement(kStmtCreate), - type(type), - ifNotExists(false), - filePath(nullptr), - schema(nullptr), - tableName(nullptr), - indexName(nullptr), - indexColumns(nullptr), - columns(nullptr), - tableConstraints(nullptr), - viewColumns(nullptr), - select(nullptr) {} - -CreateStatement::~CreateStatement() { - free(filePath); - free(schema); - free(tableName); - free(indexName); - delete select; - - if (columns) { - for (auto* def : *columns) { - delete def; - } - delete columns; - } - - if (tableConstraints) { - for (auto* def : *tableConstraints) { - delete def; - } - delete tableConstraints; - } - - if (indexColumns) { - for (char* column : *indexColumns) { - free(column); - } - delete indexColumns; - } - - if (viewColumns) { - for (char* column : *viewColumns) { - free(column); - } - delete viewColumns; - } -} - -void CreateStatement::setColumnDefsAndConstraints(std::vector* tableElements) { - columns = new std::vector(); - tableConstraints = new std::vector(); - - for (auto tableElem : *tableElements) { - if (auto* colDef = dynamic_cast(tableElem)) { - columns->emplace_back(colDef); - } else if (auto* tableConstraint = dynamic_cast(tableElem)) { - tableConstraints->emplace_back(tableConstraint); - } - } -} - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/CreateStatement.h b/extern/hyrise_sql_parser/src/sql/CreateStatement.h deleted file mode 100644 index aaad0c24f5..0000000000 --- a/extern/hyrise_sql_parser/src/sql/CreateStatement.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef SQLPARSER_CREATE_STATEMENT_H -#define SQLPARSER_CREATE_STATEMENT_H - -#include "ColumnType.h" -#include "SQLStatement.h" - -#include -#include - -namespace hsql { -struct SelectStatement; - -enum struct ConstraintType { ForeignKey, NotNull, Null, PrimaryKey, Unique }; -std::ostream& operator<<(std::ostream& os, const ConstraintType constraint_type); - -// Superclass for both TableConstraint and ColumnDefinition. -struct TableElement { - virtual ~TableElement() = default; -}; - -// Represents definition of a table constraint. -struct TableConstraint : TableElement { - TableConstraint(ConstraintType keyType, std::vector* columnNames); - - ~TableConstraint() override; - - ConstraintType type; - std::vector* columnNames; -}; - -// Table and columns referenced by foreign key constraint on table or column level. -struct ReferencesSpecification { - ReferencesSpecification(char* schema, char* table, std::vector* columns); - ~ReferencesSpecification(); - - char* schema; - char* table; - std::vector* columns; -}; - -// Foreign key constraint on table level (when specified as table element). -struct ForeignKeyConstraint : TableConstraint { - ForeignKeyConstraint(std::vector* columnNames, ReferencesSpecification* references); - ~ForeignKeyConstraint() override; - - ReferencesSpecification* references; -}; - -// Represents definition of a table column -struct ColumnDefinition : TableElement { - ColumnDefinition(char* name, ColumnType type, std::unordered_set* column_constraints, - std::vector* references); - ~ColumnDefinition() override; - - // By default, columns are nullable. However, we track if a column is explicitly requested to be nullable to - // notice conflicts with PRIMARY KEY table constraints. - bool trySetNullableExplicit(); - - std::unordered_set* column_constraints; - char* name; - ColumnType type; - bool nullable; - std::vector* references; -}; - -struct ColumnConstraints { - explicit ColumnConstraints(); - - std::unordered_set* constraints; - std::vector* references; -}; - -enum CreateType { - kCreateTable, - kCreateTableFromTbl, // Hyrise file format - kCreateView, - kCreateIndex -}; - -// Represents SQL Create statements. -// Example: "CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE)" -struct CreateStatement : SQLStatement { - CreateStatement(CreateType type); - ~CreateStatement() override; - - void setColumnDefsAndConstraints(std::vector* tableElements); - - CreateType type; - bool ifNotExists; // default: false - char* filePath; // default: nullptr - char* schema; // default: nullptr - char* tableName; // default: nullptr - char* indexName; // default: nullptr - std::vector* indexColumns; // default: nullptr - std::vector* columns; // default: nullptr - std::vector* tableConstraints; // default: nullptr - std::vector* viewColumns; - SelectStatement* select; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/DeleteStatement.h b/extern/hyrise_sql_parser/src/sql/DeleteStatement.h deleted file mode 100644 index dfa00fd824..0000000000 --- a/extern/hyrise_sql_parser/src/sql/DeleteStatement.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SQLPARSER_DELETE_STATEMENT_H -#define SQLPARSER_DELETE_STATEMENT_H - -#include "SQLStatement.h" - -// Note: Implementations of constructors and destructors can be found in statements.cpp. -namespace hsql { - -// Represents SQL Delete statements. -// Example: "DELETE FROM students WHERE grade > 3.0" -// Note: if (expr == nullptr) => delete all rows (truncate) -struct DeleteStatement : SQLStatement { - DeleteStatement(); - ~DeleteStatement() override; - - char* schema; - char* tableName; - Expr* expr; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/DropStatement.h b/extern/hyrise_sql_parser/src/sql/DropStatement.h deleted file mode 100644 index bdb4db7bf8..0000000000 --- a/extern/hyrise_sql_parser/src/sql/DropStatement.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef SQLPARSER_DROP_STATEMENT_H -#define SQLPARSER_DROP_STATEMENT_H - -#include "SQLStatement.h" - -// Note: Implementations of constructors and destructors can be found in statements.cpp. -namespace hsql { - -enum DropType { kDropTable, kDropSchema, kDropIndex, kDropView, kDropPreparedStatement }; - -// Represents SQL Delete statements. -// Example "DROP TABLE students;" -struct DropStatement : SQLStatement { - DropStatement(DropType type); - ~DropStatement() override; - - DropType type; - bool ifExists; - char* schema; - char* name; - char* indexName; -}; - -} // namespace hsql -#endif diff --git a/extern/hyrise_sql_parser/src/sql/ExecuteStatement.h b/extern/hyrise_sql_parser/src/sql/ExecuteStatement.h deleted file mode 100644 index ea039307d7..0000000000 --- a/extern/hyrise_sql_parser/src/sql/ExecuteStatement.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef SQLPARSER_EXECUTE_STATEMENT_H -#define SQLPARSER_EXECUTE_STATEMENT_H - -#include "SQLStatement.h" - -namespace hsql { - -// Represents SQL Execute statements. -// Example: "EXECUTE ins_prep(100, "test", 2.3);" -struct ExecuteStatement : SQLStatement { - ExecuteStatement(); - ~ExecuteStatement() override; - - char* name; - std::vector* parameters; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/ExportStatement.h b/extern/hyrise_sql_parser/src/sql/ExportStatement.h deleted file mode 100644 index bd7ef3ac2d..0000000000 --- a/extern/hyrise_sql_parser/src/sql/ExportStatement.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef SQLPARSER_EXPORT_STATEMENT_H -#define SQLPARSER_EXPORT_STATEMENT_H - -#include "ImportExportOptions.h" -#include "SQLStatement.h" -#include "SelectStatement.h" - -namespace hsql { -// Represents SQL Export statements. -struct ExportStatement : SQLStatement { - ExportStatement(ImportType type); - ~ExportStatement() override; - - // ImportType is used for compatibility reasons - ImportType type; - char* filePath; - char* schema; - char* tableName; - SelectStatement* select; - char* encoding; - CsvOptions* csv_options; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/Expr.cpp b/extern/hyrise_sql_parser/src/sql/Expr.cpp deleted file mode 100644 index 131ed837e4..0000000000 --- a/extern/hyrise_sql_parser/src/sql/Expr.cpp +++ /dev/null @@ -1,339 +0,0 @@ -#include "Expr.h" - -#include -#include -#include - -#include "SelectStatement.h" - -namespace hsql { - -FrameBound::FrameBound(int64_t offset, FrameBoundType type, bool unbounded) - : offset{offset}, type{type}, unbounded{unbounded} {} - -FrameDescription::FrameDescription(FrameType type, FrameBound* start, FrameBound* end) - : type{type}, start{start}, end{end} {} - -FrameDescription::~FrameDescription() { - delete start; - delete end; -} - -WindowDescription::WindowDescription(std::vector* partitionList, std::vector* orderList, - FrameDescription* frameDescription) - : partitionList{partitionList}, orderList{orderList}, frameDescription{frameDescription} {} - -WindowDescription::~WindowDescription() { - if (partitionList) { - for (Expr* e : *partitionList) { - delete e; - } - delete partitionList; - } - - if (orderList) { - for (OrderDescription* orderDescription : *orderList) { - delete orderDescription; - } - delete orderList; - } - - delete frameDescription; -} - -Expr::Expr(ExprType type) - : type(type), - expr(nullptr), - expr2(nullptr), - exprList(nullptr), - select(nullptr), - name(nullptr), - table(nullptr), - schema(nullptr), - alias(nullptr), - fval(0), - ival(0), - ival2(0), - datetimeField(kDatetimeNone), - columnType(DataType::UNKNOWN, 0), - isBoolLiteral(false), - opType(kOpNone), - distinct(false), - windowDescription(nullptr) {} - -Expr::~Expr() { - delete expr; - delete expr2; - delete select; - delete windowDescription; - - free(name); - free(table); - free(schema); - free(alias); - - if (exprList) { - for (Expr* e : *exprList) { - delete e; - } - delete exprList; - } -} - -Expr* Expr::make(ExprType type) { - Expr* e = new Expr(type); - return e; -} - -Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) { - Expr* e = new Expr(kExprOperator); - e->opType = op; - e->expr = expr; - e->expr2 = nullptr; - return e; -} - -Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) { - Expr* e = new Expr(kExprOperator); - e->opType = op; - e->expr = expr1; - e->expr2 = expr2; - return e; -} - -Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) { - Expr* e = new Expr(kExprOperator); - e->expr = expr; - e->opType = kOpBetween; - e->exprList = new std::vector(); - e->exprList->push_back(left); - e->exprList->push_back(right); - return e; -} - -Expr* Expr::makeCaseList(Expr* caseListElement) { - Expr* e = new Expr(kExprOperator); - // Case list expressions are temporary and will be integrated into the case - // expressions exprList - thus assign operator type kOpNone - e->opType = kOpNone; - e->exprList = new std::vector(); - e->exprList->push_back(caseListElement); - return e; -} - -Expr* Expr::makeCaseListElement(Expr* when, Expr* then) { - Expr* e = new Expr(kExprOperator); - e->opType = kOpCaseListElement; - e->expr = when; - e->expr2 = then; - return e; -} - -Expr* Expr::caseListAppend(Expr* caseList, Expr* caseListElement) { - caseList->exprList->push_back(caseListElement); - return caseList; -} - -Expr* Expr::makeCase(Expr* expr, Expr* caseList, Expr* elseExpr) { - Expr* e = new Expr(kExprOperator); - e->opType = kOpCase; - e->expr = expr; - e->expr2 = elseExpr; - e->exprList = caseList->exprList; - caseList->exprList = nullptr; - delete caseList; - return e; -} - -Expr* Expr::makeLiteral(int64_t val) { - Expr* e = new Expr(kExprLiteralInt); - e->ival = val; - return e; -} - -Expr* Expr::makeLiteralIntString(char* val) { - Expr* e = new Expr(kExprLiteralIntString); - e->name = val; - return e; -} - -Expr* Expr::makeLiteral(double value) { - Expr* e = new Expr(kExprLiteralFloat); - e->fval = value; - return e; -} - -Expr* Expr::makeLiteral(char* string) { - Expr* e = new Expr(kExprLiteralString); - e->name = string; - return e; -} - -Expr* Expr::makeLiteral(bool val) { - Expr* e = new Expr(kExprLiteralInt); - e->ival = (int)val; - e->isBoolLiteral = true; - return e; -} - -Expr* Expr::makeNullLiteral() { - Expr* e = new Expr(kExprLiteralNull); - return e; -} - -Expr* Expr::makeDateLiteral(char* string) { - Expr* e = new Expr(kExprLiteralDate); - e->name = string; - return e; -} - -Expr* Expr::makeIntervalLiteral(int64_t duration, DatetimeField unit) { - Expr* e = new Expr(kExprLiteralInterval); - e->ival = duration; - e->datetimeField = unit; - return e; -} - -Expr* Expr::makeColumnRef(char* name) { - Expr* e = new Expr(kExprColumnRef); - e->name = name; - return e; -} - -Expr* Expr::makeColumnRef(char* table, char* name) { - Expr* e = new Expr(kExprColumnRef); - e->name = name; - e->table = table; - return e; -} - -Expr* Expr::makeColumnRef(char* schema, char* table, char* name) { - Expr* e = new Expr(kExprColumnRef); - e->name = name; - e->table = table; - e->schema = schema; - return e; -} - -Expr* Expr::makeStar(void) { - Expr* e = new Expr(kExprStar); - return e; -} - -Expr* Expr::makeStar(char* table) { - Expr* e = new Expr(kExprStar); - e->table = table; - return e; -} - -Expr* Expr::makeFunctionRef(char* func_name, std::vector* exprList, bool distinct, WindowDescription* window) { - Expr* e = new Expr(kExprFunctionRef); - e->name = func_name; - e->exprList = exprList; - e->distinct = distinct; - e->windowDescription = window; - return e; -} - -Expr* Expr::makeFunctionRef(char* func_name, char* schema, std::vector* exprList, bool distinct, WindowDescription* window) { - Expr* e = new Expr(kExprFunctionRef); - e->name = func_name; - e->schema = schema; - e->exprList = exprList; - e->distinct = distinct; - e->windowDescription = window; - return e; -} - -Expr* Expr::makeArray(std::vector* exprList) { - Expr* e = new Expr(kExprArray); - e->exprList = exprList; - return e; -} - -Expr* Expr::makeArrayIndex(Expr* expr, int64_t index) { - Expr* e = new Expr(kExprArrayIndex); - e->expr = expr; - e->ival = index; - return e; -} - -Expr* Expr::makeParameter(int id) { - Expr* e = new Expr(kExprParameter); - e->ival = id; - return e; -} - -Expr* Expr::makeSelect(SelectStatement* select) { - Expr* e = new Expr(kExprSelect); - e->select = select; - return e; -} - -Expr* Expr::makeExists(SelectStatement* select) { - Expr* e = new Expr(kExprOperator); - e->opType = kOpExists; - e->select = select; - return e; -} - -Expr* Expr::makeInOperator(Expr* expr, std::vector* exprList) { - Expr* e = new Expr(kExprOperator); - e->opType = kOpIn; - e->expr = expr; - e->exprList = exprList; - - return e; -} - -Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) { - Expr* e = new Expr(kExprOperator); - e->opType = kOpIn; - e->expr = expr; - e->select = select; - - return e; -} - -Expr* Expr::makeExtract(DatetimeField datetimeField, Expr* expr) { - Expr* e = new Expr(kExprExtract); - e->datetimeField = datetimeField; - e->expr = expr; - return e; -} - -Expr* Expr::makeCast(Expr* expr, ColumnType columnType) { - Expr* e = new Expr(kExprCast); - e->columnType = columnType; - e->expr = expr; - return e; -} - -bool Expr::isType(ExprType exprType) const { return exprType == type; } - -bool Expr::isLiteral() const { - return isType(kExprLiteralInt) || isType(kExprLiteralIntString) || isType(kExprLiteralFloat) || - isType(kExprLiteralString) || isType(kExprParameter) || isType(kExprLiteralNull) || - isType(kExprLiteralDate) || isType(kExprLiteralInterval); -} - -bool Expr::hasAlias() const { return alias != nullptr; } - -bool Expr::hasTable() const { return table != nullptr; } - -const char* Expr::getName() const { - if (alias) - return alias; - else - return name; -} - -char* substr(const char* source, int from, int to) { - int len = to - from; - char* copy = (char*)malloc(len + 1); - ; - strncpy(copy, source + from, len); - copy[len] = '\0'; - return copy; -} -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/Expr.h b/extern/hyrise_sql_parser/src/sql/Expr.h deleted file mode 100644 index e1b8d96112..0000000000 --- a/extern/hyrise_sql_parser/src/sql/Expr.h +++ /dev/null @@ -1,253 +0,0 @@ -#ifndef SQLPARSER_EXPR_H -#define SQLPARSER_EXPR_H - -#include -#include -#include -#include "ColumnType.h" - -namespace hsql { -struct SelectStatement; -struct OrderDescription; - -// Helper function used by the lexer. -// TODO: move to more appropriate place. -char* substr(const char* source, int from, int to); - -enum ExprType { - kExprLiteralFloat, - kExprLiteralString, - kExprLiteralInt, - kExprLiteralIntString, - kExprLiteralNull, - kExprLiteralDate, - kExprLiteralInterval, - kExprStar, - kExprParameter, - kExprColumnRef, - kExprFunctionRef, - kExprOperator, - kExprSelect, - kExprHint, - kExprArray, - kExprArrayIndex, - kExprExtract, - kExprCast -}; - -// Operator types. These are important for expressions of type kExprOperator. -enum OperatorType { - kOpNone, - - // Ternary operator - kOpBetween, - - // n-nary special case - kOpCase, - kOpCaseListElement, // `WHEN expr THEN expr` - - // Binary operators. - kOpPlus, - kOpMinus, - kOpAsterisk, - kOpSlash, - kOpPercentage, - kOpMod, - kOpDiv, - kOpCaret, - kOpBitAnd, - kOpBitOr, - kOpBitXor, - kOpBitShiftLeft, - kOpBitShiftRight, - - kOpEquals, - kOpNullSafeEquals, - kOpNotEquals, - kOpLess, - kOpLessEq, - kOpGreater, - kOpGreaterEq, - kOpLike, - kOpNotLike, - kOpILike, - kOpAnd, - kOpOr, - kOpIn, - kOpConcat, - - // Unary operators. - kOpNot, - kOpUnaryMinus, - kOpIsNull, - kOpExists -}; - -enum DatetimeField { - kDatetimeNone, - kDatetimeSecond, - kDatetimeMinute, - kDatetimeHour, - kDatetimeDay, - kDatetimeMonth, - kDatetimeYear, -}; - -// Description of the frame clause within a window expression. -enum FrameBoundType { kFollowing, kPreceding, kCurrentRow }; -struct FrameBound { - FrameBound(int64_t offset, FrameBoundType type, bool unbounded); - - int64_t offset; - FrameBoundType type; - bool unbounded; -}; - -enum FrameType { kRange, kRows, kGroups }; -struct FrameDescription { - FrameDescription(FrameType type, FrameBound* start, FrameBound* end); - virtual ~FrameDescription(); - - FrameType type; - FrameBound* start; - FrameBound* end; -}; - -typedef struct Expr Expr; - -// Description of additional fields for a window expression. -struct WindowDescription { - WindowDescription(std::vector* partitionList, std::vector* orderList, - FrameDescription* frameDescription); - virtual ~WindowDescription(); - - std::vector* partitionList; - std::vector* orderList; - FrameDescription* frameDescription; -}; - -// Represents SQL expressions (i.e. literals, operators, column_refs). -// TODO: When destructing a placeholder expression, we might need to alter the -// placeholder_list. -struct Expr { - Expr(ExprType type); - virtual ~Expr(); - - ExprType type; - - // TODO: Replace expressions by list. - Expr* expr; - Expr* expr2; - std::vector* exprList; - SelectStatement* select; - char* name; - char* table; - char* schema; - char* alias; - double fval; - int64_t ival; - int64_t ival2; - DatetimeField datetimeField; - ColumnType columnType; - bool isBoolLiteral; - - OperatorType opType; - bool distinct; - - WindowDescription* windowDescription; - - // Convenience accessor methods. - - bool isType(ExprType exprType) const; - - bool isLiteral() const; - - bool hasAlias() const; - - bool hasTable() const; - - const char* getName() const; - - // Static constructors. - - static Expr* make(ExprType type); - - static Expr* makeOpUnary(OperatorType op, Expr* expr); - - static Expr* makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2); - - static Expr* makeBetween(Expr* expr, Expr* left, Expr* right); - - static Expr* makeCaseList(Expr* caseListElement); - - static Expr* makeCaseListElement(Expr* when, Expr* then); - - static Expr* caseListAppend(Expr* caseList, Expr* caseListElement); - - static Expr* makeCase(Expr* expr, Expr* when, Expr* elseExpr); - - static Expr* makeLiteral(int64_t val); - - static Expr* makeLiteralIntString(char* val); - - static Expr* makeLiteral(double val); - - static Expr* makeLiteral(char* val); - - static Expr* makeLiteral(bool val); - - static Expr* makeNullLiteral(); - - static Expr* makeDateLiteral(char* val); - - static Expr* makeIntervalLiteral(int64_t duration, DatetimeField unit); - - static Expr* makeColumnRef(char* name); - - static Expr* makeColumnRef(char* table, char* name); - - static Expr* makeColumnRef(char* schema, char* table, char* name); - - static Expr* makeStar(void); - - static Expr* makeStar(char* table); - - static Expr* makeFunctionRef(char* func_name, std::vector* exprList, bool distinct, WindowDescription* window); - - static Expr* makeFunctionRef(char* func_name, char* schema, std::vector* exprList, bool distinct, WindowDescription* window); - - static Expr* makeArray(std::vector* exprList); - - static Expr* makeArrayIndex(Expr* expr, int64_t index); - - static Expr* makeParameter(int id); - - static Expr* makeSelect(SelectStatement* select); - - static Expr* makeExists(SelectStatement* select); - - static Expr* makeInOperator(Expr* expr, std::vector* exprList); - - static Expr* makeInOperator(Expr* expr, SelectStatement* select); - - static Expr* makeExtract(DatetimeField datetimeField1, Expr* expr); - - static Expr* makeCast(Expr* expr, ColumnType columnType); -}; - -// Zero initializes an Expr object and assigns it to a space in the heap -// For Hyrise we still had to put in the explicit NULL constructor -// http://www.ex-parrot.com/~chris/random/initialise.html -// Unused -#define ALLOC_EXPR(var, type) \ - Expr* var; \ - do { \ - Expr zero = {type}; \ - var = (Expr*)malloc(sizeof *var); \ - *var = zero; \ - } while (0); -#undef ALLOC_EXPR - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/ImportExportOptions.h b/extern/hyrise_sql_parser/src/sql/ImportExportOptions.h deleted file mode 100644 index cd0fa31ff2..0000000000 --- a/extern/hyrise_sql_parser/src/sql/ImportExportOptions.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef SQLPARSER_IMPORT_EXPORT_OPTIONS_H -#define SQLPARSER_IMPORT_EXPORT_OPTIONS_H - -#include - -namespace hsql { - -// Name unchanged for compatibility. Historically, this was only used for import statements before we introduced export -// statements (`COPY ... TO`). We did not change the enum name to accomodate forks. In the grammar, however, we call the -// corresponding terminal symbol `file_type` and use it for both `ImportStatement` and `ExportStatement`. -enum ImportType { - kImportCSV, - kImportTbl, // Hyrise file format. - kImportBinary, - kImportAuto -}; - -enum CsvOptionType { - Delimiter, - Null, - Quote, -}; - -struct CsvOptions { - CsvOptions(); - ~CsvOptions(); - - char* delimiter; - char* null; - char* quote; - - bool accept_csv_option(std::pair* option); -}; - -struct ImportExportOptions { - ImportExportOptions(); - ~ImportExportOptions(); - - ImportType format; - char* encoding; - CsvOptions* csv_options; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/ImportStatement.h b/extern/hyrise_sql_parser/src/sql/ImportStatement.h deleted file mode 100644 index b3119decca..0000000000 --- a/extern/hyrise_sql_parser/src/sql/ImportStatement.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef SQLPARSER_IMPORT_STATEMENT_H -#define SQLPARSER_IMPORT_STATEMENT_H - -#include "ImportExportOptions.h" -#include "SQLStatement.h" - -namespace hsql { - -// Represents SQL Import statements. -struct ImportStatement : SQLStatement { - ImportStatement(ImportType type); - ~ImportStatement() override; - - ImportType type; - char* filePath; - char* schema; - char* tableName; - Expr* whereClause; - char* encoding; - CsvOptions* csv_options; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/InsertStatement.h b/extern/hyrise_sql_parser/src/sql/InsertStatement.h deleted file mode 100644 index deb6fabf2b..0000000000 --- a/extern/hyrise_sql_parser/src/sql/InsertStatement.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef SQLPARSER_INSERT_STATEMENT_H -#define SQLPARSER_INSERT_STATEMENT_H - -#include "SQLStatement.h" -#include "SelectStatement.h" - -namespace hsql { -enum InsertType { kInsertValues, kInsertSelect }; - -// Represents SQL Insert statements. -// Example: "INSERT INTO students VALUES ('Max', 1112233, 'Musterhausen', 2.3)" -struct InsertStatement : SQLStatement { - InsertStatement(InsertType type); - ~InsertStatement() override; - - InsertType type; - char* schema; - char* tableName; - std::vector* columns; - std::vector* values; - SelectStatement* select; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp b/extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp deleted file mode 100644 index ff662fb33c..0000000000 --- a/extern/hyrise_sql_parser/src/sql/PrepareStatement.cpp +++ /dev/null @@ -1,12 +0,0 @@ - -#include "PrepareStatement.h" - -namespace hsql { -// PrepareStatement -PrepareStatement::PrepareStatement() : SQLStatement(kStmtPrepare), name(nullptr), query(nullptr) {} - -PrepareStatement::~PrepareStatement() { - free(name); - free(query); -} -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/PrepareStatement.h b/extern/hyrise_sql_parser/src/sql/PrepareStatement.h deleted file mode 100644 index 24f388e98a..0000000000 --- a/extern/hyrise_sql_parser/src/sql/PrepareStatement.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef SQLPARSER_PREPARE_STATEMENT_H -#define SQLPARSER_PREPARE_STATEMENT_H - -#include "SQLStatement.h" - -namespace hsql { - -// Represents SQL Prepare statements. -// Example: PREPARE test FROM 'SELECT * FROM test WHERE a = ?;' -struct PrepareStatement : SQLStatement { - PrepareStatement(); - ~PrepareStatement() override; - - char* name; - - // The query that is supposed to be prepared. - char* query; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/SQLStatement.cpp b/extern/hyrise_sql_parser/src/sql/SQLStatement.cpp deleted file mode 100644 index 52ecbec4ab..0000000000 --- a/extern/hyrise_sql_parser/src/sql/SQLStatement.cpp +++ /dev/null @@ -1,24 +0,0 @@ - -#include "SQLStatement.h" - -namespace hsql { - -// SQLStatement -SQLStatement::SQLStatement(StatementType type) : hints(nullptr), type_(type) {} - -SQLStatement::~SQLStatement() { - if (hints) { - for (Expr* hint : *hints) { - delete hint; - } - } - delete hints; -} - -StatementType SQLStatement::type() const { return type_; } - -bool SQLStatement::isType(StatementType type) const { return (type_ == type); } - -bool SQLStatement::is(StatementType type) const { return isType(type); } - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/SQLStatement.h b/extern/hyrise_sql_parser/src/sql/SQLStatement.h deleted file mode 100644 index 8c941ac1cd..0000000000 --- a/extern/hyrise_sql_parser/src/sql/SQLStatement.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef SQLPARSER_SQLSTATEMENT_H -#define SQLPARSER_SQLSTATEMENT_H - -#include - -#include "Expr.h" - -namespace hsql { -enum StatementType { - kStmtError, // unused - kStmtSelect, - kStmtImport, - kStmtInsert, - kStmtUpdate, - kStmtDelete, - kStmtCreate, - kStmtDrop, - kStmtPrepare, - kStmtExecute, - kStmtExport, - kStmtRename, - kStmtAlter, - kStmtShow, - kStmtTransaction -}; - -// Base struct for every SQL statement -struct SQLStatement { - SQLStatement(StatementType type); - - virtual ~SQLStatement(); - - StatementType type() const; - - bool isType(StatementType type) const; - - // Shorthand for isType(type). - bool is(StatementType type) const; - - // Length of the string in the SQL query string - size_t stringLength; - - std::vector* hints; - - private: - StatementType type_; -}; - -} // namespace hsql - -#endif // SQLPARSER_SQLSTATEMENT_H diff --git a/extern/hyrise_sql_parser/src/sql/SelectStatement.h b/extern/hyrise_sql_parser/src/sql/SelectStatement.h deleted file mode 100644 index 88c4669aa8..0000000000 --- a/extern/hyrise_sql_parser/src/sql/SelectStatement.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef SQLPARSER_SELECT_STATEMENT_H -#define SQLPARSER_SELECT_STATEMENT_H - -#include "Expr.h" -#include "SQLStatement.h" -#include "Table.h" - -namespace hsql { -enum OrderType { kOrderAsc, kOrderDesc }; -enum NullOrdering { Undefined, First, Last }; - -enum SetType { kSetUnion, kSetIntersect, kSetExcept }; - -enum RowLockMode { ForUpdate, ForNoKeyUpdate, ForShare, ForKeyShare }; -enum RowLockWaitPolicy { NoWait, SkipLocked, None }; - -// Description of the order by clause within a select statement. -struct OrderDescription { - OrderDescription(OrderType type, Expr* expr, NullOrdering null_ordering); - virtual ~OrderDescription(); - - OrderType type; - Expr* expr; - NullOrdering null_ordering; -}; - -// Description of the limit clause within a select statement. -struct LimitDescription { - LimitDescription(Expr* limit, Expr* offset); - virtual ~LimitDescription(); - - Expr* limit; - Expr* offset; -}; - -// Description of the group-by clause within a select statement. -struct GroupByDescription { - GroupByDescription(); - virtual ~GroupByDescription(); - - std::vector* columns; - Expr* having; -}; - -struct WithDescription { - ~WithDescription(); - - char* alias; - SelectStatement* select; -}; - -struct SetOperation { - SetOperation(); - virtual ~SetOperation(); - - SetType setType; - bool isAll; - - SelectStatement* nestedSelectStatement; - std::vector* resultOrder; - LimitDescription* resultLimit; -}; - -struct LockingClause { - RowLockMode rowLockMode; - RowLockWaitPolicy rowLockWaitPolicy; - std::vector* tables; -}; - -// Representation of a full SQL select statement. -struct SelectStatement : SQLStatement { - SelectStatement(); - ~SelectStatement() override; - - TableRef* fromTable; - bool selectDistinct; - std::vector* selectList; - Expr* whereClause; - GroupByDescription* groupBy; - Expr* having; - - // Note that a SetOperation is always connected to a - // different SelectStatement. This statement can itself - // have SetOperation connections to other SelectStatements. - // To evaluate the operations in the correct order: - // Iterate over the setOperations vector: - // 1. Fully evaluate the nestedSelectStatement within the SetOperation - // 2. Connect the original statement with the - // evaluated nestedSelectStatement - // 3. Apply the resultOrder and the resultLimit - // 4. The result now functions as the the original statement - // for the next iteration - // - // Example: - // - // (SELECT * FROM students INTERSECT SELECT * FROM students_2) UNION SELECT * FROM students_3 ORDER BY grade ASC; - // - // 1. We evaluate `Select * FROM students` - // 2. Then we iterate over the setOperations vector - // 3. We evalute the nestedSelectStatement of the first entry, which is: `SELECT * FROM students_2` - // 4. We connect the result of 1. with the results of 3. using the setType, which is INTERSECT - // 5. We continue the iteration of the setOperations vector - // 6. We evaluate the new nestedSelectStatement which is: `SELECT * FROM students_3` - // 7. We apply a Union-Operation to connect the results of 4. and 6. - // 8. Finally, we apply the resultOrder of the last SetOperation (ORDER BY grade ASC) - std::vector* setOperations; - - std::vector* order; - std::vector* withDescriptions; - LimitDescription* limit; - std::vector* lockings; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/ShowStatement.h b/extern/hyrise_sql_parser/src/sql/ShowStatement.h deleted file mode 100644 index f67599f5b0..0000000000 --- a/extern/hyrise_sql_parser/src/sql/ShowStatement.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SQLPARSER_SHOW_STATEMENT_H -#define SQLPARSER_SHOW_STATEMENT_H - -#include "SQLStatement.h" - -// Note: Implementations of constructors and destructors can be found in statements.cpp. -namespace hsql { - -enum ShowType { kShowColumns, kShowTables }; - -// Represents SQL SHOW statements. -// Example "SHOW TABLES;" -struct ShowStatement : SQLStatement { - ShowStatement(ShowType type); - ~ShowStatement() override; - - ShowType type; - char* schema; - char* name; -}; - -} // namespace hsql -#endif diff --git a/extern/hyrise_sql_parser/src/sql/Table.h b/extern/hyrise_sql_parser/src/sql/Table.h deleted file mode 100644 index de49d89db1..0000000000 --- a/extern/hyrise_sql_parser/src/sql/Table.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef SQLPARSER_TABLEREF_H -#define SQLPARSER_TABLEREF_H - -#include -#include -#include "Expr.h" - -namespace hsql { - -struct SelectStatement; -struct JoinDefinition; -struct TableRef; - -// Possible table reference types. -enum TableRefType { kTableName, kTableSelect, kTableJoin, kTableCrossProduct }; - -struct TableName { - char* schema; - char* name; -}; - -struct Alias { - Alias(char* name, std::vector* columns = nullptr); - ~Alias(); - - char* name; - std::vector* columns; -}; - -// Holds reference to tables. Can be either table names or a select statement. -struct TableRef { - TableRef(TableRefType type); - virtual ~TableRef(); - - TableRefType type; - - char* schema; - char* name; - Alias* alias; - - SelectStatement* select; - std::vector* list; - JoinDefinition* join; - - // Returns true if a schema is set. - bool hasSchema() const; - - // Returns the alias, if it is set. Otherwise the name. - const char* getName() const; -}; - -// Possible types of joins. -enum JoinType { kJoinInner, kJoinFull, kJoinLeft, kJoinRight, kJoinCross, kJoinNatural }; - -// Definition of a join construct. -struct JoinDefinition { - JoinDefinition(); - virtual ~JoinDefinition(); - - TableRef* left; - TableRef* right; - Expr* condition; - std::vector* namedColumns; - - JoinType type; - bool natural; -}; - -} // namespace hsql -#endif diff --git a/extern/hyrise_sql_parser/src/sql/TransactionStatement.h b/extern/hyrise_sql_parser/src/sql/TransactionStatement.h deleted file mode 100644 index 174b990e57..0000000000 --- a/extern/hyrise_sql_parser/src/sql/TransactionStatement.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef HYRISE_TRANSACTIONSTATEMENT_H -#define HYRISE_TRANSACTIONSTATEMENT_H - -#include "SQLStatement.h" - -namespace hsql { - -// Represents SQL Transaction statements. -// Example: BEGIN TRANSACTION; -enum TransactionCommand { kBeginTransaction, kCommitTransaction, kRollbackTransaction }; - -struct TransactionStatement : SQLStatement { - TransactionStatement(TransactionCommand command); - ~TransactionStatement() override; - - TransactionCommand command; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/UpdateStatement.h b/extern/hyrise_sql_parser/src/sql/UpdateStatement.h deleted file mode 100644 index 6ea9d14f39..0000000000 --- a/extern/hyrise_sql_parser/src/sql/UpdateStatement.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SQLPARSER_UPDATE_STATEMENT_H -#define SQLPARSER_UPDATE_STATEMENT_H - -#include "SQLStatement.h" - -namespace hsql { - -// Represents "column = value" expressions. -struct UpdateClause { - char* column; - Expr* value; -}; - -// Represents SQL Update statements. -struct UpdateStatement : SQLStatement { - UpdateStatement(); - ~UpdateStatement() override; - - // TODO: switch to char* instead of TableRef - TableRef* table; - std::vector* updates; - Expr* where; -}; - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/src/sql/statements.cpp b/extern/hyrise_sql_parser/src/sql/statements.cpp deleted file mode 100644 index 53c7337dfd..0000000000 --- a/extern/hyrise_sql_parser/src/sql/statements.cpp +++ /dev/null @@ -1,442 +0,0 @@ -#include "statements.h" - -#include - -#include "AlterStatement.h" -#include "ImportExportOptions.h" - -namespace hsql { - -ColumnType::ColumnType(DataType data_type, int64_t length, int64_t precision, int64_t scale) - : data_type(data_type), length(length), precision(precision), scale(scale) {} - -bool operator==(const ColumnType& lhs, const ColumnType& rhs) { - if (lhs.data_type != rhs.data_type) { - return false; - } - return lhs.length == rhs.length && lhs.precision == rhs.precision && lhs.scale == rhs.scale; -} - -bool operator!=(const ColumnType& lhs, const ColumnType& rhs) { return !(lhs == rhs); } - -std::ostream& operator<<(std::ostream& stream, const ColumnType& column_type) { - switch (column_type.data_type) { - case DataType::UNKNOWN: - stream << "UNKNOWN"; - break; - case DataType::INT: - stream << "INT"; - break; - case DataType::BIGINT: - stream << "BIGINT"; - break; - case DataType::LONG: - stream << "LONG"; - break; - case DataType::FLOAT: - stream << "FLOAT"; - break; - case DataType::DOUBLE: - stream << "DOUBLE"; - break; - case DataType::REAL: - stream << "REAL"; - break; - case DataType::CHAR: - stream << "CHAR(" << column_type.length << ")"; - break; - case DataType::VARCHAR: - stream << "VARCHAR(" << column_type.length << ")"; - break; - case DataType::DECIMAL: - stream << "DECIMAL"; - break; - case DataType::TEXT: - stream << "TEXT"; - break; - case DataType::DATETIME: - stream << "DATETIME"; - break; - case DataType::DATE: - stream << "DATE"; - break; - case DataType::TIME: - stream << "TIME"; - break; - case DataType::SMALLINT: - stream << "SMALLINT"; - break; - case DataType::BOOLEAN: - stream << "BOOLEAN"; - break; - } - return stream; -} - -// DeleteStatement -DeleteStatement::DeleteStatement() : SQLStatement(kStmtDelete), schema(nullptr), tableName(nullptr), expr(nullptr) {} - -DeleteStatement::~DeleteStatement() { - free(schema); - free(tableName); - delete expr; -} - -// DropStatement -DropStatement::DropStatement(DropType type) - : SQLStatement(kStmtDrop), type(type), schema(nullptr), name(nullptr), indexName(nullptr) {} - -DropStatement::~DropStatement() { - free(schema); - free(name); - free(indexName); -} - -// AlterStatement and supportive classes - -AlterAction::AlterAction(ActionType type) : type(type) {} - -AlterAction::~AlterAction() = default; - -DropColumnAction::DropColumnAction(char* column_name) - : AlterAction(ActionType::DropColumn), columnName(column_name), ifExists(false) {} - -DropColumnAction::~DropColumnAction() { free(columnName); } - -AlterStatement::AlterStatement(char* name, AlterAction* action) - : SQLStatement(kStmtAlter), schema(nullptr), ifTableExists(false), name(name), action(action) {} - -AlterStatement::~AlterStatement() { - free(schema); - free(name); - delete action; -} - -// TransactionStatement -TransactionStatement::TransactionStatement(TransactionCommand command) - : SQLStatement(kStmtTransaction), command(command) {} - -TransactionStatement::~TransactionStatement() {} - -// ExecuteStatement -ExecuteStatement::ExecuteStatement() : SQLStatement(kStmtExecute), name(nullptr), parameters(nullptr) {} - -ExecuteStatement::~ExecuteStatement() { - free(name); - - if (parameters) { - for (Expr* param : *parameters) { - delete param; - } - delete parameters; - } -} - -// ExportStatement -ExportStatement::ExportStatement(ImportType type) - : SQLStatement(kStmtExport), - type(type), - filePath(nullptr), - schema(nullptr), - tableName(nullptr), - select(nullptr), - encoding(nullptr), - csv_options(nullptr) {} - -ExportStatement::~ExportStatement() { - free(filePath); - free(schema); - free(tableName); - delete select; - free(encoding); - delete csv_options; -} - -CsvOptions::CsvOptions() : delimiter(nullptr), null(nullptr), quote(nullptr) {} -CsvOptions::~CsvOptions() { - free(delimiter); - free(null); - free(quote); -} - -bool CsvOptions::accept_csv_option(std::pair* option) { - switch (option->first) { - case CsvOptionType::Delimiter: - if (delimiter != nullptr) { - return false; - } - delimiter = option->second; - break; - case CsvOptionType::Null: - if (null != nullptr) { - return false; - } - null = option->second; - break; - case CsvOptionType::Quote: - if (quote != nullptr) { - return false; - } - quote = option->second; - break; - } - - return true; -} - -ImportExportOptions::ImportExportOptions() : format(kImportAuto), encoding(nullptr), csv_options(nullptr) {} - -ImportExportOptions::~ImportExportOptions() { - free(encoding); - delete csv_options; -} - -// ImportStatement -ImportStatement::ImportStatement(ImportType type) - : SQLStatement(kStmtImport), - type(type), - filePath(nullptr), - schema(nullptr), - tableName(nullptr), - whereClause(nullptr), - encoding(nullptr), - csv_options(nullptr) {} - -ImportStatement::~ImportStatement() { - free(filePath); - free(schema); - free(tableName); - delete whereClause; - free(encoding); - delete csv_options; -} - -// InsertStatement -InsertStatement::InsertStatement(InsertType type) - : SQLStatement(kStmtInsert), - type(type), - schema(nullptr), - tableName(nullptr), - columns(nullptr), - values(nullptr), - select(nullptr) {} - -InsertStatement::~InsertStatement() { - free(schema); - free(tableName); - delete select; - - if (columns) { - for (char* column : *columns) { - free(column); - } - delete columns; - } - - if (values) { - for (Expr* expr : *values) { - delete expr; - } - delete values; - } -} - -// ShowStatament -ShowStatement::ShowStatement(ShowType type) : SQLStatement(kStmtShow), type(type), schema(nullptr), name(nullptr) {} - -ShowStatement::~ShowStatement() { - free(schema); - free(name); -} - -// SelectStatement.h - -// OrderDescription -OrderDescription::OrderDescription(OrderType type, Expr* expr, NullOrdering null_ordering) - : type(type), expr(expr), null_ordering(null_ordering) {} - -OrderDescription::~OrderDescription() { delete expr; } - -// LimitDescription -LimitDescription::LimitDescription(Expr* limit, Expr* offset) : limit(limit), offset(offset) {} - -LimitDescription::~LimitDescription() { - delete limit; - delete offset; -} - -// GroypByDescription -GroupByDescription::GroupByDescription() : columns(nullptr), having(nullptr) {} - -GroupByDescription::~GroupByDescription() { - delete having; - - if (columns) { - for (Expr* expr : *columns) { - delete expr; - } - delete columns; - } -} - -WithDescription::~WithDescription() { - free(alias); - delete select; -} - -// SelectStatement -SelectStatement::SelectStatement() - : SQLStatement(kStmtSelect), - fromTable(nullptr), - selectDistinct(false), - selectList(nullptr), - whereClause(nullptr), - groupBy(nullptr), - having(nullptr), - setOperations(nullptr), - order(nullptr), - withDescriptions(nullptr), - limit(nullptr), - lockings(nullptr) {} - -SelectStatement::~SelectStatement() { - delete fromTable; - delete whereClause; - delete groupBy; - delete having; - delete limit; - - // Delete each element in the select list. - if (selectList) { - for (Expr* expr : *selectList) { - delete expr; - } - delete selectList; - } - - if (order) { - for (OrderDescription* desc : *order) { - delete desc; - } - delete order; - } - - if (withDescriptions) { - for (WithDescription* desc : *withDescriptions) { - delete desc; - } - delete withDescriptions; - } - - if (setOperations) { - for (SetOperation* setOperation : *setOperations) { - delete setOperation; - } - delete setOperations; - } - - if (lockings) { - for (LockingClause* lockingClause : *lockings) { - if (lockingClause->tables) { - for (char* dtable : *lockingClause->tables) { - free(dtable); - } - delete lockingClause->tables; - } - delete lockingClause; - } - delete lockings; - } -} - -// UpdateStatement -UpdateStatement::UpdateStatement() : SQLStatement(kStmtUpdate), table(nullptr), updates(nullptr), where(nullptr) {} - -UpdateStatement::~UpdateStatement() { - delete table; - delete where; - - if (updates) { - for (UpdateClause* update : *updates) { - free(update->column); - delete update->value; - delete update; - } - delete updates; - } -} - -// Alias -Alias::Alias(char* name, std::vector* columns) : name(name), columns(columns) {} - -Alias::~Alias() { - free(name); - if (columns) { - for (char* column : *columns) { - free(column); - } - delete columns; - } -} - -// TableRef -TableRef::TableRef(TableRefType type) - : type(type), schema(nullptr), name(nullptr), alias(nullptr), select(nullptr), list(nullptr), join(nullptr) {} - -TableRef::~TableRef() { - free(schema); - free(name); - - delete select; - delete join; - delete alias; - - if (list) { - for (TableRef* table : *list) { - delete table; - } - delete list; - } -} - -bool TableRef::hasSchema() const { return schema != nullptr; } - -const char* TableRef::getName() const { - if (alias) - return alias->name; - else - return name; -} - -// JoinDefinition -JoinDefinition::JoinDefinition() - : left(nullptr), right(nullptr), condition(nullptr), namedColumns(nullptr), type(kJoinInner), natural(false) {} - -JoinDefinition::~JoinDefinition() { - delete left; - delete right; - delete condition; - - if (namedColumns) { - for (auto* column : *namedColumns) { - free(column); - } - delete namedColumns; - } -} - -SetOperation::SetOperation() : nestedSelectStatement(nullptr), resultOrder(nullptr), resultLimit(nullptr) {} - -SetOperation::~SetOperation() { - delete nestedSelectStatement; - delete resultLimit; - - if (resultOrder) { - for (OrderDescription* desc : *resultOrder) { - delete desc; - } - delete resultOrder; - } -} - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/sql/statements.h b/extern/hyrise_sql_parser/src/sql/statements.h deleted file mode 100644 index c9ee00ce40..0000000000 --- a/extern/hyrise_sql_parser/src/sql/statements.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef SQLPARSER_STATEMENTS_H -#define SQLPARSER_STATEMENTS_H - -#include "AlterStatement.h" -#include "CreateStatement.h" -#include "DeleteStatement.h" -#include "DropStatement.h" -#include "ExecuteStatement.h" -#include "ExportStatement.h" -#include "ImportStatement.h" -#include "InsertStatement.h" -#include "PrepareStatement.h" -#include "SelectStatement.h" -#include "ShowStatement.h" -#include "TransactionStatement.h" -#include "UpdateStatement.h" - -#endif // SQLPARSER_STATEMENTS_H diff --git a/extern/hyrise_sql_parser/src/util/sqlhelper.cpp b/extern/hyrise_sql_parser/src/util/sqlhelper.cpp deleted file mode 100644 index 563538ba09..0000000000 --- a/extern/hyrise_sql_parser/src/util/sqlhelper.cpp +++ /dev/null @@ -1,509 +0,0 @@ -#include "sqlhelper.h" - -#include -#include -#include -#include -#include - -namespace hsql { - -void printOperatorExpression(Expr* expr, uintmax_t num_indent); -void printAlias(Alias* alias, uintmax_t num_indent); - -std::ostream& operator<<(std::ostream& os, const OperatorType& op); -std::ostream& operator<<(std::ostream& os, const DatetimeField& datetime); -std::ostream& operator<<(std::ostream& os, const FrameBound& frame_bound); - -std::string indent(uintmax_t num_indent) { return std::string(num_indent, '\t'); } -void inprint(int64_t val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << " " << std::endl; } -void inprint(double val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << std::endl; } -void inprint(const char* val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << std::endl; } -void inprint(const char* val, const char* val2, uintmax_t num_indent) { - std::cout << indent(num_indent).c_str() << val << "->" << val2 << std::endl; -} -void inprintC(char val, uintmax_t num_indent) { std::cout << indent(num_indent).c_str() << val << std::endl; } -void inprint(const OperatorType& op, uintmax_t num_indent) { std::cout << indent(num_indent) << op << std::endl; } -void inprint(const ColumnType& colType, uintmax_t num_indent) { - std::cout << indent(num_indent) << colType << std::endl; -} -void inprint(const DatetimeField& colType, uintmax_t num_indent) { - std::cout << indent(num_indent) << colType << std::endl; -} - -void printTableRefInfo(TableRef* table, uintmax_t num_indent) { - switch (table->type) { - case kTableName: - inprint(table->name, num_indent); - if (table->schema) { - inprint("Schema", num_indent + 1); - inprint(table->schema, num_indent + 2); - } - break; - case kTableSelect: - printSelectStatementInfo(table->select, num_indent); - break; - case kTableJoin: - inprint("Join Table", num_indent); - inprint("Left", num_indent + 1); - printTableRefInfo(table->join->left, num_indent + 2); - inprint("Right", num_indent + 1); - printTableRefInfo(table->join->right, num_indent + 2); - inprint("Join Condition", num_indent + 1); - printExpression(table->join->condition, num_indent + 2); - break; - case kTableCrossProduct: - for (TableRef* tbl : *table->list) printTableRefInfo(tbl, num_indent); - break; - } - - if (table->alias) { - printAlias(table->alias, num_indent); - } -} - -void printAlias(Alias* alias, uintmax_t num_indent) { - inprint("Alias", num_indent + 1); - inprint(alias->name, num_indent + 2); - - if (alias->columns) { - for (char* column : *(alias->columns)) { - inprint(column, num_indent + 3); - } - } -} - -void printOperatorExpression(Expr* expr, uintmax_t num_indent) { - if (expr == nullptr) { - inprint("null", num_indent); - return; - } - - inprint(expr->opType, num_indent); - - printExpression(expr->expr, num_indent + 1); - if (expr->expr2) { - printExpression(expr->expr2, num_indent + 1); - } else if (expr->exprList) { - for (Expr* e : *expr->exprList) printExpression(e, num_indent + 1); - } -} - -void printExpression(Expr* expr, uintmax_t num_indent) { - if (!expr) return; - switch (expr->type) { - case kExprStar: - inprint("*", num_indent); - break; - case kExprColumnRef: - inprint(expr->name, num_indent); - if (expr->table) { - inprint("Table:", num_indent + 1); - inprint(expr->table, num_indent + 2); - } - break; - // case kExprTableColumnRef: inprint(expr->table, expr->name, num_indent); break; - case kExprLiteralFloat: - inprint(expr->fval, num_indent); - break; - case kExprLiteralInt: - inprint(expr->ival, num_indent); - break; - case kExprLiteralIntString: - inprint(expr->name, num_indent); - break; - case kExprLiteralString: - inprint(expr->name, num_indent); - break; - case kExprLiteralDate: - inprint(expr->name, num_indent); - break; - case kExprLiteralNull: - inprint("NULL", num_indent); - break; - case kExprLiteralInterval: - inprint("INTERVAL", num_indent); - inprint(expr->ival, num_indent + 1); - inprint(expr->datetimeField, num_indent + 1); - break; - case kExprFunctionRef: - inprint(expr->name, num_indent); - for (Expr* e : *expr->exprList) { - printExpression(e, num_indent + 1); - } - - if (expr->windowDescription) { - printWindowDescription(expr->windowDescription, num_indent + 1); - } - break; - case kExprExtract: - inprint("EXTRACT", num_indent); - inprint(expr->datetimeField, num_indent + 1); - printExpression(expr->expr, num_indent + 1); - break; - case kExprCast: - inprint("CAST", num_indent); - inprint(expr->columnType, num_indent + 1); - printExpression(expr->expr, num_indent + 1); - break; - case kExprOperator: - printOperatorExpression(expr, num_indent); - break; - case kExprSelect: - printSelectStatementInfo(expr->select, num_indent); - break; - case kExprParameter: - inprint(expr->ival, num_indent); - break; - case kExprArray: - for (Expr* e : *expr->exprList) { - printExpression(e, num_indent + 1); - } - break; - case kExprArrayIndex: - printExpression(expr->expr, num_indent + 1); - inprint(expr->ival, num_indent); - break; - default: - std::cerr << "Unrecognized expression type " << expr->type << std::endl; - return; - } - if (expr->alias) { - inprint("Alias", num_indent + 1); - inprint(expr->alias, num_indent + 2); - } -} - -void printOrderBy(const std::vector* expr, uintmax_t num_indent) { - if (!expr) return; - for (const auto& order_description : *expr) { - printExpression(order_description->expr, num_indent); - if (order_description->type == kOrderAsc) { - inprint("ascending", num_indent); - } else { - inprint("descending", num_indent); - } - } -} - -void printWindowDescription(WindowDescription* window_description, uintmax_t num_indent) { - inprint("OVER", num_indent); - if (window_description->partitionList) { - inprint("PARTITION BY", num_indent + 1); - for (const auto e : *window_description->partitionList) { - printExpression(e, num_indent + 2); - } - } - - if (window_description->orderList) { - inprint("ORDER BY", num_indent + 1); - printOrderBy(window_description->orderList, num_indent + 2); - } - - std::stringstream stream; - switch (window_description->frameDescription->type) { - case kRows: - stream << "ROWS"; - break; - case kRange: - stream << "RANGE"; - break; - case kGroups: - stream << "GROUPS"; - break; - } - stream << " BETWEEN " << *window_description->frameDescription->start << " AND " - << *window_description->frameDescription->end; - inprint(stream.str().c_str(), num_indent + 1); -} - -void printSelectStatementInfo(const SelectStatement* stmt, uintmax_t num_indent) { - inprint("SelectStatement", num_indent); - inprint("Fields:", num_indent + 1); - for (Expr* expr : *stmt->selectList) printExpression(expr, num_indent + 2); - - if (stmt->fromTable) { - inprint("Sources:", num_indent + 1); - printTableRefInfo(stmt->fromTable, num_indent + 2); - } - - if (stmt->whereClause) { - inprint("Search Conditions:", num_indent + 1); - printExpression(stmt->whereClause, num_indent + 2); - } - - if (stmt->groupBy) { - inprint("GroupBy:", num_indent + 1); - for (Expr* expr : *stmt->groupBy->columns) printExpression(expr, num_indent + 2); - if (stmt->groupBy->having) { - inprint("Having:", num_indent + 1); - printExpression(stmt->groupBy->having, num_indent + 2); - } - } - if (!stmt->groupBy && stmt->having) { - inprint("Having:", num_indent + 1); - printExpression(stmt->having, num_indent + 2); - } - if (stmt->lockings) { - inprint("Lock Info:", num_indent + 1); - for (LockingClause* lockingClause : *stmt->lockings) { - inprint("Type", num_indent + 2); - if (lockingClause->rowLockMode == RowLockMode::ForUpdate) { - inprint("FOR UPDATE", num_indent + 3); - } else if (lockingClause->rowLockMode == RowLockMode::ForNoKeyUpdate) { - inprint("FOR NO KEY UPDATE", num_indent + 3); - } else if (lockingClause->rowLockMode == RowLockMode::ForShare) { - inprint("FOR SHARE", num_indent + 3); - } else if (lockingClause->rowLockMode == RowLockMode::ForKeyShare) { - inprint("FOR KEY SHARE", num_indent + 3); - } - if (lockingClause->tables) { - inprint("Target tables:", num_indent + 2); - for (char* dtable : *lockingClause->tables) { - inprint(dtable, num_indent + 3); - } - } - if (lockingClause->rowLockWaitPolicy != RowLockWaitPolicy::None) { - inprint("Waiting policy: ", num_indent + 2); - if (lockingClause->rowLockWaitPolicy == RowLockWaitPolicy::NoWait) - inprint("NOWAIT", num_indent + 3); - else - inprint("SKIP LOCKED", num_indent + 3); - } - } - } - - if (stmt->setOperations) { - for (SetOperation* setOperation : *stmt->setOperations) { - switch (setOperation->setType) { - case SetType::kSetIntersect: - inprint("Intersect:", num_indent + 1); - break; - case SetType::kSetUnion: - inprint("Union:", num_indent + 1); - break; - case SetType::kSetExcept: - inprint("Except:", num_indent + 1); - break; - } - - printSelectStatementInfo(setOperation->nestedSelectStatement, num_indent + 2); - - if (setOperation->resultOrder) { - inprint("SetResultOrderBy:", num_indent + 1); - printOrderBy(setOperation->resultOrder, num_indent + 2); - } - - if (setOperation->resultLimit) { - if (setOperation->resultLimit->limit) { - inprint("SetResultLimit:", num_indent + 1); - printExpression(setOperation->resultLimit->limit, num_indent + 2); - } - - if (setOperation->resultLimit->offset) { - inprint("SetResultOffset:", num_indent + 1); - printExpression(setOperation->resultLimit->offset, num_indent + 2); - } - } - } - } - - if (stmt->order) { - inprint("OrderBy:", num_indent + 1); - printOrderBy(stmt->order, num_indent + 2); - } - - if (stmt->limit && stmt->limit->limit) { - inprint("Limit:", num_indent + 1); - printExpression(stmt->limit->limit, num_indent + 2); - } - - if (stmt->limit && stmt->limit->offset) { - inprint("Offset:", num_indent + 1); - printExpression(stmt->limit->offset, num_indent + 2); - } -} - -void printImportStatementInfo(const ImportStatement* stmt, uintmax_t num_indent) { - inprint("ImportStatement", num_indent); - inprint(stmt->filePath, num_indent + 1); - switch (stmt->type) { - case ImportType::kImportCSV: - inprint("CSV", num_indent + 1); - break; - case ImportType::kImportTbl: - inprint("TBL", num_indent + 1); - break; - case ImportType::kImportBinary: - inprint("BINARY", num_indent + 1); - break; - case ImportType::kImportAuto: - inprint("AUTO", num_indent + 1); - break; - } - inprint(stmt->tableName, num_indent + 1); - if (stmt->whereClause) { - inprint("WHERE:", num_indent + 1); - printExpression(stmt->whereClause, num_indent + 2); - } -} - -void printExportStatementInfo(const ExportStatement* stmt, uintmax_t num_indent) { - inprint("ExportStatement", num_indent); - inprint(stmt->filePath, num_indent + 1); - switch (stmt->type) { - case ImportType::kImportCSV: - inprint("CSV", num_indent + 1); - break; - case ImportType::kImportTbl: - inprint("TBL", num_indent + 1); - break; - case ImportType::kImportBinary: - inprint("BINARY", num_indent + 1); - break; - case ImportType::kImportAuto: - inprint("AUTO", num_indent + 1); - break; - } - - if (stmt->tableName) { - inprint(stmt->tableName, num_indent + 1); - } else { - printSelectStatementInfo(stmt->select, num_indent + 1); - } -} - -void printCreateStatementInfo(const CreateStatement* stmt, uintmax_t num_indent) { - inprint("CreateStatement", num_indent); - inprint(stmt->tableName, num_indent + 1); - if (stmt->filePath) inprint(stmt->filePath, num_indent + 1); -} - -void printInsertStatementInfo(const InsertStatement* stmt, uintmax_t num_indent) { - inprint("InsertStatement", num_indent); - inprint(stmt->tableName, num_indent + 1); - if (stmt->columns) { - inprint("Columns", num_indent + 1); - for (char* col_name : *stmt->columns) { - inprint(col_name, num_indent + 2); - } - } - switch (stmt->type) { - case kInsertValues: - inprint("Values", num_indent + 1); - for (Expr* expr : *stmt->values) { - printExpression(expr, num_indent + 2); - } - break; - case kInsertSelect: - printSelectStatementInfo(stmt->select, num_indent + 1); - break; - } -} - -void printTransactionStatementInfo(const TransactionStatement* stmt, uintmax_t num_indent) { - inprint("TransactionStatement", num_indent); - switch (stmt->command) { - case kBeginTransaction: - inprint("BEGIN", num_indent + 1); - break; - case kCommitTransaction: - inprint("COMMIT", num_indent + 1); - break; - case kRollbackTransaction: - inprint("ROLLBACK", num_indent + 1); - break; - } -} - -void printStatementInfo(const SQLStatement* stmt) { - switch (stmt->type()) { - case kStmtSelect: - printSelectStatementInfo((const SelectStatement*)stmt, 0); - break; - case kStmtInsert: - printInsertStatementInfo((const InsertStatement*)stmt, 0); - break; - case kStmtCreate: - printCreateStatementInfo((const CreateStatement*)stmt, 0); - break; - case kStmtImport: - printImportStatementInfo((const ImportStatement*)stmt, 0); - break; - case kStmtExport: - printExportStatementInfo((const ExportStatement*)stmt, 0); - break; - case kStmtTransaction: - printTransactionStatementInfo((const TransactionStatement*)stmt, 0); - break; - default: - break; - } -} - -std::ostream& operator<<(std::ostream& os, const OperatorType& op) { - static const std::map operatorToToken = { - {kOpNone, "None"}, {kOpBetween, "BETWEEN"}, - {kOpCase, "CASE"}, {kOpCaseListElement, "CASE LIST ELEMENT"}, - {kOpPlus, "+"}, {kOpMinus, "-"}, - {kOpAsterisk, "*"}, {kOpSlash, "/"}, - {kOpPercentage, "%"}, {kOpCaret, "^"}, - {kOpMod, "MOD"}, {kOpDiv, "DIV"}, - {kOpBitAnd, "&"}, {kOpBitOr, "|"}, - {kOpBitXor, "^"}, {kOpBitShiftLeft, "<<"}, - {kOpBitShiftRight, ">>"}, - {kOpEquals, "="}, {kOpNotEquals, "!="}, - {kOpLess, "<"}, {kOpLessEq, "<="}, - {kOpGreater, ">"}, {kOpGreaterEq, ">="}, - {kOpLike, "LIKE"}, {kOpNotLike, "NOT LIKE"}, - {kOpILike, "ILIKE"}, {kOpAnd, "AND"}, - {kOpOr, "OR"}, {kOpIn, "IN"}, - {kOpConcat, "CONCAT"}, {kOpNot, "NOT"}, - {kOpUnaryMinus, "-"}, {kOpIsNull, "IS NULL"}, - {kOpExists, "EXISTS"}}; - - const auto found = operatorToToken.find(op); - if (found == operatorToToken.cend()) { - return os << static_cast(op); - } else { - return os << (*found).second; - } -} - -std::ostream& operator<<(std::ostream& os, const DatetimeField& datetime) { - static const std::map operatorToToken = { - {kDatetimeNone, "None"}, {kDatetimeSecond, "SECOND"}, {kDatetimeMinute, "MINUTE"}, {kDatetimeHour, "HOUR"}, - {kDatetimeDay, "DAY"}, {kDatetimeMonth, "MONTH"}, {kDatetimeYear, "YEAR"}}; - - const auto found = operatorToToken.find(datetime); - if (found == operatorToToken.cend()) { - return os << static_cast(datetime); - } else { - return os << (*found).second; - } -} - -std::ostream& operator<<(std::ostream& os, const FrameBound& frame_bound) { - if (frame_bound.type == kCurrentRow) { - os << "CURRENT ROW"; - return os; - } - - if (frame_bound.unbounded) { - os << "UNBOUNDED"; - } else { - os << frame_bound.offset; - } - - os << " "; - - if (frame_bound.type == kPreceding) { - os << "PRECEDING"; - } else { - os << "FOLLOWING"; - } - - return os; -} - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/src/util/sqlhelper.h b/extern/hyrise_sql_parser/src/util/sqlhelper.h deleted file mode 100644 index f48f43dbc1..0000000000 --- a/extern/hyrise_sql_parser/src/util/sqlhelper.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef SQLPARSER_SQLHELPER_H -#define SQLPARSER_SQLHELPER_H - -#include "../sql/statements.h" - -namespace hsql { - -// Prints a summary of the given SQLStatement. -void printStatementInfo(const SQLStatement* stmt); - -// Prints a summary of the given SelectStatement with the given indentation. -void printSelectStatementInfo(const SelectStatement* stmt, uintmax_t num_indent); - -// Prints a summary of the given ImportStatement with the given indentation. -void printImportStatementInfo(const ImportStatement* stmt, uintmax_t num_indent); - -// Prints a summary of the given CopyStatement with the given indentation. -void printExportStatementInfo(const ExportStatement* stmt, uintmax_t num_indent); - -// Prints a summary of the given InsertStatement with the given indentation. -void printInsertStatementInfo(const InsertStatement* stmt, uintmax_t num_indent); - -// Prints a summary of the given CreateStatement with the given indentation. -void printCreateStatementInfo(const CreateStatement* stmt, uintmax_t num_indent); - -// Prints a summary of the given TransactionStatement with the given indentation. -void printTransactionStatementInfo(const TransactionStatement* stmt, uintmax_t num_indent); - -// Prints a summary of the given Expression with the given indentation. -void printExpression(Expr* expr, uintmax_t num_indent); - -// Prints an ORDER BY clause -void printOrderBy(const std::vector* expr, uintmax_t num_indent); - -// Prints WindowDescription. -void printWindowDescription(WindowDescription* window_description, uintmax_t num_indent); - -} // namespace hsql - -#endif diff --git a/extern/hyrise_sql_parser/test/auto_query_file_test.cpp b/extern/hyrise_sql_parser/test/auto_query_file_test.cpp deleted file mode 100644 index 627b0399ff..0000000000 --- a/extern/hyrise_sql_parser/test/auto_query_file_test.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "SQLParser.h" -#include "thirdparty/microtest/microtest.h" - -// Read all lines from the given file path. Skips comment lines. -std::vector readlines(std::string path); - -// Read the queries from all files that were supplied to the test -// through the -f argument. For all queries it is checked whether they -// can be parsed successfully. -TEST(AutoQueryFileTest) { - const std::vector& args = mt::Runtime::args(); - - std::vector query_files; - - // Parse command line arguments to retrieve query files. - uint i = 1; - for (; i < args.size(); ++i) { - if (args[i] == "-f") { - query_files.push_back(args[++i]); - } - } - - // Read list of queries from all input files. - std::vector lines; - for (std::string path : query_files) { - std::vector tmp = readlines(path); - lines.insert(lines.end(), tmp.begin(), tmp.end()); - } - - // Execute queries. - size_t num_executed = 0; - size_t num_failed = 0; - for (std::string line : lines) { - bool expected_result = true; - std::string query = line; - - // If a line starts with '!' parsing is expected to fail. - if (query.at(0) == '!') { - expected_result = false; - query = query.substr(1); - } - - // Measuring the parsing time. - std::chrono::time_point start, end; - start = std::chrono::system_clock::now(); - - // Parse the query. - hsql::SQLParserResult result; - hsql::SQLParser::parse(query, &result); - - end = std::chrono::system_clock::now(); - std::chrono::duration elapsed_seconds = end - start; - double us = elapsed_seconds.count() * 1000 * 1000; - - if (expected_result == result.isValid()) { - printf("\033[0;32m{ ok} (%.1fus)\033[0m %s\n", us, line.c_str()); - } else { - printf("\033[0;31m{ failed}\033[0m\n"); - printf("\t\033[0;31m%s (L%d:%d)\n\033[0m", result.errorMsg(), result.errorLine(), result.errorColumn()); - printf("\t%s\n", line.c_str()); - ++num_failed; - } - ++num_executed; - } - - if (num_failed == 0) { - printf("\033[0;32m{ ok} \033[0mAll %lu grammar tests completed successfully!\n", num_executed); - } else { - fprintf(stderr, "\033[0;31m{ failed} \033[0mSome grammar tests failed! %lu out of %lu tests failed!\n", num_failed, - num_executed); - } - ASSERT_EQ(num_failed, 0); -} - -std::vector readlines(std::string path) { - std::ifstream infile(path); - std::vector lines; - std::string line; - while (std::getline(infile, line)) { - std::istringstream iss(line); - - // Skip comments. - if (line[0] == '#' || (line[0] == '-' && line[1] == '-')) { - continue; - } - - lines.push_back(line); - } - return lines; -} diff --git a/extern/hyrise_sql_parser/test/prepare_tests.cpp b/extern/hyrise_sql_parser/test/prepare_tests.cpp deleted file mode 100644 index 1c067b0810..0000000000 --- a/extern/hyrise_sql_parser/test/prepare_tests.cpp +++ /dev/null @@ -1,84 +0,0 @@ - -#include "SQLParser.h" -#include "sql_asserts.h" -#include "thirdparty/microtest/microtest.h" - -using hsql::kExprLiteralInt; -using hsql::kExprParameter; - -using hsql::kStmtDrop; -using hsql::kStmtExecute; -using hsql::kStmtInsert; -using hsql::kStmtPrepare; -using hsql::kStmtSelect; - -using hsql::kDropPreparedStatement; - -using hsql::DropStatement; -using hsql::ExecuteStatement; -using hsql::InsertStatement; -using hsql::PrepareStatement; -using hsql::SelectStatement; - -TEST(PrepareSingleStatementTest) { - TEST_PARSE_SINGLE_SQL("PREPARE test FROM 'SELECT * FROM students WHERE grade = ?';", kStmtPrepare, PrepareStatement, - result, prepare); - - ASSERT_STREQ(prepare->name, "test"); - ASSERT_STREQ(prepare->query, "SELECT * FROM students WHERE grade = ?"); - - TEST_PARSE_SINGLE_SQL(prepare->query, kStmtSelect, SelectStatement, result2, select); - - ASSERT_EQ(result2.parameters().size(), 1); - ASSERT(select->whereClause->expr2->isType(kExprParameter)); - ASSERT_EQ(select->whereClause->expr2->ival, 0); -} - -TEST(DeallocatePrepareStatementTest) { - TEST_PARSE_SINGLE_SQL("DEALLOCATE PREPARE test;", kStmtDrop, DropStatement, result, drop); - - ASSERT_EQ(drop->type, kDropPreparedStatement); - ASSERT_STREQ(drop->name, "test"); -} - -TEST(StatementWithParameters) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM test WHERE a = ? AND b = ?", kStmtSelect, SelectStatement, result, stmt); - - const hsql::Expr* eq1 = stmt->whereClause->expr; - const hsql::Expr* eq2 = stmt->whereClause->expr2; - - ASSERT_EQ(result.parameters().size(), 2); - - ASSERT_EQ(eq1->opType, hsql::kOpEquals); - ASSERT(eq1->expr->isType(hsql::kExprColumnRef)); - ASSERT(eq1->expr2->isType(kExprParameter)); - ASSERT_EQ(eq1->expr2->ival, 0); - ASSERT_EQ(result.parameters()[0], eq1->expr2); - - ASSERT_EQ(eq2->opType, hsql::kOpEquals); - ASSERT(eq2->expr->isType(hsql::kExprColumnRef)); - ASSERT(eq2->expr2->isType(kExprParameter)); - ASSERT_EQ(eq2->expr2->ival, 1); - ASSERT_EQ(result.parameters()[1], eq2->expr2); -} - -TEST(ExecuteStatementTest) { - TEST_PARSE_SINGLE_SQL("EXECUTE test(1, 2);", kStmtExecute, ExecuteStatement, result, stmt); - - ASSERT_STREQ(stmt->name, "test"); - ASSERT_EQ(stmt->parameters->size(), 2); -} - -TEST(ExecuteStatementTestNoParam) { - TEST_PARSE_SINGLE_SQL("EXECUTE test();", kStmtExecute, ExecuteStatement, result, stmt); - - ASSERT_STREQ(stmt->name, "test"); - ASSERT_EQ(stmt->parameters, 0); -} - -TEST(ExecuteStatementTestNoParamList) { - TEST_PARSE_SINGLE_SQL("EXECUTE test;", kStmtExecute, ExecuteStatement, result, stmt); - - ASSERT_STREQ(stmt->name, "test"); - ASSERT_EQ(stmt->parameters, 0); -} diff --git a/extern/hyrise_sql_parser/test/queries/queries-bad.sql b/extern/hyrise_sql_parser/test/queries/queries-bad.sql deleted file mode 100644 index 119d932092..0000000000 --- a/extern/hyrise_sql_parser/test/queries/queries-bad.sql +++ /dev/null @@ -1,112 +0,0 @@ -# This file contains a list of strings that are NOT valid SQL queries. -# Each line contains a single SQL query. -# Each line starts with a '!' char to indicate that parsing should fail. -! -!1 -!gibberish; -!CREATE TABLE "table" FROM TBL FILE 'students.tbl';gibberish -!CREATE TABLE "table" FROM TBL FILE 'students.tbl';1 -!CREATE TABLE foo (a int, b int bar); -!CREATE TABLE foo (a int, b REFERENCES bar); -!CREATE TABLE foo (a int, b int, FOREIGN (b) REFERENCES bar); -!CREATE TABLE foo (a int, b int, KEY (b) REFERENCES bar); -!CREATE TABLE foo (a int, b int, FOREIGN KEY (b) bar); -!CREATE TABLE foo (a int, b int, FOREIGN KEY REFERENCES bar); -!CREATE TABLE foo (a int, b int, FOREIGN KEY b REFERENCES bar); -!CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES bar x); -!INSERT INTO test_table VALUESd (1, 2, 'test'); -!SELECT * FROM t WHERE a = ? AND b = ?;gibberish; -!SHOW COLUMNS; -!DESCRIBE; -!COPY; -!COPY students; -!COPY students FROM 'students_file' WITH (FORMAT XYZ); -!COPY students TO 'students_file' WITH (FORMAT XYZ); -!COPY students FROM 'students_file' WITH (); -!COPY students TO 'students_file' WITH (); -!COPY students TO 'students_file' WITH (FORMAT CSV ENCODING 'Dictionary'); -!COPY students TO 'students_file' WITH FORMAT CSV; -!COPY students TO 'students_file' WITH (FORMAT CSV, FORMAT BINARY); -!COPY students TO 'students_file' WITH (ENCODING 'Dictionary', ENCODING 'FSST'); -!COPY students FROM 'students_file' WITH (ENCODING Dictionary); -!select a + 2 as b(spam, eggs) from B; -!WITH a AS SELECT 1 SELECT 1; -!WITH a AS (SELECT ) SELECT 1; -!WITH a AS (WITH b AS (SELECT 1) SELECT 1) SELECT 1; # We do not support nested WITH clauses -!WITH a AS (SELECT ) b AS (SELECT ) SELECT 1; # Missing comma between WITH descriptions -!BEGIN TRANSACTION transName; # Transaction naming is currently not supported -!SELECT -9223372036854775809; # Out of int64_t range -!SELECT 9223372036854775808; # Out of int64_t range -!SELECT * FROM t WHERE a = DATE 'anystring'; -!SELECT * FROM t WHERE a = DATE '1996-12-310'; -!SELECT * FROM t WHERE a = DATE '1996-120-31'; -!SELECT * FROM t WHERE a = DATE '19960-12-31'; -!SELECT * FROM t WHERE a = DATE 'asdf-gh-jkl'; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 30; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 30 DAYS; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 30 'DAYS'; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 'DAYS'; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '1' ANYTHING; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '1 DAY' DAY; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '30 ANYTHING'; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '30' DAYS; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + x DAYS; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL 'x' DAY; -!SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '3.3 DAYS'; -# ON is not supported by postgres. We follow postgres here since the sql-92 standard does not specify index -# implementation details. -!DROP INDEX myindex ON mytable; -!SELECT * FROM test WHERE val = 2 FOR KEY UPDATE; -!SELECT * FROM test WHERE val = 2 FOR SHARE test1; -!SELECT * FROM test WHERE val = 2 FOR NO KEY SHARE; -!SELECT * FROM test WHERE val = 2 NOWAIT FOR UPDATE; -!CREATE TABLE a_table (a_column INT PRIMARY KEY NULL); -!CREATE TABLE a_table (a_column INT NULL PRIMARY KEY); -!CREATE TABLE a_table (a_column INT NOT NULL NULL); -!CREATE TABLE a_table (a_column INT NULL NOT NULL); -# WINDOW EXPRESSIONS -!SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3 ORDER BY test4 ROWS BETWEEN UNBOUNDED AND CURRENT ROW) FROM test; -!SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3 ORDER BY test4 ROWS BETWEEN -1 PRECEDING AND CURRENT ROW) FROM test; -!SELECT test1, rank() OVER (INVALID UNBOUNDED PRECEDING) FROM test; -!SELECT rank() OVER (INVALID) FROM test; -!SELECT rank OVER () FROM test; -!SELECT a = 1 OVER () FROM test; -!SELECT rank() OVER (ROWS UNBOUNDEDD PRECEDING) FROM test; -!SELECT rank() OVER (ROWS UNBOUNDED PRECEDINGG) FROM test; -!SELECT test1, rank() OVER (ROWS -1 PRECEDING) FROM test; -!SELECT test1, rank() OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND -1 FOLLOWING) FROM test; -# Join USING -!SELECT * FROM foo INNER JOIN bar USING (); -!SELECT * FROM foo INNER JOIN bar USING (*); -# Both the SQL standard and Postgres allow column names only (no column references). -!SELECT * FROM foo INNER JOIN bar USING (foo.a); -!SELECT * FROM foo INNER JOIN bar USING (a b); -!SELECT * FROM foo INNER JOIN bar USING (a AS b); -!SELECT * FROM foo INNER JOIN bar USING (1); -# INSERT, EXECUTE, and HINTS only allow specific expressions. -!INSERT INTO foo VALUES (?); -!INSERT INTO foo VALUES (CAST(column_a AS INT)); -!INSERT INTO foo VALUES (AVG(another_column)); -!EXECUTE statement_a(?); -!EXECUTE statement_a(CAST(column_a AS INT)); -!EXECUTE statement_a(AVG(another_column)); -!SELECT * FROM foo WITH HINT (?); -!SELECT * FROM foo WITH HINT (CAST(column_a AS INT)); -!SELECT * FROM foo WITH HINT (AVG(another_column)); -# ORDER BY with NULL ordering. -!SELECT * FROM students ORDER BY name ASC NULL FIRST; -!SELECT * FROM students ORDER BY name ASC gibberish LAST; -!SELECT * FROM students ORDER BY name NULLS FIRS; -!SELECT * FROM students ORDER BY name NULLS; -!SELECT * FROM students ORDER BY name ASC NULLS; -!SELECT * FROM students ORDER BY name FIRST; -!SELECT * FROM students ORDER BY name ASC LAST; -!SELECT * FROM students ORDER BY name DESC NULLS gibberish; -# CSV options -!COPY students FROM 'file_path' WITH (FORMAT TBL, DELIMITER '|', NULL '', QUOTE '"'); -!COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', QUOTE '"', FORMAT TBL); -!COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', FORMAT TBL, QUOTE '"'); -!COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', QUOTE '"', NULL 'a'); -!COPY students FROM 'file_path' WITH (NULL '', QUOTE '"', DELIMITER '|', DELIMITER '/'); -!COPY students FROM 'file_path' WITH (QUOTE '"', NULL '', DELIMITER '/', QUOTE '_',); -!COPY students FROM 'file_path' WITH (FORMAT CSV, QUOTE '"', DELIMINIMITER '|'); diff --git a/extern/hyrise_sql_parser/test/queries/queries-good.sql b/extern/hyrise_sql_parser/test/queries/queries-good.sql deleted file mode 100644 index 1a45ff6b56..0000000000 --- a/extern/hyrise_sql_parser/test/queries/queries-good.sql +++ /dev/null @@ -1,122 +0,0 @@ -# This file contains a list of strings that are NOT valid SQL queries. -# Each line contains a single SQL query. -# SELECT statement -SELECT * FROM orders; -SELECT a FROM foo WHERE a > 12 OR b > 3 AND NOT c LIMIT 10 -SELECT a FROM some_schema.foo WHERE a > 12 OR b > 3 AND NOT c LIMIT 10 -SELECT col1 AS myname, col2, 'test' FROM "table", foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1; -SELECT * from "table" JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5 -(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10); -SELECT * FROM "table" LIMIT 10 OFFSET 10; SELECT * FROM another; -SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY col1; -SELECT * FROM (SELECT * FROM t1); -SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1; -SELECT TOP 10 * FROM t1 ORDER BY col1, col2; -SELECT a, MAX(b), MAX(c, d), CUSTOM(q, UP(r)) AS f FROM t1; -SELECT * FROM t WHERE a BETWEEN 1 and c; -SELECT * FROM t WHERE a = ? AND b = ?; -SELECT City.name, Product.category, SUM(price) FROM fact INNER JOIN City ON fact.city_id = City.id INNER JOIN Product ON fact.product_id = Product.id GROUP BY City.name, Product.category; -SELECT SUBSTR(a, 3, 5) FROM t; -SELECT * FROM t WHERE a = DATE '1996-12-31'; -# JOIN -SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5 -SELECT * FROM t1 JOIN t2 ON c1 = c2; -SELECT a, SUM(b) FROM t2 GROUP BY a HAVING SUM(b) > 100; -# CREATE statement -CREATE TABLE "table" FROM TBL FILE 'students.tbl' -CREATE TABLE IF NOT EXISTS "table" FROM TBL FILE 'students.tbl' -CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE, credits BIGINT) -CREATE TABLE students (name TEXT, student_number INTEGER NOT NULL, city TEXT, grade DOUBLE PRIMARY KEY UNIQUE) -CREATE TABLE teachers (name VARCHAR(30), student_number LONG, city CHAR(10), grade FLOAT) -CREATE TABLE teachers (name VARCHAR(30), student_number LONG, PRIMARY KEY (name, student_number), city CHAR(10), grade FLOAT) -CREATE TABLE teachers (name CHARACTER VARYING(30)); -CREATE TABLE students_2 AS SELECT * FROM students -CREATE TABLE students_3 AS SELECT city, grade FROM students WHERE grade > 3.0 -CREATE TABLE students (date_of_birth DATE, matriculation_date DATETIME, graduation_date TIMESTAMP, graduated BOOLEAN); -CREATE TABLE foo (a int, b int REFERENCES bar REFERENCES baz); -CREATE TABLE foo (a int, b int REFERENCES bar (x) REFERENCES baz (y)); -CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES bar, FOREIGN KEY (b) REFERENCES baz); -CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES bar (x), FOREIGN KEY (b) REFERENCES baz (y)); -# Multiple statements -CREATE TABLE "table" FROM TBL FILE 'students.tbl'; SELECT * FROM "table"; -# INSERT -INSERT INTO test_table VALUES (1, 2, 'test'); -INSERT INTO test_table (id, value, name) VALUES (1, 2, 'test'); -INSERT INTO test_table SELECT * FROM students; -INSERT INTO some_schema.test_table SELECT * FROM another_schema.students; -# DELETE -DELETE FROM students WHERE grade > 3.0 -DELETE FROM students -TRUNCATE students -# UPDATE -UPDATE students SET grade = 1.3 WHERE name = 'Max Mustermann'; -UPDATE students SET grade = 1.3, name='Felix Fürstenberg' WHERE name = 'Max Mustermann'; -UPDATE students SET grade = 1.0; -UPDATE some_schema.students SET grade = 1.0; -# ALTER -ALTER TABLE mytable DROP COLUMN IF EXISTS mycolumn; -ALTER TABLE IF EXISTS mytable DROP COLUMN IF EXISTS mycolumn; -# DROP -DROP TABLE students; -DROP TABLE IF EXISTS students; -DROP VIEW IF EXISTS students; -DROP INDEX myindex; -DROP INDEX IF EXISTS myindex; -# PREPARE -PREPARE prep_inst FROM 'INSERT INTO test VALUES (?, ?, ?)'; -PREPARE prep2 FROM 'INSERT INTO test VALUES (?, 0, 0); INSERT INTO test VALUES (0, ?, 0); INSERT INTO test VALUES (0, 0, ?);'; -EXECUTE prep_another_inst(1, 2, 3, CAST(1 AS LONG), -2.5, INTERVAL '3 HOURS', -2 SECONDS, TRUE, NULL, DATE '2000-01-01'); -EXECUTE prep; -DEALLOCATE PREPARE prep; -# COPY -COPY students FROM 'student.tbl'; -COPY students FROM 'file_path' WITH (FORMAT TBL); -COPY students FROM 'file_path' WITH (FORMAT CSV); -COPY students FROM 'file_path' WITH (FORMAT BIN); -COPY students FROM 'file_path' WITH (FORMAT BINARY); -COPY students FROM 'file_path' WITH (FORMAT CSV, DELIMITER '|', NULL '', QUOTE '"'); -COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', FORMAT CSV, QUOTE '"'); -COPY students FROM 'file_path' WITH (DELIMITER '|', NULL '', QUOTE '"'); -COPY students FROM 'file_path' WITH (DELIMITER '|', FORMAT CSV); -COPY students FROM 'file_path' (FORMAT TBL); -COPY good_students FROM 'file_path' WHERE grade > (SELECT AVG(grade) from alumni); -COPY students TO 'student.tbl'; -COPY students TO 'file_path' WITH (ENCODING 'some_encoding', FORMAT TBL); -COPY students TO 'file_path' WITH (FORMAT CSV); -COPY students TO 'file_path' WITH (FORMAT BIN); -COPY students TO 'file_path' WITH (FORMAT BINARY); -COPY students TO 'file_path' (FORMAT BINARY, ENCODING 'FSST'); -COPY students TO 'file_path' WITH (ENCODING 'Dictionary'); -COPY (SELECT firstname, COUNT(*) FROM students GROUP BY firstname) TO 'student_names.csv'; -# HINTS -SELECT * FROM test WITH HINT(NO_CACHE); -SELECT * FROM test WITH HINT(NO_CACHE, NO_SAMPLING); -SELECT * FROM test WITH HINT(NO_CACHE, SAMPLE_RATE(0.1), OMW(1.0, 'test'), START_DATE(CAST('2000-01-01' AS DATE))); -SELECT * FROM test WITH HINT(TIME_DIFFERENCE(-3 HOURS), ALLOW_RESULT_CACHE(FALSE), DEFAULT_VALUE(NULL), TIMETRAVEL_TO(DATE '2000-01-01')); -SHOW TABLES; -SHOW COLUMNS students; -DESCRIBE students; -SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '30 DAYS'; -SELECT * FROM t WHERE a = DATE '2000-01-01' + INTERVAL '10' DAY; -SELECT * FROM t WHERE a BETWEEN '2000-01-01' AND DATE '2000-01-01' - 1 MONTH; -SELECT (CAST('2002-5-01' as DATE) + INTERVAL '60 days'); -SELECT CAST(student.student_number as BIGINT) FROM student; -SELECT student.name AS character FROM student; -# ROW LOCKING -SELECT * FROM test WHERE id = 1 FOR UPDATE; -SELECT * FROM test WHERE id = 1 FOR SHARE; -SELECT * FROM test WHERE id = 1 FOR NO KEY UPDATE; -SELECT * FROM test WHERE id = 1 FOR KEY SHARE; -SELECT * FROM test WHERE id = 1 FOR UPDATE SKIP LOCKED; -SELECT * FROM test WHERE id = 1 FOR UPDATE NOWAIT; -SELECT * FROM test1, test2 WHERE test1.id = 10 FOR UPDATE OF test1; -SELECT * FROM test1, test2 WHERE test2.val = 2 FOR SHARE OF test1, test2; -SELECT * FROM test1, test2 WHERE test2.val = 2 FOR UPDATE OF test1 FOR SHARE OF test2; -# WINDOW EXPRESSIONS -SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3 ORDER BY test4 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) an_alias FROM test; -SELECT sum(test2)/sum(sum(test2)) OVER (PARTITION BY test1) FROM test GROUP BY test3; -SELECT test1, sum(sum(test2)) OVER (PARTITION BY test3, test4 ORDER BY test5, test6 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) FROM test; -SELECT test1, rank() OVER (ORDER BY test2 DESC, test3 ASC) rnk FROM test; -SELECT rank() OVER () FROM test; -SELECT rank() OVER (PARTITION BY test1) FROM test; -SELECT rank() OVER (PARTITION BY test1 ORDER BY test2) FROM test; diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-01.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-01.sql deleted file mode 100644 index 580b3b52cd..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-01.sql +++ /dev/null @@ -1,9 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT L_RETURNFLAG, L_LINESTATUS, SUM(L_QUANTITY) AS SUM_QTY, - SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS SUM_DISC_PRICE, - SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)*(1+L_TAX)) AS SUM_CHARGE, AVG(L_QUANTITY) AS AVG_QTY, - AVG(L_EXTENDEDPRICE) AS AVG_PRICE, AVG(L_DISCOUNT) AS AVG_DISC, COUNT(*) AS COUNT_ORDER -FROM LINEITEM -WHERE L_SHIPDATE <= dateadd(dd, -90, cast('1998-12-01' as datetime)) -GROUP BY L_RETURNFLAG, L_LINESTATUS -ORDER BY L_RETURNFLAG,L_LINESTATUS \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-02.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-02.sql deleted file mode 100644 index c40be7376c..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-02.sql +++ /dev/null @@ -1,10 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT TOP 100 S_ACCTBAL, S_NAME, N_NAME, P_PARTKEY, P_MFGR, S_ADDRESS, S_PHONE, S_COMMENT -FROM PART, SUPPLIER, PARTSUPP, NATION, REGION -WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY AND P_SIZE = 15 AND -P_TYPE LIKE '%%BRASS' AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND -R_NAME = 'EUROPE' AND -PS_SUPPLYCOST = (SELECT MIN(PS_SUPPLYCOST) FROM PARTSUPP, SUPPLIER, NATION, REGION - WHERE P_PARTKEY = PS_PARTKEY AND S_SUPPKEY = PS_SUPPKEY - AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY AND R_NAME = 'EUROPE') -ORDER BY S_ACCTBAL DESC, N_NAME, S_NAME, P_PARTKEY \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-03.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-03.sql deleted file mode 100644 index 5608c1420a..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-03.sql +++ /dev/null @@ -1,7 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT TOP 10 L_ORDERKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE, O_ORDERDATE, O_SHIPPRIORITY -FROM CUSTOMER, ORDERS, LINEITEM -WHERE C_MKTSEGMENT = 'BUILDING' AND C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND -O_ORDERDATE < '1995-03-15' AND L_SHIPDATE > '1995-03-15' -GROUP BY L_ORDERKEY, O_ORDERDATE, O_SHIPPRIORITY -ORDER BY REVENUE DESC, O_ORDERDATE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-04.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-04.sql deleted file mode 100644 index 3d420b381e..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-04.sql +++ /dev/null @@ -1,6 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT FROM ORDERS -WHERE O_ORDERDATE >= '1993-07-01' AND O_ORDERDATE < dateadd(mm,3, cast('1993-07-01' as datetime)) -AND EXISTS (SELECT * FROM LINEITEM WHERE L_ORDERKEY = O_ORDERKEY AND L_COMMITDATE < L_RECEIPTDATE) -GROUP BY O_ORDERPRIORITY -ORDER BY O_ORDERPRIORITY \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-05.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-05.sql deleted file mode 100644 index 95d292328b..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-05.sql +++ /dev/null @@ -1,9 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT N_NAME, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE -FROM CUSTOMER, ORDERS, LINEITEM, SUPPLIER, NATION, REGION -WHERE C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND L_SUPPKEY = S_SUPPKEY -AND C_NATIONKEY = S_NATIONKEY AND S_NATIONKEY = N_NATIONKEY AND N_REGIONKEY = R_REGIONKEY -AND R_NAME = 'ASIA' AND O_ORDERDATE >= '1994-01-01' -AND O_ORDERDATE < DATEADD(YY, 1, cast('1994-01-01' as datetime)) -GROUP BY N_NAME -ORDER BY REVENUE DESC \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-06.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-06.sql deleted file mode 100644 index 394bba9f89..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-06.sql +++ /dev/null @@ -1,5 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT SUM(L_EXTENDEDPRICE*L_DISCOUNT) AS REVENUE -FROM LINEITEM -WHERE L_SHIPDATE >= '1994-01-01' AND L_SHIPDATE < dateadd(yy, 1, cast('1994-01-01' as datetime)) -AND L_DISCOUNT BETWEEN .06 - 0.01 AND .06 + 0.01 AND L_QUANTITY < 24 \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-07.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-07.sql deleted file mode 100644 index 449cc26094..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-07.sql +++ /dev/null @@ -1,11 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT SUPP_NATION, CUST_NATION, L_YEAR, SUM(VOLUME) AS REVENUE -FROM ( SELECT N1.N_NAME AS SUPP_NATION, N2.N_NAME AS CUST_NATION, datepart(yy, L_SHIPDATE) AS L_YEAR, - L_EXTENDEDPRICE*(1-L_DISCOUNT) AS VOLUME - FROM SUPPLIER, LINEITEM, ORDERS, CUSTOMER, NATION N1, NATION N2 - WHERE S_SUPPKEY = L_SUPPKEY AND O_ORDERKEY = L_ORDERKEY AND C_CUSTKEY = O_CUSTKEY - AND S_NATIONKEY = N1.N_NATIONKEY AND C_NATIONKEY = N2.N_NATIONKEY AND ((N1.N_NAME = 'FRANCE' AND N2.N_NAME = 'GERMANY') OR - (N1.N_NAME = 'GERMANY' AND N2.N_NAME = 'FRANCE')) AND - L_SHIPDATE BETWEEN '1995-01-01' AND '1996-12-31' ) AS SHIPPING -GROUP BY SUPP_NATION, CUST_NATION, L_YEAR -ORDER BY SUPP_NATION, CUST_NATION, L_YEAR \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-08.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-08.sql deleted file mode 100644 index 77f8c64a8c..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-08.sql +++ /dev/null @@ -1,10 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT O_YEAR, SUM(CASE WHEN NATION = 'BRAZIL' THEN VOLUME ELSE 0 END)/SUM(VOLUME) AS MKT_SHARE -FROM (SELECT datepart(yy,O_ORDERDATE) AS O_YEAR, L_EXTENDEDPRICE*(1-L_DISCOUNT) AS VOLUME, N2.N_NAME AS NATION - FROM "PART", SUPPLIER, LINEITEM, ORDERS, CUSTOMER, NATION N1, NATION N2, REGION - WHERE P_PARTKEY = L_PARTKEY AND S_SUPPKEY = L_SUPPKEY AND L_ORDERKEY = O_ORDERKEY - AND O_CUSTKEY = C_CUSTKEY AND C_NATIONKEY = N1.N_NATIONKEY AND - N1.N_REGIONKEY = R_REGIONKEY AND R_NAME = 'AMERICA' AND S_NATIONKEY = N2.N_NATIONKEY - AND O_ORDERDATE BETWEEN '1995-01-01' AND '1996-12-31' AND P_TYPE= 'ECONOMY ANODIZED STEEL') AS ALL_NATIONS -GROUP BY O_YEAR -ORDER BY O_YEAR \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-09.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-09.sql deleted file mode 100644 index bb9fd6f3cf..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-09.sql +++ /dev/null @@ -1,10 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT NATION, O_YEAR, SUM(AMOUNT) AS SUM_PROFIT -FROM (SELECT N_NAME AS NATION, datepart(yy, O_ORDERDATE) AS O_YEAR, - L_EXTENDEDPRICE*(1-L_DISCOUNT)-PS_SUPPLYCOST*L_QUANTITY AS AMOUNT - FROM "PART", SUPPLIER, LINEITEM, PARTSUPP, ORDERS, NATION - WHERE S_SUPPKEY = L_SUPPKEY AND PS_SUPPKEY= L_SUPPKEY AND PS_PARTKEY = L_PARTKEY AND - P_PARTKEY= L_PARTKEY AND O_ORDERKEY = L_ORDERKEY AND S_NATIONKEY = N_NATIONKEY AND - P_NAME LIKE '%%green%%') AS PROFIT -GROUP BY NATION, O_YEAR -ORDER BY NATION, O_YEAR DESC \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-10.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-10.sql deleted file mode 100644 index 7229b24eb2..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-10.sql +++ /dev/null @@ -1,9 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html -SELECT TOP 20 C_CUSTKEY, C_NAME, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE, C_ACCTBAL, -N_NAME, C_ADDRESS, C_PHONE, C_COMMENT -FROM CUSTOMER, ORDERS, LINEITEM, NATION -WHERE C_CUSTKEY = O_CUSTKEY AND L_ORDERKEY = O_ORDERKEY AND O_ORDERDATE>= '1993-10-01' AND -O_ORDERDATE < dateadd(mm, 3, cast('1993-10-01' as datetime)) AND -L_RETURNFLAG = 'R' AND C_NATIONKEY = N_NATIONKEY -GROUP BY C_CUSTKEY, C_NAME, C_ACCTBAL, C_PHONE, N_NAME, C_ADDRESS, C_COMMENT -ORDER BY REVENUE DESC \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-11.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-11.sql deleted file mode 100644 index 41954bb456..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-11.sql +++ /dev/null @@ -1,10 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html --- TPC_H Query 11 - Important Stock Identification -SELECT PS_PARTKEY, SUM(PS_SUPPLYCOST*PS_AVAILQTY) AS VALUE -FROM PARTSUPP, SUPPLIER, NATION -WHERE PS_SUPPKEY = S_SUPPKEY AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'GERMANY' -GROUP BY PS_PARTKEY -HAVING SUM(PS_SUPPLYCOST*PS_AVAILQTY) > (SELECT SUM(PS_SUPPLYCOST*PS_AVAILQTY) * 0.0001000000 - FROM PARTSUPP, SUPPLIER, NATION - WHERE PS_SUPPKEY = S_SUPPKEY AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'GERMANY') -ORDER BY VALUE DESC; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-12.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-12.sql deleted file mode 100644 index 59a91b0567..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-12.sql +++ /dev/null @@ -1,10 +0,0 @@ --- TPC_H Query 12 - Shipping Modes and Order Priority -SELECT L_SHIPMODE, -SUM(CASE WHEN O_ORDERPRIORITY = '1-URGENT' OR O_ORDERPRIORITY = '2-HIGH' THEN 1 ELSE 0 END) AS HIGH_LINE_COUNT, -SUM(CASE WHEN O_ORDERPRIORITY <> '1-URGENT' AND O_ORDERPRIORITY <> '2-HIGH' THEN 1 ELSE 0 END ) AS LOW_LINE_COUNT -FROM ORDERS, LINEITEM -WHERE O_ORDERKEY = L_ORDERKEY AND L_SHIPMODE IN ('MAIL','SHIP') -AND L_COMMITDATE < L_RECEIPTDATE AND L_SHIPDATE < L_COMMITDATE AND L_RECEIPTDATE >= '1994-01-01' -AND L_RECEIPTDATE < dateadd(mm, 1, cast('1995-09-01' as datetime)) -GROUP BY L_SHIPMODE -ORDER BY L_SHIPMODE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-13.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-13.sql deleted file mode 100644 index a48f691b20..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-13.sql +++ /dev/null @@ -1,8 +0,0 @@ --- TPC_H Query 13 - Customer Distribution -SELECT C_COUNT, COUNT(*) AS CUSTDIST -FROM (SELECT C_CUSTKEY, COUNT(O_ORDERKEY) - FROM CUSTOMER left outer join ORDERS on C_CUSTKEY = O_CUSTKEY - AND O_COMMENT not like '%%special%%requests%%' - GROUP BY C_CUSTKEY) AS C_ORDERS (C_CUSTKEY, C_COUNT) -GROUP BY C_COUNT -ORDER BY CUSTDIST DESC, C_COUNT DESC; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-14.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-14.sql deleted file mode 100644 index 72cf9c32cb..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-14.sql +++ /dev/null @@ -1,5 +0,0 @@ --- TPC_H Query 14 - Promotion Effect -SELECT 100.00* SUM(CASE WHEN P_TYPE LIKE 'PROMO%%' THEN L_EXTENDEDPRICE*(1-L_DISCOUNT) -ELSE 0 END) / SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS PROMO_REVENUE -FROM LINEITEM, PART -WHERE L_PARTKEY = P_PARTKEY AND L_SHIPDATE >= '1995-09-01' AND L_SHIPDATE < dateadd(mm, 1, '1995-09-01'); \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-15.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-15.sql deleted file mode 100644 index 5593df1859..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-15.sql +++ /dev/null @@ -1,15 +0,0 @@ --- TPC_H Query 15.1 - Create View for Top Supplier Query -CREATE VIEW REVENUE0 (SUPPLIER_NO, TOTAL_REVENUE) AS -SELECT L_SUPPKEY, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) FROM LINEITEM -WHERE L_SHIPDATE >= '1996-01-01' AND L_SHIPDATE < dateadd(mm, 3, cast('1996-01-01' as datetime)) -GROUP BY L_SUPPKEY; - - --- TPC_H Query 15.2 - Top Supplier -SELECT S_SUPPKEY, S_NAME, S_ADDRESS, S_PHONE, TOTAL_REVENUE -FROM SUPPLIER, REVENUE0 -WHERE S_SUPPKEY = SUPPLIER_NO AND TOTAL_REVENUE = (SELECT MAX(TOTAL_REVENUE) FROM REVENUE0) -ORDER BY S_SUPPKEY; - --- TPC_H Query 15.3 - Drop View -DROP VIEW REVENUE0; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-16.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-16.sql deleted file mode 100644 index 7bf0bbc1dc..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-16.sql +++ /dev/null @@ -1,9 +0,0 @@ --- http://www.sqlserver-dba.com/2011/09/this-is-a-followup-on-my-earlier-post-of-sql-server-test-data-generation-testing-tools-i-had-some-requests-for-my-set-up-pr.html --- TPC_H Query 16 - Parts/Supplier Relationship -SELECT P_BRAND, P_TYPE, P_SIZE, COUNT(DISTINCT PS_SUPPKEY) AS SUPPLIER_CNT -FROM PARTSUPP, "PART" -WHERE P_PARTKEY = PS_PARTKEY AND P_BRAND <> 'Brand#45' AND P_TYPE NOT LIKE 'MEDIUM POLISHED%%' -AND P_SIZE IN (49, 14, 23, 45, 19, 3, 36, 9) AND PS_SUPPKEY NOT IN (SELECT S_SUPPKEY FROM SUPPLIER - WHERE S_COMMENT LIKE '%%Customer%%Complaints%%') -GROUP BY P_BRAND, P_TYPE, P_SIZE -ORDER BY SUPPLIER_CNT DESC, P_BRAND, P_TYPE, P_SIZE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-17.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-17.sql deleted file mode 100644 index e6d50ac1ef..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-17.sql +++ /dev/null @@ -1,4 +0,0 @@ --- TPC_H Query 17 - Small-Quantity-Order Revenue -SELECT SUM(L_EXTENDEDPRICE)/7.0 AS AVG_YEARLY FROM LINEITEM, "PART" -WHERE P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#23' AND P_CONTAINER = 'MED BOX' -AND L_QUANTITY < (SELECT 0.2*AVG(L_QUANTITY) FROM LINEITEM WHERE L_PARTKEY = P_PARTKEY); \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-18.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-18.sql deleted file mode 100644 index 57e9a34fb4..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-18.sql +++ /dev/null @@ -1,7 +0,0 @@ --- TPC_H Query 18 - Large Volume Customer -SELECT TOP 100 C_NAME, C_CUSTKEY, O_ORDERKEY, O_ORDERDATE, O_TOTALPRICE, SUM(L_QUANTITY) -FROM CUSTOMER, ORDERS, LINEITEM -WHERE O_ORDERKEY IN (SELECT L_ORDERKEY FROM LINEITEM GROUP BY L_ORDERKEY HAVING - SUM(L_QUANTITY) > 300) AND C_CUSTKEY = O_CUSTKEY AND O_ORDERKEY = L_ORDERKEY -GROUP BY C_NAME, C_CUSTKEY, O_ORDERKEY, O_ORDERDATE, O_TOTALPRICE -ORDER BY O_TOTALPRICE DESC, O_ORDERDATE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-19.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-19.sql deleted file mode 100644 index 8000b96910..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-19.sql +++ /dev/null @@ -1,9 +0,0 @@ --- TPC_H Query 19 - Discounted Revenue -SELECT SUM(L_EXTENDEDPRICE* (1 - L_DISCOUNT)) AS REVENUE -FROM LINEITEM, "PART" -WHERE (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#12' AND P_CONTAINER IN ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') AND L_QUANTITY >= 1 AND L_QUANTITY <= 1 + 10 AND P_SIZE BETWEEN 1 AND 5 -AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON') -OR (P_PARTKEY = L_PARTKEY AND P_BRAND ='Brand#23' AND P_CONTAINER IN ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') AND L_QUANTITY >=10 AND L_QUANTITY <=10 + 10 AND P_SIZE BETWEEN 1 AND 10 -AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON') -OR (P_PARTKEY = L_PARTKEY AND P_BRAND = 'Brand#34' AND P_CONTAINER IN ( 'LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') AND L_QUANTITY >=20 AND L_QUANTITY <= 20 + 10 AND P_SIZE BETWEEN 1 AND 15 -AND L_SHIPMODE IN ('AIR', 'AIR REG') AND L_SHIPINSTRUCT = 'DELIVER IN PERSON'); \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-20.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-20.sql deleted file mode 100644 index 9803a254a3..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-20.sql +++ /dev/null @@ -1,8 +0,0 @@ --- TPC_H Query 20 - Potential Part Promotion -SELECT S_NAME, S_ADDRESS FROM SUPPLIER, NATION -WHERE S_SUPPKEY IN (SELECT PS_SUPPKEY FROM PARTSUPP - WHERE PS_PARTKEY in (SELECT P_PARTKEY FROM "PART" WHERE P_NAME like 'forest%%') AND - PS_AVAILQTY > (SELECT 0.5*sum(L_QUANTITY) FROM LINEITEM WHERE L_PARTKEY = PS_PARTKEY AND - L_SUPPKEY = PS_SUPPKEY AND L_SHIPDATE >= '1994-01-01' AND - L_SHIPDATE < dateadd(yy,1,'1994-01-01'))) AND S_NATIONKEY = N_NATIONKEY AND N_NAME = 'CANADA' -ORDER BY S_NAME; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-21.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-21.sql deleted file mode 100644 index 27be0c6d09..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-21.sql +++ /dev/null @@ -1,11 +0,0 @@ --- TPC_H Query 21 - Suppliers Who Kept Orders Waiting -SELECT TOP 100 S_NAME, COUNT(*) AS NUMWAIT -FROM SUPPLIER, LINEITEM L1, ORDERS, NATION WHERE S_SUPPKEY = L1.L_SUPPKEY AND -O_ORDERKEY = L1.L_ORDERKEY AND O_ORDERSTATUS = 'F' AND L1.L_RECEIPTDATE> L1.L_COMMITDATE -AND EXISTS (SELECT * FROM LINEITEM L2 WHERE L2.L_ORDERKEY = L1.L_ORDERKEY - AND L2.L_SUPPKEY <> L1.L_SUPPKEY) AND -NOT EXISTS (SELECT * FROM LINEITEM L3 WHERE L3.L_ORDERKEY = L1.L_ORDERKEY AND - L3.L_SUPPKEY <> L1.L_SUPPKEY AND L3.L_RECEIPTDATE > L3.L_COMMITDATE) AND -S_NATIONKEY = N_NATIONKEY AND N_NAME = 'SAUDI ARABIA' -GROUP BY S_NAME -ORDER BY NUMWAIT DESC, S_NAME; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/queries/tpc-h-22.sql b/extern/hyrise_sql_parser/test/queries/tpc-h-22.sql deleted file mode 100644 index 4d1d11e383..0000000000 --- a/extern/hyrise_sql_parser/test/queries/tpc-h-22.sql +++ /dev/null @@ -1,9 +0,0 @@ --- TPC_H Query 22 - Global Sales Opportunity */ -SELECT CNTRYCODE, COUNT(*) AS NUMCUST, SUM(C_ACCTBAL) AS TOTACCTBAL -FROM (SELECT SUBSTRING(C_PHONE,1,2) AS CNTRYCODE, C_ACCTBAL - FROM CUSTOMER WHERE SUBSTRING(C_PHONE,1,2) IN ('13', '31', '23', '29', '30', '18', '17') AND - C_ACCTBAL > (SELECT AVG(C_ACCTBAL) FROM CUSTOMER WHERE C_ACCTBAL > 0.00 AND - SUBSTRING(C_PHONE,1,2) IN ('13', '31', '23', '29', '30', '18', '17')) AND - NOT EXISTS ( SELECT * FROM ORDERS WHERE O_CUSTKEY = C_CUSTKEY)) AS CUSTSALE -GROUP BY CNTRYCODE -ORDER BY CNTRYCODE; \ No newline at end of file diff --git a/extern/hyrise_sql_parser/test/select_tests.cpp b/extern/hyrise_sql_parser/test/select_tests.cpp deleted file mode 100644 index a2d69d8a24..0000000000 --- a/extern/hyrise_sql_parser/test/select_tests.cpp +++ /dev/null @@ -1,1322 +0,0 @@ -#include -#include - -#include "SQLParser.h" -#include "sql_asserts.h" -#include "thirdparty/microtest/microtest.h" - -namespace hsql { - -TEST(SelectTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_NULL(stmt->whereClause); - ASSERT_NULL(stmt->groupBy); -} - -TEST(SelectExprTest) { - TEST_PARSE_SINGLE_SQL("SELECT a, MAX(b), CUSTOM(c, F(un)) FROM students;", kStmtSelect, SelectStatement, result, - stmt); - - ASSERT_NULL(stmt->whereClause); - ASSERT_NULL(stmt->groupBy); - - ASSERT_EQ(stmt->selectList->size(), 3); - - ASSERT(stmt->selectList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->selectList->at(0)->getName(), "a"); - - ASSERT(stmt->selectList->at(1)->isType(kExprFunctionRef)); - ASSERT_STREQ(stmt->selectList->at(1)->getName(), "MAX"); - ASSERT_NOTNULL(stmt->selectList->at(1)->exprList); - ASSERT_EQ(stmt->selectList->at(1)->exprList->size(), 1); - ASSERT(stmt->selectList->at(1)->exprList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->selectList->at(1)->exprList->at(0)->getName(), "b"); - - ASSERT(stmt->selectList->at(2)->isType(kExprFunctionRef)); - ASSERT_STREQ(stmt->selectList->at(2)->getName(), "CUSTOM"); - ASSERT_NOTNULL(stmt->selectList->at(2)->exprList); - ASSERT_EQ(stmt->selectList->at(2)->exprList->size(), 2); - ASSERT(stmt->selectList->at(2)->exprList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(0)->getName(), "c"); - - ASSERT(stmt->selectList->at(2)->exprList->at(1)->isType(kExprFunctionRef)); - ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->getName(), "F"); - ASSERT_EQ(stmt->selectList->at(2)->exprList->at(1)->exprList->size(), 1); - ASSERT(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->selectList->at(2)->exprList->at(1)->exprList->at(0)->getName(), "un"); -} - -TEST(SelectUnaryMinusTest) { - TEST_PARSE_SINGLE_SQL( - "SELECT 10 - 20, 10 + -20, 10 +-20, 10+-20, 9223372036854775807, -9223372036854775808, 10-5.2, 10+-5.2", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_EQ(stmt->selectList->size(), 8); - - ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(0)->opType, kOpMinus); - ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(0)->expr->ival, 10); - ASSERT_EQ(stmt->selectList->at(0)->expr2->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(0)->expr2->ival, 20); - - ASSERT_EQ(stmt->selectList->at(1)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(1)->opType, kOpPlus); - ASSERT_EQ(stmt->selectList->at(1)->expr->ival, 10); - ASSERT_EQ(stmt->selectList->at(1)->expr2->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(1)->expr2->opType, kOpUnaryMinus); - ASSERT_EQ(stmt->selectList->at(1)->expr2->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(1)->expr2->expr->ival, 20); - - ASSERT_EQ(stmt->selectList->at(2)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(2)->opType, kOpPlus); - ASSERT_EQ(stmt->selectList->at(2)->expr->ival, 10); - ASSERT_EQ(stmt->selectList->at(2)->expr2->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(2)->expr2->opType, kOpUnaryMinus); - ASSERT_EQ(stmt->selectList->at(2)->expr2->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(2)->expr2->expr->ival, 20); - - ASSERT_EQ(stmt->selectList->at(3)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(3)->opType, kOpPlus); - ASSERT_EQ(stmt->selectList->at(3)->expr->ival, 10); - ASSERT_EQ(stmt->selectList->at(3)->expr2->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(3)->expr2->opType, kOpUnaryMinus); - ASSERT_EQ(stmt->selectList->at(3)->expr2->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(3)->expr2->expr->ival, 20); - - ASSERT_EQ(stmt->selectList->at(4)->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(4)->ival, LLONG_MAX); - - ASSERT_EQ(stmt->selectList->at(5)->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(5)->ival, LLONG_MIN); - - ASSERT_EQ(stmt->selectList->at(6)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(6)->opType, kOpMinus); - ASSERT_EQ(stmt->selectList->at(6)->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(6)->expr->ival, 10); - ASSERT_EQ(stmt->selectList->at(6)->expr2->type, kExprLiteralFloat); - ASSERT_EQ(stmt->selectList->at(6)->expr2->fval, 5.2); - - ASSERT_EQ(stmt->selectList->at(7)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(7)->opType, kOpPlus); - ASSERT_EQ(stmt->selectList->at(7)->expr->ival, 10); - ASSERT_EQ(stmt->selectList->at(7)->expr2->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(7)->expr2->opType, kOpUnaryMinus); - ASSERT_EQ(stmt->selectList->at(7)->expr2->expr->type, kExprLiteralFloat); - ASSERT_EQ(stmt->selectList->at(7)->expr2->expr->fval, 5.2); -} - -TEST(SelectSubstrTest) { - TEST_PARSE_SINGLE_SQL("SELECT SUBSTR(a, 3, 5) FROM students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_NULL(stmt->whereClause); - ASSERT_NULL(stmt->groupBy); - - ASSERT_EQ(stmt->selectList->size(), 1); - - ASSERT(stmt->selectList->at(0)->isType(kExprFunctionRef)); - ASSERT_STREQ(stmt->selectList->at(0)->getName(), "SUBSTR"); - - ASSERT_NOTNULL(stmt->selectList->at(0)->exprList); - ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 3); - - ASSERT(stmt->selectList->at(0)->exprList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->selectList->at(0)->exprList->at(0)->getName(), "a"); - - ASSERT(stmt->selectList->at(0)->exprList->at(1)->isType(kExprLiteralInt)); - ASSERT_EQ(stmt->selectList->at(0)->exprList->at(1)->ival, 3); - - ASSERT(stmt->selectList->at(0)->exprList->at(2)->isType(kExprLiteralInt)); - ASSERT_EQ(stmt->selectList->at(0)->exprList->at(2)->ival, 5); -} - -TEST(SelectHavingTest) { - TEST_PARSE_SINGLE_SQL("SELECT city, AVG(grade) AS avg_grade FROM students GROUP BY city HAVING AVG(grade) < -2.0", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_FALSE(stmt->selectDistinct); - ASSERT_NULL(stmt->having); - - GroupByDescription* group = stmt->groupBy; - ASSERT_NOTNULL(group); - ASSERT_EQ(group->columns->size(), 1); - ASSERT_EQ(group->having->opType, kOpLess); - ASSERT(group->having->expr->isType(kExprFunctionRef)); - ASSERT(group->having->expr2->isType(kExprOperator)); - ASSERT_EQ(group->having->expr2->opType, kOpUnaryMinus); - ASSERT_EQ(group->having->expr2->expr->fval, 2.0); -} - -TEST(SelectStandaloneHavingTest) { - TEST_PARSE_SINGLE_SQL("SELECT COUNT(*) FROM students HAVING COUNT(*) > 1", kStmtSelect, SelectStatement, result, - stmt); - - ASSERT_NULL(stmt->groupBy); - ASSERT_NOTNULL(stmt->having); - ASSERT_EQ(stmt->having->opType, kOpGreater); - ASSERT(stmt->having->expr->isType(kExprFunctionRef)); - ASSERT_STREQ(stmt->having->expr->getName(), "COUNT"); - ASSERT_NOTNULL(stmt->having->expr->exprList); - ASSERT_EQ(stmt->having->expr->exprList->size(), 1); - ASSERT(stmt->having->expr->exprList->at(0)->isType(kExprStar)); - ASSERT(stmt->having->expr2->isType(kExprLiteralInt)); - ASSERT_EQ(stmt->having->expr2->ival, 1); -} - -TEST(SelectDistinctTest) { - TEST_PARSE_SINGLE_SQL("SELECT DISTINCT grade, city FROM students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT(stmt->selectDistinct); - ASSERT_NULL(stmt->whereClause); -} - -TEST(SelectSchemaTest) { - TEST_PARSE_SINGLE_SQL("SELECT grade FROM some_schema.students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT(stmt->fromTable); - ASSERT_EQ(std::string(stmt->fromTable->schema), "some_schema"); -} - -TEST(SelectReservedIdentifierTest) { - TEST_PARSE_SINGLE_SQL("SELECT offset, mjdRef, drift FROM LeapSeconds where offset = 10", kStmtSelect, - SelectStatement, result, stmt); - - ASSERT_EQ(stmt->selectList->size(), 3); - ASSERT(stmt->selectList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->selectList->at(0)->getName(), "offset"); - ASSERT(stmt->whereClause); - ASSERT(stmt->whereClause->isType(kExprOperator)); - ASSERT_EQ(stmt->whereClause->opType, kOpEquals); - ASSERT(stmt->whereClause->expr->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->whereClause->expr->getName(), "offset"); -} - -TEST(SelectGroupDistinctTest) { - TEST_PARSE_SINGLE_SQL("SELECT city, COUNT(name), COUNT(DISTINCT grade) FROM students GROUP BY city;", kStmtSelect, - SelectStatement, result, stmt); - - ASSERT_FALSE(stmt->selectDistinct); - ASSERT_EQ(stmt->selectList->size(), 3); - ASSERT(!stmt->selectList->at(1)->distinct); - ASSERT(stmt->selectList->at(2)->distinct); -} - -TEST(OrderByTest) { - TEST_PARSE_SINGLE_SQL("SELECT grade, city FROM students ORDER BY grade, city DESC NULLS FIRST, name NULLS LAST;", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_NULL(stmt->whereClause); - ASSERT_NOTNULL(stmt->order); - - ASSERT_EQ(stmt->order->size(), 3); - ASSERT_EQ(stmt->order->at(0)->type, kOrderAsc); - ASSERT_STREQ(stmt->order->at(0)->expr->name, "grade"); - ASSERT_EQ(stmt->order->at(0)->null_ordering, NullOrdering::Undefined); - - ASSERT_EQ(stmt->order->at(1)->type, kOrderDesc); - ASSERT_STREQ(stmt->order->at(1)->expr->name, "city"); - ASSERT_EQ(stmt->order->at(1)->null_ordering, NullOrdering::First); - - ASSERT_EQ(stmt->order->at(2)->type, kOrderAsc); - ASSERT_STREQ(stmt->order->at(2)->expr->name, "name"); - ASSERT_EQ(stmt->order->at(2)->null_ordering, NullOrdering::Last); -} - -TEST(SelectBetweenTest) { - TEST_PARSE_SINGLE_SQL("SELECT grade, city FROM students WHERE grade BETWEEN 1 and c;", kStmtSelect, SelectStatement, - result, stmt); - - Expr* where = stmt->whereClause; - ASSERT_NOTNULL(where); - ASSERT(where->isType(kExprOperator)); - ASSERT_EQ(where->opType, kOpBetween); - - ASSERT_STREQ(where->expr->getName(), "grade"); - ASSERT(where->expr->isType(kExprColumnRef)); - - ASSERT_EQ(where->exprList->size(), 2); - ASSERT(where->exprList->at(0)->isType(kExprLiteralInt)); - ASSERT_EQ(where->exprList->at(0)->ival, 1); - ASSERT(where->exprList->at(1)->isType(kExprColumnRef)); - ASSERT_STREQ(where->exprList->at(1)->getName(), "c"); -} - -TEST(SelectConditionalSelectTest) { - TEST_PARSE_SINGLE_SQL( - "SELECT * FROM t WHERE a = (SELECT MIN(v) FROM tt) AND EXISTS (SELECT * FROM test WHERE x < a);", kStmtSelect, - SelectStatement, result, stmt); - - Expr* where = stmt->whereClause; - ASSERT_NOTNULL(where); - ASSERT(where->isType(kExprOperator)); - ASSERT_EQ(where->opType, kOpAnd); - - // a = (SELECT ...) - Expr* cond1 = where->expr; - ASSERT_NOTNULL(cond1); - ASSERT_NOTNULL(cond1->expr); - ASSERT_EQ(cond1->opType, kOpEquals); - ASSERT_STREQ(cond1->expr->getName(), "a"); - ASSERT(cond1->expr->isType(kExprColumnRef)); - - ASSERT_NOTNULL(cond1->expr2); - ASSERT(cond1->expr2->isType(kExprSelect)); - - SelectStatement* select2 = cond1->expr2->select; - ASSERT_NOTNULL(select2); - ASSERT_STREQ(select2->fromTable->getName(), "tt"); - - // EXISTS (SELECT ...) - Expr* cond2 = where->expr2; - ASSERT_EQ(cond2->opType, kOpExists); - ASSERT_NOTNULL(cond2->select); - - SelectStatement* ex_select = cond2->select; - ASSERT_STREQ(ex_select->fromTable->getName(), "test"); -} - -TEST(SelectCaseWhen) { - TEST_PARSE_SINGLE_SQL("SELECT MAX(CASE WHEN a = 'foo' THEN x ELSE 0 END) FROM test;", kStmtSelect, SelectStatement, - result, stmt); - - ASSERT_EQ(stmt->selectList->size(), 1); - Expr* func = stmt->selectList->at(0); - - ASSERT_NOTNULL(func); - ASSERT(func->isType(kExprFunctionRef)); - ASSERT_EQ(func->exprList->size(), 1); - - Expr* caseExpr = func->exprList->at(0); - ASSERT_NOTNULL(caseExpr); - ASSERT(caseExpr->isType(kExprOperator)); - ASSERT_EQ(caseExpr->opType, kOpCase); - ASSERT_NULL(caseExpr->expr); - ASSERT_NOTNULL(caseExpr->exprList); - ASSERT_NOTNULL(caseExpr->expr2); - ASSERT_EQ(caseExpr->exprList->size(), 1); - ASSERT(caseExpr->expr2->isType(kExprLiteralInt)); - - Expr* whenExpr = caseExpr->exprList->at(0); - ASSERT(whenExpr->expr->isType(kExprOperator)); - ASSERT_EQ(whenExpr->expr->opType, kOpEquals); - ASSERT(whenExpr->expr->expr->isType(kExprColumnRef)); - ASSERT(whenExpr->expr->expr2->isType(kExprLiteralString)); -} - -TEST(SelectCaseWhenWhen) { - TEST_PARSE_SINGLE_SQL("SELECT CASE WHEN x = 1 THEN 1 WHEN 1.25 < x THEN 2 END FROM test;", kStmtSelect, - SelectStatement, result, stmt); - - ASSERT_EQ(stmt->selectList->size(), 1); - Expr* caseExpr = stmt->selectList->at(0); - ASSERT_NOTNULL(caseExpr); - ASSERT(caseExpr->isType(kExprOperator)); - ASSERT_EQ(caseExpr->opType, kOpCase); - // CASE [expr] [exprList] [expr2] - // [expr] [expr] - // [expr] [expr2] [expr] [expr2] - // CASE (null) WHEN X = 1 THEN 1 WHEN 1.25 < x THEN 2 (null) - ASSERT_NULL(caseExpr->expr); - ASSERT_NOTNULL(caseExpr->exprList); - ASSERT_NULL(caseExpr->expr2); - ASSERT_EQ(caseExpr->exprList->size(), 2); - - Expr* whenExpr = caseExpr->exprList->at(0); - ASSERT_EQ(whenExpr->expr->opType, kOpEquals); - ASSERT(whenExpr->expr->expr->isType(kExprColumnRef)); - ASSERT(whenExpr->expr->expr2->isType(kExprLiteralInt)); - - Expr* whenExpr2 = caseExpr->exprList->at(1); - ASSERT_EQ(whenExpr2->expr->opType, kOpLess); - ASSERT(whenExpr2->expr->expr->isType(kExprLiteralFloat)); - ASSERT(whenExpr2->expr->expr2->isType(kExprColumnRef)); -} - -TEST(SelectCaseValueWhenWhenElse) { - TEST_PARSE_SINGLE_SQL("SELECT CASE x WHEN 1 THEN 0 WHEN 2 THEN 3 WHEN 8 THEN 7 ELSE 4 END FROM test;", kStmtSelect, - SelectStatement, result, stmt); - - ASSERT_EQ(stmt->selectList->size(), 1); - Expr* caseExpr = stmt->selectList->at(0); - ASSERT_NOTNULL(caseExpr); - ASSERT(caseExpr->isType(kExprOperator)); - ASSERT_EQ(caseExpr->opType, kOpCase); - ASSERT_NOTNULL(caseExpr->expr); - ASSERT_NOTNULL(caseExpr->exprList); - ASSERT_NOTNULL(caseExpr->expr2); - ASSERT_EQ(caseExpr->exprList->size(), 3); - ASSERT(caseExpr->expr->isType(kExprColumnRef)); - - Expr* whenExpr = caseExpr->exprList->at(2); - ASSERT(whenExpr->expr->isType(kExprLiteralInt)); - ASSERT_EQ(whenExpr->expr2->ival, 7); -} - -TEST(SelectJoin) { - TEST_PARSE_SINGLE_SQL( - "SELECT City.name, Product.category, SUM(price) FROM fact\ - INNER JOIN City ON fact.city_id = City.id\ - OUTER JOIN Product ON fact.product_id = Product.id\ - GROUP BY City.name, Product.category;", - kStmtSelect, SelectStatement, result, stmt); - - const TableRef* table = stmt->fromTable; - const JoinDefinition* outer_join = table->join; - ASSERT_EQ(table->type, kTableJoin); - ASSERT_EQ(outer_join->type, kJoinFull); - - ASSERT_EQ(outer_join->right->type, kTableName); - ASSERT_STREQ(outer_join->right->name, "Product"); - ASSERT_EQ(outer_join->condition->opType, kOpEquals); - ASSERT_STREQ(outer_join->condition->expr->table, "fact"); - ASSERT_STREQ(outer_join->condition->expr->name, "product_id"); - ASSERT_STREQ(outer_join->condition->expr2->table, "Product"); - ASSERT_STREQ(outer_join->condition->expr2->name, "id"); - ASSERT_FALSE(outer_join->namedColumns); - - // Joins are are left associative. - // So the second join should be on the left. - ASSERT_EQ(outer_join->left->type, kTableJoin); - - const JoinDefinition* inner_join = outer_join->left->join; - ASSERT_EQ(inner_join->type, kJoinInner); - ASSERT_EQ(inner_join->left->type, kTableName); - ASSERT_STREQ(inner_join->left->name, "fact"); - ASSERT_EQ(inner_join->right->type, kTableName); - ASSERT_STREQ(inner_join->right->name, "City"); - ASSERT_FALSE(inner_join->namedColumns); - - ASSERT_EQ(inner_join->condition->opType, kOpEquals); - ASSERT_STREQ(inner_join->condition->expr->table, "fact"); - ASSERT_STREQ(inner_join->condition->expr->name, "city_id"); - ASSERT_STREQ(inner_join->condition->expr2->table, "City"); - ASSERT_STREQ(inner_join->condition->expr2->name, "id"); -} - -TEST(SelectJoinUsing) { - TEST_PARSE_SQL_QUERY( - "SELECT * FROM foo INNER JOIN bar USING (a, b);" - "SELECT a, b, c FROM foo LEFT JOIN bar USING (a);" - "SELECT b FROM foo AS baz JOIN bar USING (a);", - result, 3); - - auto stmt = (SelectStatement*)result.getStatement(0); - // SELECT * ... - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_EQ(stmt->selectList->front()->type, kExprStar); - - // ... FROM foo INNER JOIN bar ... - ASSERT_TRUE(stmt->fromTable); - ASSERT_EQ(stmt->fromTable->type, kTableJoin); - ASSERT_TRUE(stmt->fromTable->join); - ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); - ASSERT_TRUE(stmt->fromTable->join->left); - ASSERT_EQ(stmt->fromTable->join->left->type, kTableName); - ASSERT_TRUE(stmt->fromTable->join->left->name); - ASSERT_STREQ(stmt->fromTable->join->left->name, "foo"); - ASSERT_TRUE(stmt->fromTable->join->right); - ASSERT_EQ(stmt->fromTable->join->right->type, kTableName); - ASSERT_TRUE(stmt->fromTable->join->right->name); - ASSERT_STREQ(stmt->fromTable->join->right->name, "bar"); - - // ... USING a, b; - ASSERT_FALSE(stmt->fromTable->join->condition); - ASSERT_TRUE(stmt->fromTable->join->namedColumns); - ASSERT_EQ(stmt->fromTable->join->namedColumns->size(), 2); - ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(0), "a"); - ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(1), "b"); - - stmt = (SelectStatement*)result.getStatement(1); - // SELECT a, b, c ... - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 3); - ASSERT_EQ(stmt->selectList->at(0)->type, kExprColumnRef); - ASSERT_TRUE(stmt->selectList->at(0)->name); - ASSERT_STREQ(stmt->selectList->at(0)->name, "a"); - ASSERT_EQ(stmt->selectList->at(1)->type, kExprColumnRef); - ASSERT_TRUE(stmt->selectList->at(1)->name); - ASSERT_STREQ(stmt->selectList->at(1)->name, "b"); - ASSERT_EQ(stmt->selectList->at(2)->type, kExprColumnRef); - ASSERT_TRUE(stmt->selectList->at(2)->name); - ASSERT_STREQ(stmt->selectList->at(2)->name, "c"); - - // ... FROM foo LEFT JOIN bar ... - ASSERT_TRUE(stmt->fromTable); - ASSERT_EQ(stmt->fromTable->type, kTableJoin); - ASSERT_TRUE(stmt->fromTable->join); - ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); - ASSERT_TRUE(stmt->fromTable->join->left); - ASSERT_EQ(stmt->fromTable->join->left->type, kTableName); - ASSERT_TRUE(stmt->fromTable->join->left->name); - ASSERT_STREQ(stmt->fromTable->join->left->name, "foo"); - ASSERT_TRUE(stmt->fromTable->join->right); - ASSERT_EQ(stmt->fromTable->join->right->type, kTableName); - ASSERT_TRUE(stmt->fromTable->join->right->name); - ASSERT_STREQ(stmt->fromTable->join->right->name, "bar"); - - // ... USING a; - ASSERT_FALSE(stmt->fromTable->join->condition); - ASSERT_TRUE(stmt->fromTable->join->namedColumns); - ASSERT_EQ(stmt->fromTable->join->namedColumns->size(), 1); - ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(0), "a"); - - stmt = (SelectStatement*)result.getStatement(2); - // SELECT b ... - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_EQ(stmt->selectList->at(0)->type, kExprColumnRef); - ASSERT_TRUE(stmt->selectList->at(0)->name); - ASSERT_STREQ(stmt->selectList->at(0)->name, "b"); - - // ... FROM foo as baz JOIN bar ... - ASSERT_TRUE(stmt->fromTable); - ASSERT_EQ(stmt->fromTable->type, kTableJoin); - ASSERT_TRUE(stmt->fromTable->join); - ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); - ASSERT_TRUE(stmt->fromTable->join->left); - ASSERT_EQ(stmt->fromTable->join->left->type, kTableName); - ASSERT_TRUE(stmt->fromTable->join->left->name); - ASSERT_STREQ(stmt->fromTable->join->left->name, "foo"); - ASSERT_TRUE(stmt->fromTable->join->left->alias); - ASSERT_TRUE(stmt->fromTable->join->left->alias->name); - ASSERT_STREQ(stmt->fromTable->join->left->alias->name, "baz"); - ASSERT_TRUE(stmt->fromTable->join->right); - ASSERT_EQ(stmt->fromTable->join->right->type, kTableName); - ASSERT_TRUE(stmt->fromTable->join->right->name); - ASSERT_STREQ(stmt->fromTable->join->right->name, "bar"); - - // ... USING a; - ASSERT_FALSE(stmt->fromTable->join->condition); - ASSERT_TRUE(stmt->fromTable->join->namedColumns); - ASSERT_EQ(stmt->fromTable->join->namedColumns->size(), 1); - ASSERT_STREQ(stmt->fromTable->join->namedColumns->at(0), "a"); -} - -TEST(SelectColumnOrder) { - TEST_PARSE_SINGLE_SQL( - "SELECT *\ - FROM a,\ - (SELECT a AS b FROM a) b,\ - (SELECT a AS c FROM a) c,\ - (SELECT a AS d FROM a) d;", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_EQ(stmt->fromTable->list->size(), 4); - - // Make sure the order of the table list is corrects - ASSERT_STREQ(stmt->fromTable->list->at(0)->name, "a"); - ASSERT_STREQ(stmt->fromTable->list->at(1)->alias->name, "b"); - ASSERT_STREQ(stmt->fromTable->list->at(2)->alias->name, "c"); - ASSERT_STREQ(stmt->fromTable->list->at(3)->alias->name, "d"); -} - -TEST(SelectAliasAbsent) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_NULL(stmt->fromTable->alias); -} - -TEST(SelectAliasSimple) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students AS s1;", kStmtSelect, SelectStatement, result, stmt); - - Alias* alias = stmt->fromTable->alias; - ASSERT_NOTNULL(alias); - ASSERT_STREQ(alias->name, "s1"); - ASSERT_NULL(alias->columns); -} - -TEST(SelectAliasWithColumns) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students AS s1(id, city);", kStmtSelect, SelectStatement, result, stmt); - - Alias* alias = stmt->fromTable->alias; - ASSERT_NOTNULL(alias); - - ASSERT_NOTNULL(alias->name); - ASSERT_STREQ(alias->name, "s1"); - - ASSERT_NOTNULL(alias->columns); - ASSERT_EQ(alias->columns->size(), 2); - ASSERT_STREQ(alias->columns->at(0), "id"); - ASSERT_STREQ(alias->columns->at(1), "city"); -} - -TEST(SelectExpressionAlias) { - TEST_PARSE_SINGLE_SQL("SELECT AVG(grade) avg_grade FROM students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_NULL(stmt->fromTable->alias); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_TRUE(stmt->selectList->at(0)->isType(kExprFunctionRef)); - ASSERT_STREQ(stmt->selectList->at(0)->name, "AVG"); - ASSERT_TRUE(stmt->selectList->at(0)->hasAlias()); - ASSERT_STREQ(stmt->selectList->at(0)->alias, "avg_grade"); -} - -TEST(Operators) { - SelectStatement* stmt; - SQLParserResult result; - - SQLParser::parse( - "SELECT * FROM foo where a = 1; \ - SELECT * FROM foo where a == 2; \ - SELECT * FROM foo where a != 1; \ - SELECT * FROM foo where a <> 1; \ - SELECT * FROM foo where a > 1; \ - SELECT * FROM foo where a < 1; \ - SELECT * FROM foo where a >= 1; \ - SELECT * FROM foo where a <= 1; \ - SELECT * FROM foo where a = TRUE; \ - SELECT * FROM foo where a = false;", - &result); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->whereClause->opType, kOpEquals); - ASSERT_EQ(stmt->whereClause->expr2->ival, 1); - ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, false); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->whereClause->opType, kOpEquals); - ASSERT_EQ(stmt->whereClause->expr2->ival, 2); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_EQ(stmt->whereClause->opType, kOpNotEquals); - - stmt = (SelectStatement*)result.getStatement(3); - ASSERT_EQ(stmt->whereClause->opType, kOpNotEquals); - - stmt = (SelectStatement*)result.getStatement(4); - ASSERT_EQ(stmt->whereClause->opType, kOpGreater); - - stmt = (SelectStatement*)result.getStatement(5); - ASSERT_EQ(stmt->whereClause->opType, kOpLess); - - stmt = (SelectStatement*)result.getStatement(6); - ASSERT_EQ(stmt->whereClause->opType, kOpGreaterEq); - - stmt = (SelectStatement*)result.getStatement(7); - ASSERT_EQ(stmt->whereClause->opType, kOpLessEq); - - stmt = (SelectStatement*)result.getStatement(8); - ASSERT_EQ(stmt->whereClause->opType, kOpEquals); - ASSERT_EQ(stmt->whereClause->expr2->ival, 1); - ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, true); - - stmt = (SelectStatement*)result.getStatement(9); - ASSERT_EQ(stmt->whereClause->opType, kOpEquals); - ASSERT_EQ(stmt->whereClause->expr2->ival, 0); - ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, true); -} - -TEST(JoinTypes) { - SelectStatement* stmt; - SQLParserResult result; - - SQLParser::parse( - "SELECT * FROM x join y on a=b; \ - SELECT * FROM x inner join y on a=b; \ - SELECT * FROM x left join y on a=b; \ - SELECT * FROM x left outer join y on a=b; \ - SELECT * FROM x right join y on a=b; \ - SELECT * FROM x right outer join y on a=b; \ - SELECT * FROM x full join y on a=b; \ - SELECT * FROM x outer join y on a=b; \ - SELECT * FROM x full outer join y on a=b; \ - SELECT * FROM x natural join y; \ - SELECT * FROM x cross join y; \ - SELECT * FROM x, y where a = b;", - &result); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(3); - ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(4); - ASSERT_EQ(stmt->fromTable->join->type, kJoinRight); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(5); - ASSERT_EQ(stmt->fromTable->join->type, kJoinRight); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(6); - ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(7); - ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(8); - ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(9); - ASSERT_EQ(stmt->fromTable->join->type, kJoinNatural); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - - stmt = (SelectStatement*)result.getStatement(10); - ASSERT_EQ(stmt->fromTable->join->type, kJoinCross); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - ASSERT_NULL(stmt->fromTable->join->condition); - - stmt = (SelectStatement*)result.getStatement(11); - ASSERT_NULL(stmt->fromTable->join); -} - -TEST(CrossJoinNoCondition) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM x cross join y;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_NOTNULL(stmt->fromTable); - ASSERT_NOTNULL(stmt->fromTable->join); - ASSERT_EQ(stmt->fromTable->join->type, kJoinCross); - ASSERT_FALSE(stmt->fromTable->join->namedColumns); - ASSERT_NULL(stmt->fromTable->join->condition); -} - -TEST(SetLimitOffset) { - SelectStatement* stmt; - - TEST_PARSE_SQL_QUERY( - "select a from t1 limit 1; \ - select a from t1 limit 1 + 2; \ - select a from t1 offset 1; \ - select a from t1 offset 1 + 2; \ - select a from t1 limit 1 offset 1; \ - select a from t1 limit 1 + 2 offset 1 + 2; \ - select a from t1 limit 1 offset NULL; \ - select a from t1 limit ALL; \ - select a from t1 limit NULL; \ - select a from t1 limit ALL offset 1; \ - select a from t1 limit NULL offset 1; \ - select top 10 a from t1; \ - select top 20 a from t1 limit 10; \ - select a from t1 limit (SELECT MAX(b) FROM t1) offset (SELECT MIN(b) FROM t1);", - result, 14); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->limit->ival, 1); - ASSERT_NULL(stmt->limit->offset); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->limit->limit->type, kExprOperator); - ASSERT_EQ(stmt->limit->limit->opType, kOpPlus); - ASSERT_EQ(stmt->limit->limit->expr->ival, 1); - ASSERT_EQ(stmt->limit->limit->expr2->ival, 2); - ASSERT_NULL(stmt->limit->offset); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_NULL(stmt->limit->limit); - ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->offset->ival, 1); - - stmt = (SelectStatement*)result.getStatement(3); - ASSERT_NULL(stmt->limit->limit); - ASSERT_EQ(stmt->limit->offset->type, kExprOperator); - ASSERT_EQ(stmt->limit->offset->opType, kOpPlus); - ASSERT_EQ(stmt->limit->offset->expr->ival, 1); - ASSERT_EQ(stmt->limit->offset->expr2->ival, 2); - - stmt = (SelectStatement*)result.getStatement(4); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->limit->ival, 1); - ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->offset->ival, 1); - - stmt = (SelectStatement*)result.getStatement(5); - ASSERT_EQ(stmt->limit->limit->type, kExprOperator); - ASSERT_EQ(stmt->limit->limit->opType, kOpPlus); - ASSERT_EQ(stmt->limit->limit->expr->ival, 1); - ASSERT_EQ(stmt->limit->limit->expr2->ival, 2); - ASSERT_EQ(stmt->limit->offset->type, kExprOperator); - ASSERT_EQ(stmt->limit->offset->opType, kOpPlus); - ASSERT_EQ(stmt->limit->offset->expr->ival, 1); - ASSERT_EQ(stmt->limit->offset->expr2->ival, 2); - - stmt = (SelectStatement*)result.getStatement(6); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->limit->ival, 1); - ASSERT_EQ(stmt->limit->offset->type, kExprLiteralNull); - - stmt = (SelectStatement*)result.getStatement(7); - ASSERT_NULL(stmt->limit->limit); - ASSERT_NULL(stmt->limit->offset); - - stmt = (SelectStatement*)result.getStatement(8); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralNull); - ASSERT_NULL(stmt->limit->offset); - - stmt = (SelectStatement*)result.getStatement(9); - ASSERT_NULL(stmt->limit->limit); - ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->offset->ival, 1); - - stmt = (SelectStatement*)result.getStatement(10); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralNull); - ASSERT_EQ(stmt->limit->offset->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->offset->ival, 1); - - stmt = (SelectStatement*)result.getStatement(11); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->limit->ival, 10); - ASSERT_NULL(stmt->limit->offset); - - stmt = (SelectStatement*)result.getStatement(12); - ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt); - ASSERT_EQ(stmt->limit->limit->ival, 10); - ASSERT_NULL(stmt->limit->offset); - - stmt = (SelectStatement*)result.getStatement(13); - ASSERT_EQ(stmt->limit->limit->type, kExprSelect); - ASSERT_EQ(stmt->limit->offset->type, kExprSelect); -} - -TEST(Extract) { - SelectStatement* stmt; - - TEST_PARSE_SQL_QUERY( - "select extract(year from dc) FROM t;" - "select x, extract(month from dc) AS t FROM t;" - "select x FROM t WHERE extract(minute from dc) > 2011;", - result, 3); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1u); - ASSERT_EQ(stmt->selectList->at(0)->type, kExprExtract); - ASSERT_EQ(stmt->selectList->at(0)->datetimeField, kDatetimeYear); - ASSERT_TRUE(stmt->selectList->at(0)->expr); - ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprColumnRef); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 2u); - ASSERT_EQ(stmt->selectList->at(1)->type, kExprExtract); - ASSERT_EQ(stmt->selectList->at(1)->datetimeField, kDatetimeMonth); - ASSERT_TRUE(stmt->selectList->at(1)->expr); - ASSERT_EQ(stmt->selectList->at(1)->expr->type, kExprColumnRef); - ASSERT_TRUE(stmt->selectList->at(1)->alias); - ASSERT_EQ(stmt->selectList->at(1)->alias, std::string("t")); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_TRUE(stmt->whereClause); - ASSERT_TRUE(stmt->whereClause->expr); - ASSERT_EQ(stmt->whereClause->expr->type, kExprExtract); - ASSERT_EQ(stmt->whereClause->expr->datetimeField, kDatetimeMinute); -} - -TEST(CastExpression) { - TEST_PARSE_SINGLE_SQL("SELECT CAST(10 AS INT);", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_TRUE(stmt->selectList); - ASSERT_FALSE(stmt->fromTable); - ASSERT_FALSE(stmt->whereClause); - ASSERT_FALSE(stmt->groupBy); - - ASSERT_EQ(stmt->selectList->size(), 1u); - ASSERT_EQ(stmt->selectList->at(0)->type, kExprCast); - ASSERT_EQ(stmt->selectList->at(0)->columnType, ColumnType(DataType::INT)); - ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt); -} - -TEST(NoFromClause) { - TEST_PARSE_SINGLE_SQL("SELECT 1 + 2;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_TRUE(stmt->selectList); - ASSERT_FALSE(stmt->fromTable); - ASSERT_FALSE(stmt->whereClause); - ASSERT_FALSE(stmt->groupBy); - - ASSERT_EQ(stmt->selectList->size(), 1u); - ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(0)->expr2->type, kExprLiteralInt); -} - -TEST(WithClauseSingle) { - TEST_PARSE_SINGLE_SQL( - "WITH " - "a AS (SELECT name FROM peopleA)" - "SELECT name FROM a;", - kStmtSelect, SelectStatement, result, stmt); - - // with_description_list – count - ASSERT_EQ(stmt->withDescriptions->size(), 1); - - // with_description – alias - ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "a"); - - // with_description – select stmt - ASSERT_EQ(stmt->withDescriptions->at(0)->select->selectList->size(), 1); - ASSERT_STREQ(stmt->withDescriptions->at(0)->select->selectList->at(0)->name, std::string("name")); - ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, std::string("peopleA")); - - // main select - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_STREQ(stmt->selectList->at(0)->name, "name"); - ASSERT_STREQ(stmt->fromTable->name, "a"); -} - -TEST(WithClauseDouble) { - TEST_PARSE_SINGLE_SQL( - "WITH " - "a AS (SELECT nameA FROM peopleA), " - "b AS (SELECT nameB, cityB FROM peopleB) " - "SELECT nameA FROM a;", - kStmtSelect, SelectStatement, result, stmt); - - // with_description_list – count - ASSERT_EQ(stmt->withDescriptions->size(), 2); - - // with_description – aliases - ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "a"); - ASSERT_STREQ(stmt->withDescriptions->at(1)->alias, "b"); - - // with_description – select stmts - ASSERT_EQ(stmt->withDescriptions->at(0)->select->selectList->size(), 1); - ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, "peopleA"); - ASSERT_EQ(stmt->withDescriptions->at(1)->select->selectList->size(), 2); - ASSERT_STREQ(stmt->withDescriptions->at(1)->select->fromTable->name, "peopleB"); - - // main select - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_STREQ(stmt->selectList->at(0)->name, "nameA"); - ASSERT_STREQ(stmt->fromTable->name, "a"); -} - -TEST(CastAsDate) { - TEST_PARSE_SINGLE_SQL("SELECT CAST(ID AS DATE) FROM TEST", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_TRUE(result.isValid()); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_EQ(stmt->selectList->front()->type, kExprCast); - ASSERT_EQ(stmt->selectList->front()->columnType.data_type, DataType::DATE); -} - -TEST(DateLiteral) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM t WHERE a = DATE '1996-12-31'", kStmtSelect, SelectStatement, result, stmt); - ASSERT_TRUE(result.isValid()); - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->whereClause->opType, kOpEquals); - ASSERT_STREQ(stmt->whereClause->expr2->name, "1996-12-31"); -} - -TEST(IntervalLiteral) { - SelectStatement* stmt; - Expr* interval_literal; - TEST_PARSE_SQL_QUERY( - "SELECT a + 1 year FROM t;" - "SELECT * FROM t where a = cast ('2000-01-01' AS DATE) - 30 days;", - result, 2); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1u); - ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator); - ASSERT_TRUE(stmt->selectList->at(0)->expr2); - interval_literal = stmt->selectList->at(0)->expr2; - ASSERT_EQ(interval_literal->datetimeField, kDatetimeYear); - ASSERT_EQ(interval_literal->ival, 1); - ASSERT_EQ(interval_literal->type, kExprLiteralInterval); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_TRUE(stmt->whereClause); - ASSERT_TRUE(stmt->whereClause->expr); - ASSERT_TRUE(stmt->whereClause->type = kExprOperator); - ASSERT_TRUE(stmt->whereClause->opType = kOpEquals); - ASSERT_TRUE(stmt->whereClause->expr2); - ASSERT_TRUE(stmt->whereClause->expr2->type = kExprOperator); - ASSERT_TRUE(stmt->whereClause->expr2->opType = kOpPlus); - ASSERT_TRUE(stmt->whereClause->expr2->expr2); - interval_literal = stmt->whereClause->expr2->expr2; - ASSERT_EQ(interval_literal->datetimeField, kDatetimeDay); - ASSERT_EQ(interval_literal->ival, 30); - ASSERT_EQ(interval_literal->type, kExprLiteralInterval); - - const auto interval_units = std::map{ - {kDatetimeSecond, "second"}, {kDatetimeMinute, "minute"}, {kDatetimeHour, "hour"}, - {kDatetimeDay, "day"}, {kDatetimeMonth, "month"}, {kDatetimeYear, "year"}}; - - for (const auto& it : interval_units) { - const auto& unit_string = it.second; - const auto unit_string_plural = unit_string + "s"; - TEST_PARSE_SQL_QUERY("SELECT * FROM t WHERE a = 1 + 5 " + unit_string + - ";" - "SELECT * FROM t WHERE a = 1 + 5 " + - unit_string_plural + - ";" - "SELECT * FROM t WHERE a = 1 + INTERVAL '5'" + - unit_string + - ";" - "SELECT * FROM t WHERE a = 1 + INTERVAL '5 " + - unit_string + - "';" - "SELECT * FROM t WHERE a = 1 + INTERVAL '5 " + - unit_string_plural + "';", - result, 5); - - for (const auto& statement : result.getStatements()) { - stmt = (SelectStatement*)statement; - interval_literal = stmt->whereClause->expr2->expr2; - ASSERT_EQ(interval_literal->datetimeField, it.first); - ASSERT_EQ(interval_literal->ival, 5); - ASSERT_EQ(interval_literal->type, kExprLiteralInterval); - } - } -} - -TEST(LockingClauseWithoutWaitPolicy) { - SelectStatement* stmt; - TEST_PARSE_SQL_QUERY( - "SELECT * FROM t WHERE a = 10 FOR UPDATE;" - "SELECT * FROM t WHERE a = 10 FOR SHARE;" - "SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE FOR KEY SHARE;", - result, 3); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_EQ(stmt->lockings->size(), 2); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_FALSE(stmt->lockings->at(1)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForKeyShare); - ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::None); -} - -TEST(LockingClauseWithWaitPolicy) { - SelectStatement* stmt; - TEST_PARSE_SQL_QUERY( - "SELECT * FROM t WHERE a = 10 FOR UPDATE NOWAIT;" - "SELECT * FROM t WHERE a = 10 FOR SHARE NOWAIT;" - "SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE NOWAIT;" - "SELECT * FROM t WHERE a = 10 FOR KEY SHARE NOWAIT;" - "SELECT * FROM t WHERE a = 10 FOR UPDATE SKIP LOCKED;" - "SELECT * FROM t WHERE a = 10 FOR SHARE SKIP LOCKED;" - "SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE SKIP LOCKED;" - "SELECT * FROM t WHERE a = 10 FOR KEY SHARE SKIP LOCKED;", - result, 8); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - - stmt = (SelectStatement*)result.getStatement(3); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForKeyShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - - stmt = (SelectStatement*)result.getStatement(4); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); - - stmt = (SelectStatement*)result.getStatement(5); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); - - stmt = (SelectStatement*)result.getStatement(6); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); - - stmt = (SelectStatement*)result.getStatement(7); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForKeyShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); -} - -TEST(LockingClauseWithTableReference) { - SelectStatement* stmt; - TEST_PARSE_SQL_QUERY( - "SELECT * FROM t WHERE a = 10 FOR UPDATE OF t;" - "SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t,c;" - "SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t,c NOWAIT;", - result, 3); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 2); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(1), "c"); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_EQ(stmt->lockings->size(), 1); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 2); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(1), "c"); -} - -TEST(MultipleLockingClause) { - SelectStatement* stmt; - TEST_PARSE_SQL_QUERY( - "SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t FOR KEY SHARE OF c;" - "SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c NOWAIT;" - "SELECT * FROM t, c, s WHERE t.a = 10 FOR NO KEY UPDATE FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c, s NOWAIT;", - result, 3); - - stmt = (SelectStatement*)result.getStatement(0); - ASSERT_EQ(stmt->lockings->size(), 2); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); - ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForKeyShare); - ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::None); - ASSERT_EQ(stmt->lockings->at(1)->tables->size(), 1); - ASSERT_STREQ(stmt->lockings->at(1)->tables->at(0), "c"); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_EQ(stmt->lockings->size(), 2); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForShare); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); - ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); - ASSERT_STREQ(stmt->lockings->at(0)->tables->at(0), "t"); - ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForUpdate); - ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - ASSERT_EQ(stmt->lockings->at(0)->tables->size(), 1); - ASSERT_STREQ(stmt->lockings->at(1)->tables->at(0), "c"); - - stmt = (SelectStatement*)result.getStatement(2); - ASSERT_EQ(stmt->lockings->size(), 3); - ASSERT_EQ(stmt->lockings->at(0)->rowLockMode, RowLockMode::ForNoKeyUpdate); - ASSERT_EQ(stmt->lockings->at(0)->rowLockWaitPolicy, RowLockWaitPolicy::None); - ASSERT_FALSE(stmt->lockings->at(0)->tables); - - ASSERT_EQ(stmt->lockings->at(1)->rowLockMode, RowLockMode::ForShare); - ASSERT_EQ(stmt->lockings->at(1)->rowLockWaitPolicy, RowLockWaitPolicy::SkipLocked); - ASSERT_EQ(stmt->lockings->at(1)->tables->size(), 1); - ASSERT_STREQ(stmt->lockings->at(1)->tables->at(0), "t"); - - ASSERT_EQ(stmt->lockings->at(2)->rowLockMode, RowLockMode::ForUpdate); - ASSERT_EQ(stmt->lockings->at(2)->rowLockWaitPolicy, RowLockWaitPolicy::NoWait); - ASSERT_EQ(stmt->lockings->at(2)->tables->size(), 2); - ASSERT_STREQ(stmt->lockings->at(2)->tables->at(0), "c"); - ASSERT_STREQ(stmt->lockings->at(2)->tables->at(1), "s"); -} - -TEST(WindowFunctions) { - TEST_PARSE_SQL_QUERY( - "SELECT t2, 1 / avg(t1) OVER(), rank() OVER(ORDER BY t1 DESC) rnk FROM t;" - "SELECT avg(t1) OVER(PARTITION BY t2, t3 ORDER BY t4, t5 ROWS UNBOUNDED PRECEDING) FROM t;" - "SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 ROWS BETWEEN 25 PRECEDING AND 2 FOLLOWING) FROM t;" - "SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM " - "t;" - "SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t;", - result, 5); - - auto stmt = (SelectStatement*)result.getStatement(0); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 3); - ASSERT_TRUE(stmt->fromTable); - ASSERT_EQ(stmt->fromTable->type, kTableName); - ASSERT_STREQ(stmt->fromTable->name, "t"); - - ASSERT_EQ(stmt->selectList->at(1)->type, kExprOperator); - ASSERT_EQ(stmt->selectList->at(1)->opType, kOpSlash); - ASSERT_TRUE(stmt->selectList->at(1)->expr); - ASSERT_EQ(stmt->selectList->at(1)->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->selectList->at(1)->expr->ival, 1); - - ASSERT_TRUE(stmt->selectList->at(1)->expr2); - ASSERT_EQ(stmt->selectList->at(1)->expr2->type, kExprFunctionRef); - ASSERT_STREQ(stmt->selectList->at(1)->expr2->name, "avg"); - ASSERT_TRUE(stmt->selectList->at(1)->expr2->exprList); - ASSERT_EQ(stmt->selectList->at(1)->expr2->exprList->size(), 1); - ASSERT_EQ(stmt->selectList->at(1)->expr2->exprList->at(0)->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(1)->expr2->exprList->at(0)->name, "t1"); - - ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription); - ASSERT_FALSE(stmt->selectList->at(1)->expr2->windowDescription->partitionList); - ASSERT_FALSE(stmt->selectList->at(1)->expr2->windowDescription->orderList); - ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription); - ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->type, kRange); - ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start); - ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start->offset, 0); - ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start->type, kPreceding); - ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->start->unbounded); - ASSERT_TRUE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end); - ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end->offset, 0); - ASSERT_EQ(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end->type, kCurrentRow); - ASSERT_FALSE(stmt->selectList->at(1)->expr2->windowDescription->frameDescription->end->unbounded); - - ASSERT_TRUE(stmt->selectList->at(2)); - ASSERT_EQ(stmt->selectList->at(2)->type, kExprFunctionRef); - ASSERT_STREQ(stmt->selectList->at(2)->name, "rank"); - ASSERT_TRUE(stmt->selectList->at(2)->alias); - ASSERT_STREQ(stmt->selectList->at(2)->alias, "rnk"); - ASSERT_TRUE(stmt->selectList->at(2)->exprList); - ASSERT_TRUE(stmt->selectList->at(2)->exprList->empty()); - - ASSERT_TRUE(stmt->selectList->at(2)->windowDescription); - ASSERT_FALSE(stmt->selectList->at(2)->windowDescription->partitionList); - ASSERT_TRUE(stmt->selectList->at(2)->windowDescription->orderList); - ASSERT_EQ(stmt->selectList->at(2)->windowDescription->orderList->size(), 1); - ASSERT_EQ(stmt->selectList->at(2)->windowDescription->orderList->at(0)->type, kOrderDesc); - ASSERT_TRUE(stmt->selectList->at(2)->windowDescription->orderList->at(0)->expr); - ASSERT_EQ(stmt->selectList->at(2)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(2)->windowDescription->orderList->at(0)->expr->name, "t1"); - ASSERT_TRUE(stmt->selectList->at(2)->windowDescription->frameDescription); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_TRUE(stmt->fromTable); - ASSERT_EQ(stmt->fromTable->type, kTableName); - ASSERT_STREQ(stmt->fromTable->name, "t"); - - ASSERT_EQ(stmt->selectList->at(0)->type, kExprFunctionRef); - ASSERT_STREQ(stmt->selectList->at(0)->name, "avg"); - ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 1); - ASSERT_STREQ(stmt->selectList->at(0)->exprList->at(0)->name, "t1"); - - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->partitionList); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->size(), 2); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->name, "t2"); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(1)->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(1)->name, "t3"); - - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->size(), 2); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->type, kOrderAsc); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->name, "t4"); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(1)->expr->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(1)->expr->name, "t5"); - - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->type, kRows); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->offset, 0); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->type, kPreceding); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start->unbounded); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->end); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->offset, 0); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->type, kCurrentRow); - ASSERT_FALSE(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded); - - const auto frame_starts = - std::vector{{25, kPreceding, false}, {0, kPreceding, true}, {0, kPreceding, true}}; - const auto frame_ends = - std::vector{{2, kFollowing, false}, {0, kFollowing, true}, {0, kCurrentRow, false}}; - - for (auto bound_index = size_t{0}; bound_index < frame_starts.size(); ++bound_index) { - stmt = (SelectStatement*)result.getStatement(2 + bound_index); - const auto& expected_start = frame_starts[bound_index]; - const auto& expected_end = frame_ends[bound_index]; - - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_TRUE(stmt->fromTable); - ASSERT_EQ(stmt->fromTable->type, kTableName); - ASSERT_STREQ(stmt->fromTable->name, "t"); - - ASSERT_EQ(stmt->selectList->at(0)->type, kExprFunctionRef); - ASSERT_STREQ(stmt->selectList->at(0)->name, "rank"); - ASSERT_TRUE(stmt->selectList->at(0)->exprList->empty()); - - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->partitionList); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->size(), 1); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->name, "t1"); - - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->size(), 1); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->type, kOrderAsc); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef); - ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->name, "t2"); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->offset, expected_start.offset); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->type, expected_start.type); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->unbounded, expected_start.unbounded); - ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->end); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->offset, expected_end.offset); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->type, expected_end.type); - ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded, expected_end.unbounded); - } -} - -TEST(FunctionSchema) { - TEST_PARSE_SQL_QUERY( - "SELECT sys.uuid();" - "SELECT json.isarray('[1, 2, 3]');", - result, 2); - - auto stmt = (SelectStatement*)result.getStatement(0); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_STREQ(stmt->selectList->at(0)->schema, "sys"); - ASSERT_STREQ(stmt->selectList->at(0)->name, "uuid"); - ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 0); - - stmt = (SelectStatement*)result.getStatement(1); - ASSERT_TRUE(stmt->selectList); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_STREQ(stmt->selectList->at(0)->schema, "json"); - ASSERT_STREQ(stmt->selectList->at(0)->name, "isarray"); - ASSERT_EQ(stmt->selectList->at(0)->exprList->size(), 1); - ASSERT_STREQ(stmt->selectList->at(0)->exprList->at(0)->name, "[1, 2, 3]"); -} - -} // namespace hsql diff --git a/extern/hyrise_sql_parser/test/sql_asserts.h b/extern/hyrise_sql_parser/test/sql_asserts.h deleted file mode 100644 index aa493bbad3..0000000000 --- a/extern/hyrise_sql_parser/test/sql_asserts.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __HELPER_H__ -#define __HELPER_H__ - -#define TEST_PARSE_SQL_QUERY(query, result, numStatements) \ - hsql::SQLParserResult result; \ - hsql::SQLParser::parse(query, &result); \ - ASSERT(result.isValid()); \ - ASSERT_EQ(result.size(), numStatements) - -#define TEST_PARSE_SINGLE_SQL(query, stmtType, stmtClass, result, outputVar) \ - TEST_PARSE_SQL_QUERY(query, result, 1); \ - ASSERT_EQ(result.getStatement(0)->type(), stmtType); \ - const stmtClass* outputVar = (const stmtClass*)result.getStatement(0) - -#define TEST_CAST_STMT(result, stmt_index, stmtType, stmtClass, outputVar) \ - ASSERT_EQ(result.getStatement(stmt_index)->type(), stmtType); \ - const stmtClass* outputVar = (const stmtClass*)result.getStatement(stmt_index) - -#endif diff --git a/extern/hyrise_sql_parser/test/sql_parser.cpp b/extern/hyrise_sql_parser/test/sql_parser.cpp deleted file mode 100644 index 31b9be1f9a..0000000000 --- a/extern/hyrise_sql_parser/test/sql_parser.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "thirdparty/microtest/microtest.h" - -#include -#include -#include - -#include "SQLParser.h" -#include "parser/bison_parser.h" -#include "sql_asserts.h" - -using namespace hsql; - -void test_tokens(const std::string& query, const std::vector& expected_tokens) { - std::vector tokens; - ASSERT(SQLParser::tokenize(query, &tokens)); - - ASSERT_EQ(expected_tokens.size(), tokens.size()); - - for (unsigned i = 0; i < expected_tokens.size(); ++i) { - ASSERT_EQ(expected_tokens[i], tokens[i]); - } -} - -TEST(SQLParserTokenizeTest) { - test_tokens("SELECT * FROM test;", {SQL_SELECT, '*', SQL_FROM, SQL_IDENTIFIER, ';'}); - test_tokens("SELECT a, 'b' FROM test WITH HINT;", - {SQL_SELECT, SQL_IDENTIFIER, ',', SQL_STRING, SQL_FROM, SQL_IDENTIFIER, SQL_WITH, SQL_HINT, ';'}); -} - -TEST(SQLParserTokenizeStringifyTest) { - const std::string query = "SELECT * FROM test;"; - std::vector tokens; - ASSERT(SQLParser::tokenize(query, &tokens)); - - // Make u16string. - std::u16string token_string(tokens.cbegin(), tokens.cend()); - - // Check if u16 string is cacheable. - std::map cache; - cache[token_string] = query; - - ASSERT(query == cache[token_string]); - ASSERT(&query != &cache[token_string]); -} diff --git a/extern/hyrise_sql_parser/test/sql_tests.cpp b/extern/hyrise_sql_parser/test/sql_tests.cpp deleted file mode 100644 index 58264ba24d..0000000000 --- a/extern/hyrise_sql_parser/test/sql_tests.cpp +++ /dev/null @@ -1,793 +0,0 @@ -/* - * sql_tests.cpp - */ - -#include "thirdparty/microtest/microtest.h" - -#include "SQLParser.h" -#include "util/sqlhelper.h" - -#include "sql_asserts.h" - -namespace hsql { - -TEST(DeleteStatementTest) { - auto result = SQLParserResult{}; - SQLParser::parse("DELETE FROM students WHERE grade > 2.0;", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - ASSERT(result.getStatement(0)->type() == kStmtDelete); - - const DeleteStatement* stmt = (const DeleteStatement*)result.getStatement(0); - ASSERT_STREQ(stmt->tableName, "students"); - ASSERT_NOTNULL(stmt->expr); - ASSERT(stmt->expr->isType(kExprOperator)); - ASSERT_STREQ(stmt->expr->expr->name, "grade"); - ASSERT_EQ(stmt->expr->expr2->fval, 2.0); -} - -TEST(CreateStatementTest) { - auto result = SQLParserResult{}; - SQLParser::parse( - "CREATE TABLE dummy_table (" - " c_bigint BIGINT, " - " c_boolean BOOLEAN, " - " c_char CHAR(42), " - " c_date DATE, " - " c_datetime DATETIME, " - " c_decimal DECIMAL, " - " c_decimal_precision DECIMAL(13), " - " c_decimal_precision_scale DECIMAL(13,37), " - " c_double_not_null DOUBLE NOT NULL, " - " c_float FLOAT, " - " c_int INT, " - " PRIMARY KEY(c_char, c_int), " - " c_integer_null INTEGER NULL, " - " c_long LONG, " - " c_real REAL, " - " c_smallint SMALLINT, " - " c_text TEXT UNIQUE PRIMARY KEY NOT NULL, " - " c_time TIME, " - " c_time_precision TIME(17), " - " c_timestamp TIMESTAMP, " - " c_varchar VARCHAR(50), " - " c_char_varying CHARACTER VARYING(60)" - ")", - &result); - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); - - const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); - ASSERT_EQ(stmt->type, kCreateTable); - ASSERT_STREQ(stmt->tableName, "dummy_table"); - ASSERT_NOTNULL(stmt->columns); - ASSERT_EQ(stmt->columns->size(), 21); - // c_bigint BIGINT - ASSERT_STREQ(stmt->columns->at(0)->name, "c_bigint"); - ASSERT_EQ(stmt->columns->at(0)->type, (ColumnType{DataType::BIGINT})); - ASSERT_EQ(stmt->columns->at(0)->nullable, true); - // c_boolean BOOLEAN - ASSERT_STREQ(stmt->columns->at(1)->name, "c_boolean"); - ASSERT_EQ(stmt->columns->at(1)->type, (ColumnType{DataType::BOOLEAN})); - ASSERT_EQ(stmt->columns->at(1)->nullable, true); - // c_char CHAR(42) - ASSERT_STREQ(stmt->columns->at(2)->name, "c_char"); - ASSERT_EQ(stmt->columns->at(2)->type, (ColumnType{DataType::CHAR, 42})); - ASSERT_NEQ(stmt->columns->at(2)->type, (ColumnType{DataType::CHAR, 43})); - ASSERT_EQ(stmt->columns->at(2)->nullable, true); - // c_date DATE - ASSERT_STREQ(stmt->columns->at(3)->name, "c_date"); - ASSERT_EQ(stmt->columns->at(3)->type, (ColumnType{DataType::DATE})); - ASSERT_EQ(stmt->columns->at(3)->nullable, true); - // c_datetime DATETIME - ASSERT_STREQ(stmt->columns->at(4)->name, "c_datetime"); - ASSERT_EQ(stmt->columns->at(4)->type, (ColumnType{DataType::DATETIME})); - ASSERT_EQ(stmt->columns->at(4)->nullable, true); - // c_decimal DECIMAL - ASSERT_STREQ(stmt->columns->at(5)->name, "c_decimal"); - ASSERT_EQ(stmt->columns->at(5)->type, (ColumnType{DataType::DECIMAL})); - ASSERT_EQ(stmt->columns->at(5)->nullable, true); - // c_decimal_precision DECIMAL(13) - ASSERT_STREQ(stmt->columns->at(6)->name, "c_decimal_precision"); - ASSERT_EQ(stmt->columns->at(6)->type, (ColumnType{DataType::DECIMAL, 0, 13})); - ASSERT_NEQ(stmt->columns->at(6)->type, (ColumnType{DataType::DECIMAL, 0, 14})); - ASSERT_NEQ(stmt->columns->at(6)->type, (ColumnType{DataType::DECIMAL, 1, 13})); - ASSERT_EQ(stmt->columns->at(6)->nullable, true); - // c_decimal_precision_scale DECIMAL(13,37) - ASSERT_STREQ(stmt->columns->at(7)->name, "c_decimal_precision_scale"); - ASSERT_EQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 0, 13, 37})); - ASSERT_NEQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 0, 14, 37})); - ASSERT_NEQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 0, 13, 38})); - ASSERT_NEQ(stmt->columns->at(7)->type, (ColumnType{DataType::DECIMAL, 1, 13, 37})); - ASSERT_EQ(stmt->columns->at(7)->nullable, true); - // c_double_not_null DOUBLE NOT NULL - ASSERT_STREQ(stmt->columns->at(8)->name, "c_double_not_null"); - ASSERT_EQ(stmt->columns->at(8)->type, (ColumnType{DataType::DOUBLE})); - ASSERT_EQ(stmt->columns->at(8)->nullable, false); - ASSERT_EQ(stmt->columns->at(8)->column_constraints->size(), 1); - ASSERT(stmt->columns->at(8)->column_constraints->count(ConstraintType::NotNull)); - // c_float FLOAT - ASSERT_STREQ(stmt->columns->at(9)->name, "c_float"); - ASSERT_EQ(stmt->columns->at(9)->type, (ColumnType{DataType::FLOAT})); - ASSERT_EQ(stmt->columns->at(9)->nullable, true); - // c_int INT - ASSERT_STREQ(stmt->columns->at(10)->name, "c_int"); - ASSERT_EQ(stmt->columns->at(10)->type, (ColumnType{DataType::INT})); - ASSERT_EQ(stmt->columns->at(10)->nullable, true); - // c_integer INTEGER NULL - ASSERT_STREQ(stmt->columns->at(11)->name, "c_integer_null"); - ASSERT_EQ(stmt->columns->at(11)->type, (ColumnType{DataType::INT})); - ASSERT_EQ(stmt->columns->at(11)->nullable, true); - ASSERT_EQ(stmt->columns->at(11)->column_constraints->size(), 1); - ASSERT(stmt->columns->at(11)->column_constraints->count(ConstraintType::Null)); - // c_long LONG - ASSERT_STREQ(stmt->columns->at(12)->name, "c_long"); - ASSERT_EQ(stmt->columns->at(12)->type, (ColumnType{DataType::LONG})); - ASSERT_EQ(stmt->columns->at(12)->nullable, true); - // c_real REAL - ASSERT_STREQ(stmt->columns->at(13)->name, "c_real"); - ASSERT_EQ(stmt->columns->at(13)->type, (ColumnType{DataType::REAL})); - ASSERT_EQ(stmt->columns->at(13)->nullable, true); - // c_smallint SMALLINT - ASSERT_STREQ(stmt->columns->at(14)->name, "c_smallint"); - ASSERT_EQ(stmt->columns->at(14)->type, (ColumnType{DataType::SMALLINT})); - ASSERT_EQ(stmt->columns->at(14)->nullable, true); - // c_text TEXT UNIQUE PRIMARY KEY NOT NULL - ASSERT_STREQ(stmt->columns->at(15)->name, "c_text"); - ASSERT_EQ(stmt->columns->at(15)->type, (ColumnType{DataType::TEXT})); - ASSERT_EQ(stmt->columns->at(15)->nullable, false); - // Expecting two elements in column_constraints since information about NULL constraints is separately stored in - // ColumnDefinition::nullable - ASSERT_EQ(stmt->columns->at(15)->column_constraints->size(), 3); - ASSERT(stmt->columns->at(15)->column_constraints->count(ConstraintType::Unique)); - ASSERT(stmt->columns->at(15)->column_constraints->count(ConstraintType::PrimaryKey)); - ASSERT(stmt->columns->at(15)->column_constraints->count(ConstraintType::NotNull)); - // c_time TIME - ASSERT_STREQ(stmt->columns->at(16)->name, "c_time"); - ASSERT_EQ(stmt->columns->at(16)->type, (ColumnType{DataType::TIME})); - ASSERT_EQ(stmt->columns->at(16)->nullable, true); - // c_time_precision TIME(17) - ASSERT_STREQ(stmt->columns->at(17)->name, "c_time_precision"); - ASSERT_EQ(stmt->columns->at(17)->type, (ColumnType{DataType::TIME, 0, 17})); - ASSERT_NEQ(stmt->columns->at(17)->type, (ColumnType{DataType::TIME, 0, 18})); - ASSERT_NEQ(stmt->columns->at(17)->type, (ColumnType{DataType::TIME, 1, 17})); - ASSERT_EQ(stmt->columns->at(17)->nullable, true); - // c_timestamp TIMESTAMP - ASSERT_STREQ(stmt->columns->at(18)->name, "c_timestamp"); - ASSERT_EQ(stmt->columns->at(18)->type, (ColumnType{DataType::DATETIME})); - ASSERT_EQ(stmt->columns->at(18)->nullable, true); - // c_varchar VARCHAR(50) - ASSERT_STREQ(stmt->columns->at(19)->name, "c_varchar"); - ASSERT_EQ(stmt->columns->at(19)->type, (ColumnType{DataType::VARCHAR, 50})); - ASSERT_NEQ(stmt->columns->at(19)->type, (ColumnType{DataType::VARCHAR, 51})); - ASSERT_EQ(stmt->columns->at(19)->nullable, true); - // c_char_varying CHARACTER VARYING(60) - ASSERT_STREQ(stmt->columns->at(20)->name, "c_char_varying"); - ASSERT_EQ(stmt->columns->at(20)->type, (ColumnType{DataType::VARCHAR, 60})); - ASSERT_NEQ(stmt->columns->at(20)->type, (ColumnType{DataType::VARCHAR, 61})); - // Table constraints are identified and separated during the parsing of the SQL string - // Table constraints: - // - PRIMARY KEY(c_char, c_int) - ASSERT_EQ(stmt->tableConstraints->size(), 1); - ASSERT(stmt->tableConstraints->at(0)->type == ConstraintType::PrimaryKey); - ASSERT_STREQ(stmt->tableConstraints->at(0)->columnNames->at(0), "c_char"); - ASSERT_STREQ(stmt->tableConstraints->at(0)->columnNames->at(1), "c_int"); -} - -TEST(CreateStatementForeignKeyTest) { - auto result = SQLParserResult{}; - SQLParser::parse( - "CREATE TABLE foo (a int, b int REFERENCES bar.baz (x)); " - "CREATE TABLE foo (a int, b int, FOREIGN KEY (a, b) REFERENCES bar.baz (x, y)); " - "CREATE TABLE foo (a int, b int, FOREIGN KEY (b) REFERENCES baz)", - &result); - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 3); - ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); - const auto* stmt = (const CreateStatement*)result.getStatement(0); - // We focus on the correct parsing of the FKs here. The remaining functionality is tested in CreateStatementTest. - ASSERT_EQ(stmt->type, kCreateTable); - ASSERT_TRUE(stmt->tableConstraints->empty()); - ASSERT_TRUE(stmt->columns); - ASSERT_EQ(stmt->columns->size(), 2); - ASSERT_TRUE(stmt->columns->at(1)); - ASSERT_STREQ(stmt->columns->at(1)->name, "b"); - ASSERT_TRUE(stmt->columns->at(1)->references); - ASSERT_EQ(stmt->columns->at(1)->references->size(), 1); - ASSERT_STREQ(stmt->columns->at(1)->references->at(0)->schema, "bar"); - ASSERT_STREQ(stmt->columns->at(1)->references->at(0)->table, "baz"); - ASSERT_TRUE(stmt->columns->at(1)->references->at(0)->columns); - ASSERT_EQ(stmt->columns->at(1)->references->at(0)->columns->size(), 1); - ASSERT_STREQ(stmt->columns->at(1)->references->at(0)->columns->at(0), "x"); - - ASSERT_EQ(result.getStatement(1)->type(), kStmtCreate); - stmt = (const CreateStatement*)result.getStatement(1); - ASSERT_EQ(stmt->type, kCreateTable); - ASSERT_TRUE(stmt->tableConstraints); - ASSERT_EQ(stmt->tableConstraints->size(), 1); - ASSERT_EQ(stmt->tableConstraints->at(0)->type, ConstraintType::ForeignKey); - const auto* foreign_key = (const ForeignKeyConstraint*)stmt->tableConstraints->at(0); - ASSERT_TRUE(foreign_key->columnNames); - ASSERT_EQ(foreign_key->columnNames->size(), 2); - ASSERT_STREQ(foreign_key->columnNames->at(0), "a"); - ASSERT_STREQ(foreign_key->columnNames->at(1), "b"); - ASSERT_TRUE(foreign_key->references); - ASSERT_STREQ(foreign_key->references->schema, "bar"); - ASSERT_STREQ(foreign_key->references->table, "baz"); - ASSERT_TRUE(foreign_key->references->columns); - ASSERT_EQ(foreign_key->references->columns->size(), 2); - ASSERT_STREQ(foreign_key->references->columns->at(0), "x"); - ASSERT_STREQ(foreign_key->references->columns->at(1), "y"); - - ASSERT_EQ(result.getStatement(2)->type(), kStmtCreate); - stmt = (const CreateStatement*)result.getStatement(2); - ASSERT_EQ(stmt->type, kCreateTable); - ASSERT_TRUE(stmt->tableConstraints); - ASSERT_EQ(stmt->tableConstraints->size(), 1); - ASSERT_EQ(stmt->tableConstraints->at(0)->type, ConstraintType::ForeignKey); - foreign_key = (const ForeignKeyConstraint*)stmt->tableConstraints->at(0); - ASSERT_TRUE(foreign_key->columnNames); - printf("%zu\n", foreign_key->columnNames->size()); - ASSERT_EQ(foreign_key->columnNames->size(), 1); - ASSERT_STREQ(foreign_key->columnNames->at(0), "b"); - ASSERT_TRUE(foreign_key->references); - ASSERT_FALSE(foreign_key->references->schema); - ASSERT_STREQ(foreign_key->references->table, "baz"); - ASSERT_FALSE(foreign_key->references->columns); -} - -TEST(CreateAsSelectStatementTest) { - auto result = SQLParserResult{}; - SQLParser::parse("CREATE TABLE students_2 AS SELECT student_number, grade FROM students", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - ASSERT_EQ(result.getStatement(0)->type(), kStmtCreate); - - const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); - ASSERT_EQ(stmt->type, kCreateTable); - ASSERT_STREQ(stmt->tableName, "students_2"); - ASSERT_NULL(stmt->columns); - ASSERT_NOTNULL(stmt->select); - ASSERT(stmt->select->selectList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->select->selectList->at(0)->getName(), "student_number"); - ASSERT(stmt->select->selectList->at(1)->isType(kExprColumnRef)); - ASSERT_STREQ(stmt->select->selectList->at(1)->getName(), "grade"); -} - -TEST(UpdateStatementTest) { - auto result = SQLParserResult{}; - SQLParser::parse("UPDATE students SET grade = 5.0, name = 'test' WHERE name = 'Max O''Mustermann';", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - ASSERT_EQ(result.getStatement(0)->type(), kStmtUpdate); - - const UpdateStatement* stmt = (const UpdateStatement*)result.getStatement(0); - ASSERT_NOTNULL(stmt->table); - ASSERT_STREQ(stmt->table->name, "students"); - - ASSERT_NOTNULL(stmt->updates); - ASSERT_EQ(stmt->updates->size(), 2); - ASSERT_STREQ(stmt->updates->at(0)->column, "grade"); - ASSERT_STREQ(stmt->updates->at(1)->column, "name"); - ASSERT(stmt->updates->at(0)->value->isType(kExprLiteralFloat)); - ASSERT(stmt->updates->at(1)->value->isType(kExprLiteralString)); - ASSERT_EQ(stmt->updates->at(0)->value->fval, 5.0); - ASSERT_STREQ(stmt->updates->at(1)->value->name, "test"); - - ASSERT_NOTNULL(stmt->where); - ASSERT(stmt->where->isType(kExprOperator)); - ASSERT_EQ(stmt->where->opType, kOpEquals); - ASSERT_STREQ(stmt->where->expr->name, "name"); - ASSERT_STREQ(stmt->where->expr2->name, "Max O'Mustermann"); -} - -TEST(InsertStatementTest) { - TEST_PARSE_SINGLE_SQL( - "INSERT INTO students VALUES ('Max Mustermann', 12345, 'Musterhausen', 2.0, -1, 1 month, " - " CAST('2000-02-02' AS DATE), - INTERVAL '3 seconds', DATE '2000-02-02', FALSE, NULL)", - kStmtInsert, InsertStatement, result, stmt); - - ASSERT_EQ(stmt->values->size(), 11); - ASSERT_EQ(stmt->values->at(0)->type, kExprLiteralString); - ASSERT_STREQ(stmt->values->at(0)->name, "Max Mustermann"); - ASSERT_EQ(stmt->values->at(1)->type, kExprLiteralInt); - ASSERT_EQ(stmt->values->at(1)->ival, 12345); - ASSERT_EQ(stmt->values->at(2)->type, kExprLiteralString); - ASSERT_STREQ(stmt->values->at(2)->name, "Musterhausen"); - ASSERT_EQ(stmt->values->at(3)->type, kExprLiteralFloat); - ASSERT_EQ(stmt->values->at(3)->fval, 2.0); - ASSERT_EQ(stmt->values->at(4)->type, kExprOperator); - ASSERT_EQ(stmt->values->at(4)->opType, kOpUnaryMinus); - ASSERT(stmt->values->at(4)->expr); - ASSERT_EQ(stmt->values->at(4)->expr->type, kExprLiteralInt); - ASSERT_EQ(stmt->values->at(4)->expr->ival, 1); - ASSERT_EQ(stmt->values->at(5)->type, kExprLiteralInterval); - ASSERT_EQ(stmt->values->at(5)->ival, 1); - ASSERT_EQ(stmt->values->at(5)->datetimeField, kDatetimeMonth); - ASSERT_EQ(stmt->values->at(6)->type, kExprCast); - ASSERT_EQ(stmt->values->at(6)->columnType, ColumnType{DataType::DATE}); - ASSERT(stmt->values->at(6)->expr); - ASSERT_EQ(stmt->values->at(6)->expr->type, kExprLiteralString); - ASSERT_STREQ(stmt->values->at(6)->expr->name, "2000-02-02"); - ASSERT_EQ(stmt->values->at(7)->type, kExprOperator); - ASSERT_EQ(stmt->values->at(7)->opType, kOpUnaryMinus); - ASSERT(stmt->values->at(7)->expr); - ASSERT_EQ(stmt->values->at(7)->expr->type, kExprLiteralInterval); - ASSERT_EQ(stmt->values->at(7)->expr->ival, 3); - ASSERT_EQ(stmt->values->at(7)->expr->datetimeField, kDatetimeSecond); - ASSERT_EQ(stmt->values->at(8)->type, kExprLiteralDate); - ASSERT_STREQ(stmt->values->at(8)->name, "2000-02-02"); - ASSERT_EQ(stmt->values->at(9)->type, kExprLiteralInt); - ASSERT_EQ(stmt->values->at(9)->ival, 0); - ASSERT_TRUE(stmt->values->at(9)->isBoolLiteral); - ASSERT_EQ(stmt->values->at(10)->type, kExprLiteralNull); -} - -TEST(AlterStatementDropActionTest) { - auto result = SQLParserResult{}; - SQLParser::parse("ALTER TABLE mytable DROP COLUMN IF EXISTS mycolumn", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - - const AlterStatement* stmt = (const AlterStatement*)result.getStatement(0); - ASSERT_STREQ(stmt->name, "mytable"); - ASSERT_EQ(stmt->ifTableExists, false); - - auto dropAction = (const DropColumnAction*)stmt->action; - - ASSERT_EQ(dropAction->type, ActionType::DropColumn); - ASSERT_STREQ(dropAction->columnName, "mycolumn"); -} - -TEST(CreateIndexStatementTest) { - auto result = SQLParserResult{}; - SQLParser::parse("CREATE INDEX myindex ON myTable (col1);", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - - const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); - ASSERT_STREQ(stmt->indexName, "myindex"); - ASSERT_STREQ(stmt->tableName, "myTable"); - ASSERT_EQ(stmt->type, kCreateIndex); - ASSERT_EQ(stmt->ifNotExists, false); - ASSERT_EQ(stmt->indexColumns->size(), 1); -} - -TEST(CreateIndexStatementIfNotExistsTest) { - auto result = SQLParserResult{}; - SQLParser::parse("CREATE INDEX IF NOT EXISTS myindex ON myTable (col1, col2);", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - - const CreateStatement* stmt = (const CreateStatement*)result.getStatement(0); - ASSERT_STREQ(stmt->indexName, "myindex"); - ASSERT_STREQ(stmt->tableName, "myTable"); - ASSERT_EQ(stmt->type, kCreateIndex); - ASSERT_EQ(stmt->ifNotExists, true); - ASSERT_EQ(stmt->indexColumns->size(), 2); -} - -TEST(DropIndexTest) { - auto result = SQLParserResult{}; - SQLParser::parse("DROP INDEX myindex", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - - const DropStatement* stmt = (const DropStatement*)result.getStatement(0); - ASSERT_STREQ(stmt->indexName, "myindex"); - ASSERT_EQ(stmt->ifExists, false); -} - -TEST(DropIndexIfExistsTest) { - auto result = SQLParserResult{}; - SQLParser::parse("DROP INDEX IF EXISTS myindex", &result); - - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - - const DropStatement* stmt = (const DropStatement*)result.getStatement(0); - ASSERT_STREQ(stmt->indexName, "myindex"); - ASSERT_EQ(stmt->ifExists, true); -} - -TEST(DropTableStatementTest) { - TEST_PARSE_SINGLE_SQL("DROP TABLE students", kStmtDrop, DropStatement, result, stmt); - - ASSERT_FALSE(stmt->ifExists); - ASSERT_EQ(stmt->type, kDropTable); - ASSERT_NOTNULL(stmt->name); - ASSERT_STREQ(stmt->name, "students"); -} - -TEST(DropTableIfExistsStatementTest) { - TEST_PARSE_SINGLE_SQL("DROP TABLE IF EXISTS students", kStmtDrop, DropStatement, result, stmt); - - ASSERT_TRUE(stmt->ifExists); - ASSERT_EQ(stmt->type, kDropTable); - ASSERT_NOTNULL(stmt->name); - ASSERT_STREQ(stmt->name, "students"); -} - -TEST(ReleaseStatementTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students;", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_EQ(1, result.size()); - ASSERT_NULL(stmt->whereClause); - - std::vector statements = result.releaseStatements(); - - ASSERT_EQ(0, result.size()); - - for (SQLStatement* stmt : statements) { - delete stmt; - } -} - -TEST(ShowTableStatementTest) { - TEST_PARSE_SINGLE_SQL("SHOW TABLES;", kStmtShow, ShowStatement, result, stmt); - - ASSERT_EQ(stmt->type, kShowTables); - ASSERT_NULL(stmt->name); -} - -TEST(ShowColumnsStatementTest) { - TEST_PARSE_SINGLE_SQL("SHOW COLUMNS students;", kStmtShow, ShowStatement, result, stmt); - - ASSERT_EQ(stmt->type, kShowColumns); - ASSERT_NOTNULL(stmt->name); - ASSERT_STREQ(stmt->name, "students"); -} - -TEST(DescribeStatementTest) { - TEST_PARSE_SINGLE_SQL("DESCRIBE students;", kStmtShow, ShowStatement, result, stmt); - - ASSERT_EQ(stmt->type, kShowColumns); - ASSERT_NOTNULL(stmt->name); - ASSERT_STREQ(stmt->name, "students"); -} - -TEST(ImportStatementTest) { - TEST_PARSE_SINGLE_SQL("IMPORT FROM TBL FILE 'students_file' INTO students;", kStmtImport, ImportStatement, result, - stmt); - - ASSERT_EQ(stmt->type, kImportTbl); - ASSERT_NOTNULL(stmt->tableName); - ASSERT_STREQ(stmt->tableName, "students"); - ASSERT_STREQ(stmt->filePath, "students_file"); - ASSERT_NULL(stmt->encoding); -} - -TEST(CopyStatementTest) { - TEST_PARSE_SINGLE_SQL("COPY students FROM 'students_file' WITH (FORMAT CSV, DELIMITER '|', NULL '', QUOTE '\"');", - kStmtImport, ImportStatement, import_result, import_stmt); - - ASSERT_EQ(import_stmt->type, kImportCSV); - ASSERT_NOTNULL(import_stmt->tableName); - ASSERT_STREQ(import_stmt->tableName, "students"); - ASSERT_NOTNULL(import_stmt->filePath); - ASSERT_STREQ(import_stmt->filePath, "students_file"); - ASSERT_NULL(import_stmt->whereClause); - ASSERT_NULL(import_stmt->encoding); - ASSERT_NOTNULL(import_stmt->csv_options); - ASSERT_NOTNULL(import_stmt->csv_options->delimiter); - ASSERT_STREQ(import_stmt->csv_options->delimiter, "|"); - ASSERT_NOTNULL(import_stmt->csv_options->null); - ASSERT_STREQ(import_stmt->csv_options->null, ""); - ASSERT_NOTNULL(import_stmt->csv_options->quote); - ASSERT_STREQ(import_stmt->csv_options->quote, "\""); - - TEST_PARSE_SINGLE_SQL("COPY students FROM 'students_file' WHERE lastname = 'Potter';", kStmtImport, ImportStatement, - import_filter_result, import_filter_stmt); - - ASSERT_EQ(import_filter_stmt->type, kImportAuto); - ASSERT_NOTNULL(import_filter_stmt->tableName); - ASSERT_STREQ(import_filter_stmt->tableName, "students"); - ASSERT_NOTNULL(import_filter_stmt->filePath); - ASSERT_STREQ(import_filter_stmt->filePath, "students_file"); - ASSERT_NOTNULL(import_filter_stmt->whereClause); - ASSERT_EQ(import_filter_stmt->whereClause->opType, kOpEquals); - ASSERT_EQ(import_filter_stmt->whereClause->expr->type, kExprColumnRef); - ASSERT_STREQ(import_filter_stmt->whereClause->expr->name, "lastname"); - ASSERT_EQ(import_filter_stmt->whereClause->expr2->type, kExprLiteralString); - ASSERT_STREQ(import_filter_stmt->whereClause->expr2->name, "Potter"); - ASSERT_NULL(import_filter_stmt->encoding); - ASSERT_NULL(import_filter_stmt->csv_options); - - TEST_PARSE_SINGLE_SQL("COPY students TO 'students_file' WITH (ENCODING 'FSST', FORMAT BINARY);", kStmtExport, - ExportStatement, export_table_result, export_table_stmt); - - ASSERT_EQ(export_table_stmt->type, kImportBinary); - ASSERT_NOTNULL(export_table_stmt->tableName); - ASSERT_STREQ(export_table_stmt->tableName, "students"); - ASSERT_NOTNULL(export_table_stmt->filePath); - ASSERT_STREQ(export_table_stmt->filePath, "students_file"); - ASSERT_NULL(export_table_stmt->select); - ASSERT_STREQ(export_table_stmt->encoding, "FSST"); - ASSERT_NULL(export_table_stmt->csv_options); - - TEST_PARSE_SINGLE_SQL( - "COPY (SELECT firstname, lastname FROM students) TO 'students_file' WITH (ENCODING 'Dictionary');", kStmtExport, - ExportStatement, export_select_result, export_select_stmt); - - ASSERT_EQ(export_select_stmt->type, kImportAuto); - ASSERT_NULL(export_select_stmt->tableName); - ASSERT_NOTNULL(export_select_stmt->filePath); - ASSERT_STREQ(export_select_stmt->filePath, "students_file"); - ASSERT_STREQ(export_select_stmt->encoding, "Dictionary"); - ASSERT_NULL(export_select_stmt->csv_options); - - ASSERT_NOTNULL(export_select_stmt->select); - const auto& select_stmt = export_select_stmt->select; - ASSERT_NULL(select_stmt->whereClause); - ASSERT_NULL(select_stmt->groupBy); - ASSERT_EQ(select_stmt->selectList->size(), 2); - ASSERT(select_stmt->selectList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(select_stmt->selectList->at(0)->getName(), "firstname"); - ASSERT(select_stmt->selectList->at(1)->isType(kExprColumnRef)); - ASSERT_STREQ(select_stmt->selectList->at(1)->getName(), "lastname"); - ASSERT_NOTNULL(select_stmt->fromTable); - ASSERT_STREQ(select_stmt->fromTable->name, "students"); -} - -SQLParserResult parse_and_move(std::string query) { - auto result = SQLParserResult{}; - SQLParser::parse(query, &result); - // Moves on return. - return result; -} - -SQLParserResult move_in_and_back(SQLParserResult res) { - // Moves on return. - return res; -} - -TEST(MoveSQLResultTest) { - auto res = parse_and_move("SELECT * FROM test;"); - ASSERT(res.isValid()); - ASSERT_EQ(1, res.size()); - - // Moved around. - auto new_res = move_in_and_back(std::move(res)); - - // Original object should be invalid. - ASSERT_FALSE(res.isValid()); - ASSERT_EQ(0, res.size()); - - ASSERT(new_res.isValid()); - ASSERT_EQ(1, new_res.size()); -} - -TEST(HintTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students WITH HINT(NO_CACHE, SAMPLE_RATE(10));", kStmtSelect, SelectStatement, - result, stmt); - - ASSERT_NOTNULL(stmt->hints); - ASSERT_EQ(2, stmt->hints->size()); - ASSERT_STREQ("NO_CACHE", stmt->hints->at(0)->name); - ASSERT_STREQ("SAMPLE_RATE", stmt->hints->at(1)->name); - ASSERT_EQ(1, stmt->hints->at(1)->exprList->size()); - ASSERT_EQ(10, stmt->hints->at(1)->exprList->at(0)->ival); -} - -TEST(StringLengthTest) { - TEST_PARSE_SQL_QUERY("SELECT * FROM bar; INSERT INTO foo VALUES (4);\t\n SELECT * FROM foo;", result, 3); - - ASSERT_EQ(result.getStatement(0)->stringLength, 18); - ASSERT_EQ(result.getStatement(1)->stringLength, 28); - ASSERT_EQ(result.getStatement(2)->stringLength, 21); -} - -TEST(ExceptOperatorTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students EXCEPT SELECT * FROM students_2;", kStmtSelect, SelectStatement, result, - stmt); - - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); - ASSERT_STREQ(stmt->fromTable->name, "students"); - ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); -} - -TEST(IntersectOperatorTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students INTERSECT SELECT * FROM students_2;", kStmtSelect, SelectStatement, - result, stmt); - - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); - ASSERT_STREQ(stmt->fromTable->name, "students"); - ASSERT_EQ(stmt->setOperations->back()->setType, kSetIntersect); -} - -TEST(UnionOperatorTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students UNION SELECT * FROM students_2;", kStmtSelect, SelectStatement, result, - stmt); - - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); - ASSERT_STREQ(stmt->fromTable->name, "students"); - ASSERT_EQ(stmt->setOperations->back()->setType, kSetUnion); - ASSERT_FALSE(stmt->setOperations->back()->isAll); -} - -TEST(UnionAllOperatorTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students UNION ALL SELECT * FROM students_2;", kStmtSelect, SelectStatement, - result, stmt); - - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); - ASSERT_STREQ(stmt->fromTable->name, "students"); - ASSERT_TRUE(stmt->setOperations->back()->isAll); -} - -TEST(NestedSetOperationTest) { - TEST_PARSE_SINGLE_SQL("SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees;", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_STREQ( - stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->nestedSelectStatement->fromTable->name, - "employees"); - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); - ASSERT_STREQ(stmt->fromTable->name, "students"); - ASSERT_EQ(stmt->setOperations->back()->setType, kSetIntersect); - ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->setType, kSetUnion); - ASSERT_FALSE(stmt->setOperations->back()->isAll); -} - -TEST(OrderByFullStatementTest) { - TEST_PARSE_SINGLE_SQL( - "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees ORDER BY grade ASC;", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); - ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); - ASSERT_FALSE(stmt->setOperations->back()->isAll); -} - -TEST(SetOperationSubQueryOrder) { - TEST_PARSE_SINGLE_SQL( - "(SELECT * FROM students ORDER BY name DESC) INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM " - "employees ORDER BY grade ASC;", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_EQ(stmt->order->at(0)->type, kOrderDesc); - ASSERT_STREQ(stmt->order->at(0)->expr->name, "name"); - - ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); - ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); - ASSERT_FALSE(stmt->setOperations->back()->isAll); -} - -TEST(SetOperationLastSubQueryOrder) { - TEST_PARSE_SINGLE_SQL( - "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION (SELECT * FROM employees ORDER BY name " - "DESC) ORDER BY grade ASC;", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_EQ(stmt->setOperations->back() - ->nestedSelectStatement->setOperations->back() - ->nestedSelectStatement->order->at(0) - ->type, - kOrderDesc); - ASSERT_STREQ(stmt->setOperations->back() - ->nestedSelectStatement->setOperations->back() - ->nestedSelectStatement->order->at(0) - ->expr->name, - "name"); - - ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); - ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); - ASSERT_FALSE(stmt->setOperations->back()->isAll); -} - -TEST(NestedDifferentSetOperationsWithWithClause) { - TEST_PARSE_SINGLE_SQL( - "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM C", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_STREQ(stmt->withDescriptions->back()->alias, "UNION_FIRST"); - ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetUnion); - ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "A"); - ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, - "B"); - - ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); - ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "C"); -} - -TEST(NestedAllSetOperationsWithWithClause) { - TEST_PARSE_SINGLE_SQL( - "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM " - "(SELECT * FROM C INTERSECT SELECT * FROM D)", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_STREQ(stmt->withDescriptions->back()->alias, "UNION_FIRST"); - ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetUnion); - ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "A"); - ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, - "B"); - - ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); - ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); - ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->setOperations->back()->setType, - kSetIntersect); - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->fromTable->name, "C"); - ASSERT_STREQ(stmt->setOperations->back() - ->nestedSelectStatement->fromTable->select->setOperations->back() - ->nestedSelectStatement->fromTable->name, - "D"); -} - -TEST(NestedSetOperationsWithMultipleWithClauses) { - TEST_PARSE_SINGLE_SQL( - "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B),INTERSECT_SECOND AS (SELECT * FROM UNION_FIRST " - "INTERSECT SELECT * FROM C) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM INTERSECT_SECOND", - kStmtSelect, SelectStatement, result, stmt); - - ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "UNION_FIRST"); - ASSERT_STREQ(stmt->withDescriptions->back()->alias, "INTERSECT_SECOND"); - - ASSERT_EQ(stmt->withDescriptions->at(0)->select->setOperations->back()->setType, kSetUnion); - ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, "A"); - ASSERT_STREQ(stmt->withDescriptions->at(0)->select->setOperations->back()->nestedSelectStatement->fromTable->name, - "B"); - - ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetIntersect); - ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "UNION_FIRST"); - ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, - "C"); - - ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); - ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); - ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "INTERSECT_SECOND"); -} - -TEST(WrongOrderByStatementTest) { - auto res = parse_and_move("SELECT * FROM students ORDER BY name INTERSECT SELECT grade FROM students_2;"); - ASSERT_FALSE(res.isValid()); -} - -TEST(BeginTransactionTest) { - { - TEST_PARSE_SINGLE_SQL("BEGIN TRANSACTION;", kStmtTransaction, TransactionStatement, transaction_result, - transaction_stmt); - - ASSERT_EQ(transaction_stmt->command, kBeginTransaction); - } - - { - TEST_PARSE_SINGLE_SQL("BEGIN;", kStmtTransaction, TransactionStatement, transaction_result, transaction_stmt); - - ASSERT_EQ(transaction_stmt->command, kBeginTransaction); - } -} - -TEST(RollbackTransactionTest) { - TEST_PARSE_SINGLE_SQL("ROLLBACK TRANSACTION;", kStmtTransaction, TransactionStatement, transaction_result, - transaction_stmt); - - ASSERT_EQ(transaction_stmt->command, kRollbackTransaction); -} - -TEST(CommitTransactionTest) { - TEST_PARSE_SINGLE_SQL("COMMIT TRANSACTION;", kStmtTransaction, TransactionStatement, transaction_result, - transaction_stmt); - - ASSERT_EQ(transaction_stmt->command, kCommitTransaction); -} - -TEST(CastAsType) { - TEST_PARSE_SINGLE_SQL("SELECT CAST(ID AS VARCHAR(8)) FROM TEST", kStmtSelect, SelectStatement, result, stmt); - - ASSERT_TRUE(result.isValid()); - ASSERT_EQ(stmt->selectList->size(), 1); - ASSERT_EQ(stmt->selectList->front()->columnType.data_type, DataType::VARCHAR); - ASSERT_EQ(stmt->selectList->front()->columnType.length, 8); -} - -} // namespace hsql - -TEST_MAIN(); diff --git a/extern/hyrise_sql_parser/test/test.sh b/extern/hyrise_sql_parser/test/test.sh deleted file mode 100644 index 550f1bdb02..0000000000 --- a/extern/hyrise_sql_parser/test/test.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -# Has to be executed from the root of the repository. -# Usually invoked by `make test`. -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ - -# Colors -RED='\033[1;31m' -GREEN='\033[1;32m' -YELLOW='\033[1;33m' -NC='\033[0m' -BOLD='\033[1;39m' - -RET=0 -SQL_TEST_RET=1 -MEM_LEAK_EXECUTED=false -MEM_LEAK_RET=1 -CONFLICT_RET=1 - -################################################# -# Running SQL parser tests. -printf "\n${GREEN}Running SQL parser tests...${NC}\n" -bin/tests -f "test/queries/queries-good.sql" -f "test/queries/queries-bad.sql" -SQL_TEST_RET=$? - -if [ $SQL_TEST_RET -eq 0 ]; then - printf "${GREEN}SQL parser tests succeeded!${NC}\n" -else - printf "${RED}SQL parser tests failed!${NC}\n" -fi - -################################################# -# Running memory leak checks (only on Linux). -unamestr=$(uname) -if [[ "$unamestr" == 'Linux' ]]; then - printf "\n${GREEN}Running memory leak checks...${NC}\n" - valgrind --leak-check=full --error-exitcode=200 --log-fd=3 \ - bin/tests -f "test/queries/queries-good.sql" -f "test/queries/queries-bad.sql" \ - 3>&1>/dev/null; - - MEM_LEAK_RET=$? - MEM_LEAK_EXECUTED=true - - if [ $MEM_LEAK_RET -eq 0 ]; then - printf "${GREEN}Memory leak check succeeded!${NC}\n" - elif [ $MEM_LEAK_RET -eq 200 ]; then - printf "${RED}Memory leak check failed!${NC}\n" - elif [ $MEM_LEAK_RET -eq 127 ]; then - printf "${RED}Memory leak check failed: command 'valgrind' not found!${NC}\n" - else - printf "${RED}Memory leak check failed: error code ${MEM_LEAK_RET}!${NC}\n" - fi -else - printf "\n${YELLOW}Skipping memory leak checks (can only be executed on Linux)!${NC}\n" -fi - -################################################# -# Checking if the grammar is conflict free. -printf "\n${GREEN}Checking for conflicts in the grammar...${NC}\n" -printf "${RED}" -make -C src/parser/ test >>/dev/null -CONFLICT_RET=$? - -if [ $CONFLICT_RET -eq 0 ]; then - printf "${GREEN}Conflict check succeeded!${NC}\n" -else - printf "${RED}Conflict check failed!${NC}\n" -fi - -# Print a summary of the test results. -printf " ----------------------------------- -${BOLD}Summary:\n" -if [ $SQL_TEST_RET -eq 0 ]; then printf "SQL Tests: ${GREEN}Success${BOLD}\n"; -else printf "SQL Tests: ${RED}Failure${BOLD}\n"; fi -if [ "$MEM_LEAK_EXECUTED" = true ]; then - if [ $MEM_LEAK_RET -eq 0 ]; then printf "Memory Leak Check: ${GREEN}Success${BOLD}\n"; - else printf "Memory Leak Check: ${RED}Failure${BOLD}\n"; fi -else printf "Memory Leak Check: ${YELLOW}Skipped${BOLD}\n" -fi -if [ $CONFLICT_RET -eq 0 ]; then printf "Grammar Conflict Check: ${GREEN}Success${BOLD}\n"; -else printf "Grammar Conflict Check: ${RED}Failure${BOLD}\n"; fi - -if [[ $SQL_TEST_RET -ne 0 || $CONFLICT_RET -ne 0 ]]; then - RET=1 -fi - -if [ $MEM_LEAK_RET -ne 0 ]; then - if [ "$MEM_LEAK_EXECUTED" = true ]; then - RET=1 - fi -fi - - -if [ $RET -eq 0 ]; then - if [ "$MEM_LEAK_EXECUTED" = true ]; then printf "${GREEN}All tests passed!${NC}\n" - else printf "${YELLOW}Some tests were skipped!${NC}\n" - fi -else printf "${RED}Some tests failed!${NC}\n" -fi -printf "${NC}----------------------------------\n" - -exit $RET diff --git a/extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h b/extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h deleted file mode 100644 index 95f80dc0ba..0000000000 --- a/extern/hyrise_sql_parser/test/thirdparty/microtest/microtest.h +++ /dev/null @@ -1,207 +0,0 @@ -// -// microtest.h -// -// URL: https://github.com/torpedro/microtest.h -// Author: Pedro Flemming (http://torpedro.com/) -// License: MIT License (https://github.com/torpedro/microtest.h/blob/master/LICENSE) -// Copyright (c) 2017 Pedro Flemming -// -// This is a small header-only C++ unit testing framework. -// It allows to define small unit tests with set of assertions available. -// -#ifndef __MICROTEST_H__ -#define __MICROTEST_H__ - -#include -#include -#include -#include - -//////////////// -// Assertions // -//////////////// - -#define ASSERT(cond) ASSERT_TRUE(cond) - -#define ASSERT_TRUE(cond) \ - if (!(cond)) { \ - throw mt::AssertFailedException(#cond, __FILE__, __LINE__); \ - } \ - static_assert(true, "End call of macro with a semicolon.") - -#define ASSERT_FALSE(cond) \ - if (cond) { \ - throw mt::AssertFailedException(#cond, __FILE__, __LINE__); \ - } \ - static_assert(true, "End call of macro with a semicolon.") - -#define ASSERT_NULL(value) ASSERT_TRUE(value == NULL) - -#define ASSERT_NOTNULL(value) ASSERT_TRUE(value != NULL) - -#define ASSERT_STREQ(a, b) \ - if (std::string(a).compare(std::string(b)) != 0) { \ - printf("%s{ info} %s", mt::yellow(), mt::def()); \ - std::cout << "Actual values: " << a << " != " << b << std::endl; \ - throw mt::AssertFailedException(#a " == " #b, __FILE__, __LINE__); \ - } \ - static_assert(true, "End call of macro with a semicolon.") - -#define ASSERT_STRNEQ(a, b) \ - if (std::string(a).compare(std::string(b)) != = 0) { \ - printf("%s{ info} %s", mt::yellow(), mt::def()); \ - std::cout << "Actual values: " << a << " == " << b << std::endl; \ - throw mt::AssertFailedException(#a " != " #b, __FILE__, __LINE__); \ - } \ - static_assert(true, "End call of macro with a semicolon.") - -#define ASSERT_EQ(a, b) \ - if (a != b) { \ - printf("%s{ info} %s", mt::yellow(), mt::def()); \ - std::cout << "Actual values: " << a << " != " << b << std::endl; \ - } \ - ASSERT(a == b) - -#define ASSERT_NEQ(a, b) \ - if (a == b) { \ - printf("%s{ info} %s", mt::yellow(), mt::def()); \ - std::cout << "Actual values: " << a << " == " << b << std::endl; \ - } \ - ASSERT(a != b) - -//////////////// -// Unit Tests // -//////////////// - -#define TEST(name) \ - void name(); \ - namespace { \ - bool __##name = mt::TestsManager::AddTest(name, #name); \ - } \ - void name() - -/////////////// -// Framework // -/////////////// - -namespace mt { - -inline const char* red() { return "\033[1;31m"; } - -inline const char* green() { return "\033[0;32m"; } - -inline const char* yellow() { return "\033[0;33m"; } - -inline const char* def() { return "\033[0m"; } - -inline void printRunning(const char* message, FILE* file = stdout) { - fprintf(file, "%s{ running}%s %s\n", green(), def(), message); -} - -inline void printOk(const char* message, FILE* file = stdout) { - fprintf(file, "%s{ ok}%s %s\n", green(), def(), message); -} - -inline void printFailed(const char* message, FILE* file = stdout) { - fprintf(file, "%s{ failed} %s%s\n", red(), message, def()); -} - -// Exception that is thrown when an assertion fails. -class AssertFailedException : public std::exception { - public: - AssertFailedException(std::string description, std::string filepath, int line) - : std::exception(), description_(description), filepath_(filepath), line_(line) {}; - - virtual const char* what() const throw() { return description_.c_str(); } - - inline const char* getFilepath() { return filepath_.c_str(); } - - inline int getLine() { return line_; } - - protected: - std::string description_; - std::string filepath_; - int line_; -}; - -class TestsManager { - // Note: static initialization fiasco - // http://www.parashift.com/c++-faq-lite/static-init-order.html - // http://www.parashift.com/c++-faq-lite/static-init-order-on-first-use.html - public: - struct Test { - const char* name; - void (*fn)(void); - }; - - static std::vector& tests() { - static std::vector tests_; - return tests_; - } - - // Adds a new test to the current set of tests. - // Returns false if a test with the same name already exists. - inline static bool AddTest(void (*fn)(void), const char* name) { - tests().push_back({name, fn}); - return true; - } - - // Run all tests that are registered. - // Returns the number of tests that failed. - inline static size_t RunAllTests(FILE* file = stdout) { - size_t num_failed = 0; - - for (const Test& test : tests()) { - // Run the test. - // If an AsserFailedException is thrown, the test has failed. - try { - printRunning(test.name, file); - - (*test.fn)(); - - printOk(test.name, file); - - } catch (AssertFailedException& e) { - printFailed(test.name, file); - fprintf(file, " %sAssertion failed: %s%s\n", red(), e.what(), def()); - fprintf(file, " %s%s:%d%s\n", red(), e.getFilepath(), e.getLine(), def()); - ++num_failed; - } - } - - int return_code = (num_failed > 0) ? 1 : 0; - return return_code; - } -}; - -// Class that will capture the arguments passed to the program. -class Runtime { - public: - static const std::vector& args(int argc = -1, char** argv = NULL) { - static std::vector args_; - if (argc >= 0) { - for (int i = 0; i < argc; ++i) { - args_.push_back(argv[i]); - } - } - return args_; - } -}; -} // namespace mt - -#define TEST_MAIN() \ - int main(int argc, char* argv[]) { \ - mt::Runtime::args(argc, argv); \ - \ - size_t num_failed = mt::TestsManager::RunAllTests(stdout); \ - if (num_failed == 0) { \ - fprintf(stdout, "%s{ summary} All tests succeeded!%s\n", mt::green(), mt::def()); \ - return 0; \ - } else { \ - double percentage = 100.0 * num_failed / mt::TestsManager::tests().size(); \ - fprintf(stderr, "%s{ summary} %lu tests failed (%.2f%%)%s\n", mt::red(), num_failed, percentage, mt::def()); \ - return -1; \ - } \ - } - -#endif // __MICROTEST_H__ diff --git a/extern/hyrise_sql_parser/test/tpc_h_tests.cpp b/extern/hyrise_sql_parser/test/tpc_h_tests.cpp deleted file mode 100644 index 48b2daaa50..0000000000 --- a/extern/hyrise_sql_parser/test/tpc_h_tests.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "thirdparty/microtest/microtest.h" - -#include "SQLParser.h" -#include "util/sqlhelper.h" - -#include "sql_asserts.h" - -#include -#include -#include -#include - -using namespace hsql; - -std::string readFileContents(std::string file_path) { - std::ifstream t(file_path.c_str()); - std::string text((std::istreambuf_iterator(t)), std::istreambuf_iterator()); - return text; -} - -TEST(TPCHQueryGrammarTests) { - std::vector files = { - "test/queries/tpc-h-01.sql", "test/queries/tpc-h-02.sql", "test/queries/tpc-h-03.sql", - "test/queries/tpc-h-04.sql", "test/queries/tpc-h-05.sql", "test/queries/tpc-h-06.sql", - "test/queries/tpc-h-07.sql", "test/queries/tpc-h-08.sql", "test/queries/tpc-h-09.sql", - "test/queries/tpc-h-10.sql", "test/queries/tpc-h-11.sql", "test/queries/tpc-h-12.sql", - "test/queries/tpc-h-13.sql", "test/queries/tpc-h-14.sql", "test/queries/tpc-h-15.sql", - "test/queries/tpc-h-16.sql", "test/queries/tpc-h-17.sql", "test/queries/tpc-h-18.sql", - "test/queries/tpc-h-19.sql", "test/queries/tpc-h-20.sql", "test/queries/tpc-h-21.sql", - "test/queries/tpc-h-22.sql", - }; - - int testsFailed = 0; - std::string concatenated = ""; - for (const std::string& file_path : files) { - std::string query = readFileContents(file_path); - - concatenated += query; - if (concatenated.back() != ';') concatenated += ';'; - - SQLParserResult result; - SQLParser::parse(query.c_str(), &result); - if (!result.isValid()) { - mt::printFailed(file_path.c_str()); - printf("%s %s (L%d:%d)%s\n", mt::red(), result.errorMsg(), result.errorLine(), result.errorColumn(), - mt::def()); - ++testsFailed; - } else { - mt::printOk(file_path.c_str()); - } - } - - SQLParserResult result; - SQLParser::parse(concatenated.c_str(), &result); - if (!result.isValid()) { - mt::printFailed("TPCHAllConcatenated"); - printf("%s %s (L%d:%d)%s\n", mt::red(), result.errorMsg(), result.errorLine(), result.errorColumn(), - mt::def()); - ++testsFailed; - } else { - mt::printOk("TPCHAllConcatenated"); - } - - ASSERT_EQ(testsFailed, 0); -} - -TEST(TPCHQueryDetailTest) { - std::string query = readFileContents("test/queries/tpc-h-20.sql"); - - SQLParserResult result; - SQLParser::parse(query.c_str(), &result); - ASSERT(result.isValid()); - ASSERT_EQ(result.size(), 1); - - const SQLStatement* stmt20 = result.getStatement(0); - ASSERT_EQ(stmt20->type(), kStmtSelect); - - const SelectStatement* select20 = (const SelectStatement*)stmt20; - ASSERT_EQ(select20->selectList->size(), 2); - ASSERT_STREQ(select20->selectList->at(0)->getName(), "S_NAME"); - ASSERT_STREQ(select20->selectList->at(1)->getName(), "S_ADDRESS"); - - // Test WHERE Clause. - Expr* where = select20->whereClause; - ASSERT_NOTNULL(where); - ASSERT(where->isType(kExprOperator)); - ASSERT_EQ(where->opType, kOpAnd); - - Expr* andExpr2 = where->expr; - ASSERT_NOTNULL(andExpr2); - ASSERT(andExpr2->isType(kExprOperator)); - ASSERT_EQ(andExpr2->opType, kOpAnd); - - // Test IN expression. - Expr* inExpr = andExpr2->expr; - ASSERT_NOTNULL(inExpr); - ASSERT(inExpr->isType(kExprOperator)); - ASSERT_EQ(inExpr->opType, kOpIn); - - ASSERT_STREQ(inExpr->expr->getName(), "S_SUPPKEY"); - ASSERT_NOTNULL(inExpr->select); - ASSERT_EQ(inExpr->select->selectList->size(), 1); - ASSERT(inExpr->select->selectList->at(0)->isType(kExprColumnRef)); - ASSERT_STREQ(inExpr->select->selectList->at(0)->getName(), "PS_SUPPKEY"); - - // Test ORDER BY clause. - ASSERT_NOTNULL(select20->order); - ASSERT_EQ(select20->order->size(), 1); - ASSERT(select20->order->at(0)->expr->isType(kExprColumnRef)); - ASSERT_STREQ(select20->order->at(0)->expr->getName(), "S_NAME"); -} From 099d956ba8e929770c017483c3623a5bf21fdb68 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Sat, 20 Jun 2026 02:37:15 +0000 Subject: [PATCH 12/19] Move hyrise to submodule --- .gitmodules | 4 ++++ CMakeLists.txt | 2 +- extern/hyrise-sql-parser | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) create mode 160000 extern/hyrise-sql-parser diff --git a/.gitmodules b/.gitmodules index d2ffc0c9c6..465e70960e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,7 @@ [submodule "extern/log"] path = extern/log url = ../../lsst/log +[submodule "extern/hyrise-sql-parser"] + path = extern/hyrise-sql-parser + url = https://github.com/lsst/hyrise-sql-parser + branch = qserv-compat diff --git a/CMakeLists.txt b/CMakeLists.txt index 543fc75870..d9d3bc0d6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/install) add_subdirectory(bin) add_subdirectory(doc) add_subdirectory(etc) -add_subdirectory(extern/hyrise_sql_parser) +add_subdirectory(extern/hyrise-sql-parser) add_subdirectory(extern/log) add_subdirectory(extern/sphgeom) add_subdirectory(python) diff --git a/extern/hyrise-sql-parser b/extern/hyrise-sql-parser new file mode 160000 index 0000000000..17e8d126e6 --- /dev/null +++ b/extern/hyrise-sql-parser @@ -0,0 +1 @@ +Subproject commit 17e8d126e6774cfdc1a30f1195fa755e590474e1 From dcc49bc36bcb75a42975363f46863463a4e7a66c Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Mon, 22 Jun 2026 10:57:24 -0700 Subject: [PATCH 13/19] Simplify SQL backend testing string normalization We previously had a small helper (ParserNormalization.h) that applied normalization to SQL strings, but also occasionally used compile-time switches to differentiate between the backends in the test cases. This commit adds a helper macro (PARSER_EXPECTED) and unifies the approaches so that only compile-time checks + embedded normalization are used. --- src/ccontrol/testCControl.cc | 59 +++++++++---------- src/qproc/testQueryAnaAggregation.cc | 12 ++-- src/qproc/testQueryAnaGeneral.cc | 87 +++++++++++++++------------- src/qproc/testQueryAnaOrderBy.cc | 33 ++++++----- src/tests/ParserExpected.h | 47 +++++++++++++++ src/tests/ParserNormalization.h | 82 -------------------------- 6 files changed, 144 insertions(+), 176 deletions(-) create mode 100644 src/tests/ParserExpected.h delete mode 100644 src/tests/ParserNormalization.h diff --git a/src/ccontrol/testCControl.cc b/src/ccontrol/testCControl.cc index 894257c22b..d73ddc2657 100644 --- a/src/ccontrol/testCControl.cc +++ b/src/ccontrol/testCControl.cc @@ -34,6 +34,7 @@ // Qserv headers #include "ccontrol/UserQueryType.h" +#include "tests/ParserExpected.h" #include "parser/ParseException.h" #include "qproc/QuerySession.h" #include "query/AndTerm.h" @@ -78,14 +79,12 @@ static const std::vector PARSE_ERROR_QUERIES = { // "Expressions/functions in ORDER BY clauses are not allowed // In SQL92 ORDER BY is limited to actual table columns, thus expressions or functions in ORDER BY are // rejected. This is true for Qserv too. - ParseErrorQueryInfo("SELECT objectId, iE1_SG, ABS(iE1_SG) FROM Object WHERE iE1_SG between -0.1 and " - "0.1 ORDER BY ABS(iE1_SG)", -#ifdef QSERV_USE_HYRISE_SQL_PARSER - "ParseException:qserv does not support functions in ORDER BY."), -#else - "ParseException:Error parsing query, near \"ABS(iE1_SG)\", qserv does not " - "support functions in ORDER BY."), -#endif + ParseErrorQueryInfo( + "SELECT objectId, iE1_SG, ABS(iE1_SG) FROM Object WHERE iE1_SG between -0.1 and " + "0.1 ORDER BY ABS(iE1_SG)", + PARSER_EXPECTED("ParseException:qserv does not support functions in ORDER BY.", + "ParseException:Error parsing query, near \"ABS(iE1_SG)\", qserv does not " + "support functions in ORDER BY.")), ParseErrorQueryInfo("SELECT foo from Filter f limit 5 garbage query !#$%!#$", "ParseException:Failed to instantiate query: \"SELECT foo from Filter f limit 5 " @@ -113,25 +112,20 @@ static const std::vector PARSE_ERROR_QUERIES = { "ParseException:Error parsing query, near \"_ra\", Identifiers in Qserv may not " "start with an underscore."), - ParseErrorQueryInfo("SELECT `_ra` FROM Object;", -#ifdef QSERV_USE_HYRISE_SQL_PARSER - "ParseException:Error parsing query, near \"_ra\", Identifiers in Qserv may not " - "start with an underscore."), -#else - "ParseException:Error parsing query, near \"`_ra`\", Identifiers in Qserv may " - "not " - "start with an underscore."), -#endif + ParseErrorQueryInfo( + "SELECT `_ra` FROM Object;", + PARSER_EXPECTED("ParseException:Error parsing query, near \"_ra\", Identifiers in Qserv " + "may not start with an underscore.", + "ParseException:Error parsing query, near \"`_ra`\", Identifiers in Qserv " + "may not start with an underscore.")), ParseErrorQueryInfo( "SELECT objectId AS `_objectId` FROM Object;", -#ifdef QSERV_USE_HYRISE_SQL_PARSER - "ParseException:Error parsing query, near \"_objectId\", Identifiers in Qserv may not " - "start with an underscore."), -#else - "ParseException:Error parsing query, near \"`_objectId`\", Identifiers in Qserv may not " - "start with an underscore."), -#endif + PARSER_EXPECTED( + "ParseException:Error parsing query, near \"_objectId\", Identifiers in Qserv " + "may not start with an underscore.", + "ParseException:Error parsing query, near \"`_objectId`\", Identifiers in Qserv " + "may not start with an underscore.")), ParseErrorQueryInfo( "LECT sce.filterName,sce.field " @@ -141,15 +135,14 @@ static const std::vector PARSE_ERROR_QUERIES = { "FROM LSST.Science_Ccd_Exposure AS sce WHERE sce.field=535 AND sce.camcol LIKE '%' \""), // per testQueryAnaGeneral: CASE in column spec is illegal. - ParseErrorQueryInfo("SELECT COUNT(*) AS totalCount, " - "SUM(CASE WHEN (typeId=3) THEN 1 ELSE 0 END) AS galaxyCount " - "FROM Object WHERE rFlux_PS > 10;", -#ifdef QSERV_USE_HYRISE_SQL_PARSER - "ParseException:qserv can not parse query: CASE expressions are not supported."), -#else - "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) THEN 1 " - "ELSE 0 END\""), -#endif + ParseErrorQueryInfo( + "SELECT COUNT(*) AS totalCount, " + "SUM(CASE WHEN (typeId=3) THEN 1 ELSE 0 END) AS galaxyCount " + "FROM Object WHERE rFlux_PS > 10;", + PARSER_EXPECTED("ParseException:qserv can not parse query: CASE expressions are not " + "supported.", + "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) " + "THEN 1 ELSE 0 END\"")), }; BOOST_DATA_TEST_CASE(expected_parse_error, PARSE_ERROR_QUERIES, queryInfo) { diff --git a/src/qproc/testQueryAnaAggregation.cc b/src/qproc/testQueryAnaAggregation.cc index 1736b97b78..35a70cd85b 100644 --- a/src/qproc/testQueryAnaAggregation.cc +++ b/src/qproc/testQueryAnaAggregation.cc @@ -34,6 +34,8 @@ // System headers #include +// Third-party headers + // Boost unit test header #define BOOST_TEST_MODULE QueryAnaAggregation #include @@ -42,11 +44,11 @@ // Qserv headers #include "mysql/MySqlConfig.h" +#include "tests/ParserExpected.h" #include "qproc/QuerySession.h" #include "query/QueryContext.h" #include "query/SelectStmt.h" #include "sql/SqlConfig.h" -#include "tests/ParserNormalization.h" #include "tests/QueryAnaFixture.h" using lsst::qserv::mysql::MySqlConfig; @@ -71,7 +73,7 @@ BOOST_AUTO_TEST_CASE(Aggregate) { "COUNT(`LSST.Object`.`bMagF2`) AS `QS2_COUNT`," "SUM(`LSST.Object`.`bMagF2`) AS `QS3_SUM` " "FROM `LSST`.`Object_100` AS `LSST.Object` " - "WHERE `LSST.Object`.`bMagF`>20.0 " + "WHERE `LSST.Object`.`bMagF`>" PARSER_EXPECTED("20", "20.0") " " "GROUP BY `chunkId`"; qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns( {{"LSST", {{"Object", {"pm_declErr", "chunkId", "bMagF2", "bMagF"}}}}})); @@ -88,7 +90,7 @@ BOOST_AUTO_TEST_CASE(Aggregate) { BOOST_REQUIRE(ss.hasGroupBy()); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - CHECK_EQUAL_NORMALIZED(expPar, parallel); + BOOST_CHECK_EQUAL(expPar, parallel); } BOOST_AUTO_TEST_CASE(Avg) { @@ -98,7 +100,7 @@ BOOST_AUTO_TEST_CASE(Avg) { "COUNT(`LSST.Object`.`bMagF2`) AS `QS1_COUNT`," "SUM(`LSST.Object`.`bMagF2`) AS `QS2_SUM` " "FROM `LSST`.`Object_100` AS `LSST.Object` " - "WHERE `LSST.Object`.`bMagF`>20.0"; + "WHERE `LSST.Object`.`bMagF`>" PARSER_EXPECTED("20", "20.0"); qsTest.sqlConfig = SqlConfig( SqlConfig::MockDbTableColumns({{"LSST", {{"Object", {"chunkId", "bMagF2", "bMagF"}}}}})); std::shared_ptr qs = queryAnaHelper.buildQuerySession(qsTest, stmt); @@ -110,7 +112,7 @@ BOOST_AUTO_TEST_CASE(Avg) { BOOST_CHECK(!context->hasSubChunks()); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - CHECK_EQUAL_NORMALIZED(expPar, parallel); + BOOST_CHECK_EQUAL(expPar, parallel); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/qproc/testQueryAnaGeneral.cc b/src/qproc/testQueryAnaGeneral.cc index 383f24d17c..0a01b1dbc6 100644 --- a/src/qproc/testQueryAnaGeneral.cc +++ b/src/qproc/testQueryAnaGeneral.cc @@ -62,7 +62,7 @@ #include "query/SecIdxRestrictor.h" #include "query/SelectStmt.h" #include "sql/SqlConfig.h" -#include "tests/ParserNormalization.h" +#include "tests/ParserExpected.h" #include "tests/QueryAnaFixture.h" using lsst::qserv::StringPair; @@ -97,7 +97,8 @@ BOOST_FIXTURE_TEST_SUITE(CppParser, QueryAnaFixture) BOOST_AUTO_TEST_CASE(TrivialSub) { std::string stmt = "SELECT * FROM Object WHERE someField > 5.0;"; std::string expected = - "SELECT * FROM `LSST`.`Object_100` AS `LSST.Object` WHERE `LSST.Object`.`someField`>5.0"; + "SELECT * FROM `LSST`.`Object_100` AS `LSST.Object` WHERE " + "`LSST.Object`.`someField`>" PARSER_EXPECTED("5", "5.0"); BOOST_CHECK(qsTest.css); qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns({{"LSST", {{"Object", {"someField"}}}}})); std::shared_ptr qs = queryAnaHelper.buildQuerySession(qsTest, stmt); @@ -111,7 +112,7 @@ BOOST_AUTO_TEST_CASE(TrivialSub) { BOOST_CHECK(!context->needsMerge); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - CHECK_EQUAL_NORMALIZED(expected, parallel); + BOOST_CHECK_EQUAL(expected, parallel); } BOOST_AUTO_TEST_CASE(NoContext) { @@ -241,9 +242,9 @@ BOOST_AUTO_TEST_CASE(RestrictorNeighborCount) { // DEBUG // std::copy(first.queries.begin(), first.queries.end(), std::ostream_iterator(std::cout, // "\n\n")); - CHECK_EQUAL_NORMALIZED(first->queries[0], expected_100_subchunk_core); + BOOST_CHECK_EQUAL(first->queries[0], expected_100_subchunk_core); BOOST_REQUIRE(numQueries > 1); - CHECK_EQUAL_NORMALIZED(first->queries[1], expected_100_subchunk_overlap); + BOOST_CHECK_EQUAL(first->queries[1], expected_100_subchunk_overlap); BOOST_REQUIRE_EQUAL(first->subChunkIds.size(), 3u); BOOST_CHECK_EQUAL(first->subChunkIds[0], 100000); BOOST_CHECK_EQUAL(first->subChunkIds[1], 100010); @@ -259,7 +260,7 @@ BOOST_AUTO_TEST_CASE(Triple) { std::string expected = "SELECT * FROM `Subchunks_LSST_100`.`Object_100_%S\007S%` AS " "`o1`,`Subchunks_LSST_100`.`Object_100_%S\007S%` AS `o2`,`LSST`.`Source_100` AS `LSST.Source` " - "WHERE `o1`.`id`!=`o2`.`id` AND " + "WHERE `o1`.`id`" PARSER_EXPECTED("<>", "!=") "`o2`.`id` AND " "0.024>scisql_angSep(`o1`.`ra_Test`,`o1`.`decl_Test`,`o2`.`ra_Test`,`o2`.`decl_Test`) AND " "`LSST.Source`.`objectIdSourceTest`=`o2`.`objectIdObjTest`"; @@ -272,7 +273,7 @@ BOOST_AUTO_TEST_CASE(Triple) { // SelectStmt const& ss = qs->getStmt(); BOOST_CHECK(context); std::string parallel = queryAnaHelper.buildFirstParallelQuery(); - CHECK_EQUAL_NORMALIZED(parallel, expected); + BOOST_CHECK_EQUAL(parallel, expected); auto first = qs->buildChunkQuerySpec(qs->makeQueryTemplates(), *qs->cQueryBegin()); BOOST_REQUIRE_EQUAL(first->subChunkIds.size(), 3u); BOOST_CHECK_EQUAL(first->subChunkIds[0], 100000); @@ -310,7 +311,11 @@ std::ostream& operator<<(std::ostream& os, ScisqlRestrictorTestCaseData const& i return os; } +#ifdef QSERV_USE_HYRISE_SQL_PARSER +std::vector const polyArgs = {"1", "3", "1.5", "2", "2", "4"}; +#else std::vector const polyArgs = {"1.0", "3.0", "1.5", "2.0", "2.0", "4.0"}; +#endif static const std::vector SCISQL_RESTRICTOR_TEST_CASE_DATA = { ScisqlRestrictorTestCaseData("select * from LSST.Object o, Source s " @@ -342,9 +347,13 @@ static const std::vector SCISQL_RESTRICTOR_TEST_CA "select * from LSST.Object o, Source s " "WHERE scisql_s2PtInCPoly(ra_Test, decl_Test, 1.0, 3.0, 1.5, 2.0, 2.0, 4.0) = 1 " "AND o.objectIdObjTest = s.objectIdSourceTest;", - "SELECT * FROM `LSST`.`Object_100` AS `o`,`LSST`.`Source_100` AS `s` " - "WHERE scisql_s2PtInCPoly(`o`.`ra_Test`,`o`.`decl_Test`,1.0,3.0,1.5,2.0,2.0,4.0)=1 " - "AND `o`.`objectIdObjTest`=`s`.`objectIdSourceTest`", + PARSER_EXPECTED( + "SELECT * FROM `LSST`.`Object_100` AS `o`,`LSST`.`Source_100` AS `s` " + "WHERE scisql_s2PtInCPoly(`o`.`ra_Test`,`o`.`decl_Test`,1,3,1.5,2,2,4)=1 " + "AND `o`.`objectIdObjTest`=`s`.`objectIdSourceTest`", + "SELECT * FROM `LSST`.`Object_100` AS `o`,`LSST`.`Source_100` AS `s` " + "WHERE scisql_s2PtInCPoly(`o`.`ra_Test`,`o`.`decl_Test`,1.0,3.0,1.5,2.0,2.0,4.0)=1 " + "AND `o`.`objectIdObjTest`=`s`.`objectIdSourceTest`"), std::make_shared(polyArgs)), ScisqlRestrictorTestCaseData("select * from LSST.Object o, Source s " @@ -381,13 +390,13 @@ BOOST_DATA_TEST_CASE(ObjectSourceJoin_ScisqlRestrictor, SCISQL_RESTRICTOR_TEST_C os1 << *restrictorFunc; os2 << *queryData.expectedRestrictor; - CHECK_EQUAL_NORMALIZED(os1.str(), os2.str()); + BOOST_CHECK_EQUAL(os1.str(), os2.str()); } else { BOOST_CHECK_EQUAL(nullptr, context->areaRestrictors); } BOOST_CHECK_EQUAL(nullptr, context->secIdxRestrictors); std::string actual = queryAnaHelper.buildFirstParallelQuery(); - CHECK_EQUAL_NORMALIZED(actual, queryData.expectedStmt); + BOOST_CHECK_EQUAL(actual, queryData.expectedStmt); } BOOST_AUTO_TEST_CASE(ScisqlWrongNumberOfParameters) { @@ -1011,14 +1020,15 @@ BOOST_AUTO_TEST_CASE(FuncExprPred) { "SELECT `o1`.`objectId` AS `o1.objectId`,`o2`.`objectId` AS `objectId2` " "FROM `Subchunks_LSST_100`.`Object_100_%S\007S%` AS " "`o1`,`Subchunks_LSST_100`.`Object_100_%S\007S%` AS `o2` " - "WHERE scisql_angSep(`o1`.`ra_Test`,`o1`.`decl_Test`,`o2`.`ra_Test`,`o2`.`decl_Test`)<0.00001 " + "WHERE scisql_angSep(`o1`.`ra_Test`,`o1`.`decl_Test`,`o2`.`ra_Test`,`o2`.`decl_Test`)<" + PARSER_EXPECTED("1e-05", "0.00001") " " "AND `o1`.`objectId`<>`o2`.`objectId` AND " "ABS((scisql_fluxToAbMag(`o1`.`gFlux_PS`)-scisql_fluxToAbMag(`o1`.`rFlux_PS`))-(scisql_" "fluxToAbMag(`o2`.`gFlux_PS`)-scisql_fluxToAbMag(`o2`.`rFlux_PS`)))<1"; qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns( {{"LSST", {{"Object", {"objectId", "ra_Test", "decl_Test", "gFlux_PS", "rFlux_PS"}}}}})); queries = queryAnaHelper.getInternalQueries(qsTest, stmt); - CHECK_EQUAL_NORMALIZED(queries[0], expected); + BOOST_CHECK_EQUAL(queries[0], expected); } BOOST_AUTO_TEST_SUITE_END() @@ -1053,13 +1063,14 @@ BOOST_AUTO_TEST_CASE(MatchTableWithWhere) { std::string expected = "SELECT * FROM `LSST`.`RefObjMatch_100` AS `LSST.RefObjMatch` WHERE " "(`refObjectId` IS NULL OR `flags`<>2) " - "AND `LSST.RefObjMatch`.`foo`!=`LSST.RefObjMatch`.`bar` AND `LSST.RefObjMatch`.`baz`<3.14159"; + "AND `LSST.RefObjMatch`.`foo`" PARSER_EXPECTED("<>", "!=") "`LSST.RefObjMatch`.`bar`" + " AND `LSST.RefObjMatch`.`baz`<3.14159"; qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns({{"LSST", {{"RefObjMatch", {"foo", "bar", "baz"}}}}})); std::shared_ptr qs = queryAnaHelper.buildQuerySession(qsTest, stmt); std::string actual = queryAnaHelper.buildFirstParallelQuery(false); - CHECK_EQUAL_NORMALIZED(actual, expected); + BOOST_CHECK_EQUAL(actual, expected); } BOOST_AUTO_TEST_SUITE_END() @@ -1275,13 +1286,10 @@ BOOST_AUTO_TEST_CASE(Case01_1012) { qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns({{"LSST", {{"Object", {"objectId", "iE1_SG"}}}}})); auto qs = queryAnaHelper.buildQuerySession(qsTest, stmt); -#ifdef QSERV_USE_HYRISE_SQL_PARSER - char const expectedErr[] = "ParseException:qserv does not support functions in ORDER BY."; -#else - char const expectedErr[] = + char const* expectedErr = PARSER_EXPECTED( + "ParseException:qserv does not support functions in ORDER BY.", "ParseException:Error parsing query, near \"ABS(iE1_SG)\", qserv does not support " - "functions in ORDER BY."; -#endif + "functions in ORDER BY."); BOOST_CHECK_EQUAL(qs->getError(), expectedErr); } @@ -1295,13 +1303,10 @@ BOOST_AUTO_TEST_CASE(Case01_1013) { qsTest.sqlConfig = SqlConfig(SqlConfig::MockDbTableColumns({{"LSST", {{"Object", {"objectId", "iE1_SG"}}}}})); auto qs = queryAnaHelper.buildQuerySession(qsTest, stmt); -#ifdef QSERV_USE_HYRISE_SQL_PARSER - char const expectedErr[] = "ParseException:qserv does not support functions in ORDER BY."; -#else - char const expectedErr[] = + char const* expectedErr = PARSER_EXPECTED( + "ParseException:qserv does not support functions in ORDER BY.", "ParseException:Error parsing query, near \"ROUND(ABS(iE1_SG), 3)\", qserv does not " - "support functions in ORDER BY."; -#endif + "support functions in ORDER BY."); BOOST_CHECK_EQUAL(qs->getError(), expectedErr); } @@ -1369,15 +1374,19 @@ BOOST_AUTO_TEST_CASE(Case01_1081) { std::string expected_100_subchunk_core = "SELECT count(*) AS `QS1_COUNT` " "FROM `Subchunks_LSST_100`.`Object_100_%S\007S%` AS `o` " - "INNER JOIN `LSST`.`RefObjMatch_100` AS `o2t` ON `o`.`objectIdObjTest`=`o2t`.`objectId` " - "INNER JOIN `Subchunks_LSST_100`.`SimRefObject_100_%S\007S%` AS `t` ON " + PARSER_EXPECTED("JOIN", "INNER JOIN") " `LSST`.`RefObjMatch_100` AS `o2t`" + " ON `o`.`objectIdObjTest`=`o2t`.`objectId` " + PARSER_EXPECTED("JOIN", "INNER JOIN") " `Subchunks_LSST_100`." + "`SimRefObject_100_%S\007S%` AS `t` ON " "`o2t`.`refObjectId`=`t`.`refObjectId` " "WHERE `o`.`closestToObj`=1 OR `o`.`closestToObj` IS NULL"; std::string expected_100_subchunk_overlap = "SELECT count(*) AS `QS1_COUNT` " "FROM `Subchunks_LSST_100`.`Object_100_%S\007S%` AS `o` " - "INNER JOIN `LSST`.`RefObjMatch_100` AS `o2t` ON `o`.`objectIdObjTest`=`o2t`.`objectId` " - "INNER JOIN `Subchunks_LSST_100`.`SimRefObjectFullOverlap_100_%S\007S%` AS `t` ON " + PARSER_EXPECTED("JOIN", "INNER JOIN") " `LSST`.`RefObjMatch_100` AS `o2t`" + " ON `o`.`objectIdObjTest`=`o2t`.`objectId` " + PARSER_EXPECTED("JOIN", "INNER JOIN") " `Subchunks_LSST_100`." + "`SimRefObjectFullOverlap_100_%S\007S%` AS `t` ON " "`o2t`.`refObjectId`=`t`.`refObjectId` " "WHERE `o`.`closestToObj`=1 OR `o`.`closestToObj` IS NULL"; qsTest.sqlConfig = @@ -1403,9 +1412,9 @@ BOOST_AUTO_TEST_CASE(Case01_1081) { int numQueries = first->queries.size(); BOOST_CHECK_EQUAL(numQueries, 2); BOOST_REQUIRE(numQueries > 0); - CHECK_EQUAL_NORMALIZED(first->queries[0], expected_100_subchunk_core); + BOOST_CHECK_EQUAL(first->queries[0], expected_100_subchunk_core); BOOST_REQUIRE(numQueries > 1); - CHECK_EQUAL_NORMALIZED(first->queries[1], expected_100_subchunk_overlap); + BOOST_CHECK_EQUAL(first->queries[1], expected_100_subchunk_overlap); // JOIN syntax, "is NULL" syntax BOOST_REQUIRE_EQUAL(first->subChunkIds.size(), 3u); BOOST_CHECK_EQUAL(first->subChunkIds[0], 100000); @@ -1481,13 +1490,9 @@ BOOST_AUTO_TEST_CASE(Case01_2004) { "FROM Object WHERE rFlux_PS > 10;"; // CASE in column spec is illegal. -#ifdef QSERV_USE_HYRISE_SQL_PARSER - char const expectedErr[] = - "ParseException:qserv can not parse query: CASE expressions are not supported."; -#else - char const expectedErr[] = - "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) THEN 1 ELSE 0 END\""; -#endif + char const* expectedErr = PARSER_EXPECTED( + "ParseException:qserv can not parse query: CASE expressions are not supported.", + "ParseException:qserv can not parse query, near \"CASE WHEN (typeId=3) THEN 1 ELSE 0 END\""); auto qs = queryAnaHelper.buildQuerySession(qsTest, stmt); BOOST_CHECK_EQUAL(qs->getError(), expectedErr); } diff --git a/src/qproc/testQueryAnaOrderBy.cc b/src/qproc/testQueryAnaOrderBy.cc index bc520b8f8d..1472f09e83 100644 --- a/src/qproc/testQueryAnaOrderBy.cc +++ b/src/qproc/testQueryAnaOrderBy.cc @@ -43,10 +43,10 @@ // Qserv headers #include "css/CssAccess.h" +#include "tests/ParserExpected.h" #include "qproc/QuerySession.h" #include "query/SelectStmt.h" #include "sql/SqlConfig.h" -#include "tests/ParserNormalization.h" #include "tests/QueryAnaHelper.h" #include "tests/testKvMap.h" @@ -96,7 +96,7 @@ static const std::vector DATA = { Data("SELECT filterId FROM Filter ORDER BY filterId", "SELECT `LSST.Filter`.`filterId` AS `filterId` FROM `LSST`.`Filter` AS `LSST.Filter`", "", - "ORDER BY `filterId`", + PARSER_EXPECTED("ORDER BY `filterId` ASC", "ORDER BY `filterId`"), sql::SqlConfig(sql::SqlConfig::MockDbTableColumns({{defaultDb, {{"Filter", {"filterId"}}}}}))), // OrderByTwoField @@ -105,7 +105,9 @@ static const std::vector DATA = { "ORDER BY objectId, taiMidPoint ASC", "SELECT `LSST.Source`.`objectId` AS `objectId`,`LSST.Source`.`taiMidPoint` AS `taiMidPoint` " "FROM `LSST`.`Source_100` AS `LSST.Source`", - "", "ORDER BY `objectId`, `taiMidPoint` ASC", + "", + PARSER_EXPECTED("ORDER BY `objectId` ASC, `taiMidPoint` ASC", + "ORDER BY `objectId`, `taiMidPoint` ASC"), sql::SqlConfig(sql::SqlConfig::MockDbTableColumns( {{defaultDb, {{"Source", {"objectId", "taiMidPoint"}}}}}))), @@ -116,7 +118,9 @@ static const std::vector DATA = { "SELECT `LSST.Source`.`objectId` AS `objectId`," "`LSST.Source`.`taiMidPoint` AS `taiMidPoint`,`LSST.Source`.`xFlux` AS `xFlux` " "FROM `LSST`.`Source_100` AS `LSST.Source`", - "", "ORDER BY `objectId`, `taiMidPoint`, `xFlux` DESC", + "", + PARSER_EXPECTED("ORDER BY `objectId` ASC, `taiMidPoint` ASC, `xFlux` DESC", + "ORDER BY `objectId`, `taiMidPoint`, `xFlux` DESC"), sql::SqlConfig(sql::SqlConfig::MockDbTableColumns( {{defaultDb, {{"Source", {"objectId", "taiMidPoint", "xFlux"}}}}}))), @@ -144,7 +148,7 @@ static const std::vector DATA = { "SELECT `filterId` AS `filterId`,SUM(`QS1_SUM`) AS `SUM(photClam)` " "FROM `LSST`.`Filter` AS `LSST.Filter` " "GROUP BY `filterId`", - "ORDER BY `filterId`", + PARSER_EXPECTED("ORDER BY `filterId` ASC", "ORDER BY `filterId`"), sql::SqlConfig(sql::SqlConfig::MockDbTableColumns( {{defaultDb, {{"Filter", {"filterId", "photClam"}}}}}))), @@ -166,9 +170,9 @@ static const std::vector DATA = { "SELECT `LSST.Science_Ccd_Exposure`.`run` AS `run`,`LSST.Science_Ccd_Exposure`.`field` AS " "`field` " "FROM `LSST`.`Science_Ccd_Exposure` AS `LSST.Science_Ccd_Exposure` " - "ORDER BY `field` " - "LIMIT 2", - "", "ORDER BY `field`", + "ORDER BY `field`" PARSER_EXPECTED(" ASC", "") " " + "LIMIT 2", + "", PARSER_EXPECTED("ORDER BY `field` ASC", "ORDER BY `field`"), sql::SqlConfig(sql::SqlConfig::MockDbTableColumns( {{defaultDb, {{"Science_Ccd_Exposure", {"run", "field"}}}}}))), @@ -195,12 +199,12 @@ static const std::vector DATA = { "SELECT `LSST.Filter`.`filterId` AS `filterId`,SUM(`LSST.Filter`.`photClam`) AS `QS1_SUM` " "FROM `LSST`.`Filter` AS `LSST.Filter` " "GROUP BY `filterId` " - "ORDER BY `filterId`", + "ORDER BY `filterId`" PARSER_EXPECTED(" ASC", ""), // FIXME merge query is not useful here, see DM-3166 "SELECT `filterId` AS `filterId`,SUM(`QS1_SUM`) AS `SUM(photClam)` " "FROM `LSST`.`Filter` AS `LSST.Filter` " - "GROUP BY `filterId` ORDER BY `filterId` LIMIT 3", - "ORDER BY `filterId`", + "GROUP BY `filterId` ORDER BY `filterId`" PARSER_EXPECTED(" ASC", "") " LIMIT 3", + PARSER_EXPECTED("ORDER BY `filterId` ASC", "ORDER BY `filterId`"), sql::SqlConfig(sql::SqlConfig::MockDbTableColumns( {{defaultDb, {{"Filter", {"filterId", "photClam"}}}}}))), }; @@ -214,17 +218,16 @@ BOOST_DATA_TEST_CASE(OrderByTest, DATA, data) { auto querySession = queryAnaHelper.buildQuerySession(qsTest, data.stmt); BOOST_REQUIRE_NO_THROW( - CHECK_EQUAL_NORMALIZED(queryAnaHelper.buildFirstParallelQuery(), data.expectedParallel)); + BOOST_CHECK_EQUAL(queryAnaHelper.buildFirstParallelQuery(), data.expectedParallel)); if (querySession->needsMerge()) { - CHECK_EQUAL_NORMALIZED(querySession->getMergeStmt()->getQueryTemplate().sqlFragment(), - data.expectedMerge); + BOOST_CHECK_EQUAL(querySession->getMergeStmt()->getQueryTemplate().sqlFragment(), data.expectedMerge); } else { BOOST_CHECK_EQUAL(data.expectedMerge.empty(), true); BOOST_CHECK_EQUAL(querySession->getMergeStmt(), nullptr); } - CHECK_EQUAL_NORMALIZED(querySession->getResultOrderBy(), data.expectedProxyOrderBy); + BOOST_CHECK_EQUAL(querySession->getResultOrderBy(), data.expectedProxyOrderBy); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/ParserExpected.h b/src/tests/ParserExpected.h new file mode 100644 index 0000000000..7a6a9c25eb --- /dev/null +++ b/src/tests/ParserExpected.h @@ -0,0 +1,47 @@ +// -*- LSST-C++ -*- +/* + * LSST Data Management System + * Copyright 2026 LSST. + * + * This product includes software developed by the + * LSST Project (http://www.lsst.org/). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the LSST License Statement and + * the GNU General Public License along with this program. If not, + * see . + */ + +/** + * @file + * + * @brief Helper for normalizing differences between parser backends. + * + * PARSER_EXPECTED(hyrise, antlr) selects the appropriate string literal for the active parser. + * + * "SELECT ... " PARSER_EXPECTED("JOIN", "INNER JOIN") " ORDER BY ..." + * + * -> SELECT ... JOIN ORDER BY ... + * - or - + * -> SELECT ... INNER JOIN ORDER BY ... + */ + +#ifndef LSST_QSERV_TESTS_PARSEREXPECTED_H +#define LSST_QSERV_TESTS_PARSEREXPECTED_H + +#ifdef QSERV_USE_HYRISE_SQL_PARSER +#define PARSER_EXPECTED(hyrise, antlr) hyrise +#else +#define PARSER_EXPECTED(hyrise, antlr) antlr +#endif + +#endif // LSST_QSERV_TESTS_PARSEREXPECTED_H diff --git a/src/tests/ParserNormalization.h b/src/tests/ParserNormalization.h deleted file mode 100644 index 16d8bfb007..0000000000 --- a/src/tests/ParserNormalization.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * LSST Data Management System - * - * This product includes software developed by the - * LSST Project (http://www.lsst.org/). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - */ - -/** - * @file - * - * @brief Temporary helpers for comparing semantically equivalent parser output. - * - * WARNING: these helper functions are intended to normalize SQL strings from different parser backends, but - * are simplistic in nature (e.g., basic string replacement to achieve normalization). Consider this a - * temporary compatibility layer to allow multiple parser backends to coexist during our transition to a new - * parser backend. - * - * @todo Remove these functions and restore original test behavior to reflect the new parser backend. Leaving - * this compatibility layer is liable to result in bugs down the line due to its simplistic normalization - * process. The alternative would be to write a production-grade SQL normalizer, but it's doubtful that would - * be worth the engineering effort as we're unlikely to need to change the parser backend in the near future. - */ - -#ifndef LSST_QSERV_TESTS_PARSERNORMALIZATION_H -#define LSST_QSERV_TESTS_PARSERNORMALIZATION_H - -// System headers -#include -#include -#include -#include -#include - -// Third-party headers -#include "boost/algorithm/string.hpp" - -// TODO: simplest path for migrating away from this helper will be to delete the macro below. -#define CHECK_EQUAL_NORMALIZED(actual, expected) \ - BOOST_CHECK_EQUAL(::lsst::qserv::tests::normalizeParserEquivalentSql(actual), \ - ::lsst::qserv::tests::normalizeParserEquivalentSql(expected)) - -namespace lsst::qserv::tests { - -inline std::string normalizeNumericLiterals(std::string const& value) { - static std::regex const numericLiteral( - R"((^|[^A-Za-z0-9_`\.])([+-]?(?:(?:[0-9]+\.[0-9]*|\.[0-9]+|[0-9]+)(?:[eE][+-]?[0-9]+)?))(?=$|[^A-Za-z0-9_`\.]))"); - std::string result; - std::string::const_iterator last = value.begin(); - for (std::sregex_iterator i(value.begin(), value.end(), numericLiteral), end; i != end; ++i) { - std::smatch const& match = *i; - result.append(last, match[1].first); - result += match[1].str(); - - std::string const token = match[2].str(); - if (token.find_first_of(".eE") == std::string::npos) { - result += token; - } else { - std::ostringstream os; - os << std::setprecision(std::numeric_limits::max_digits10) << std::stod(token); - result += os.str(); - } - last = match[2].second; - } - result.append(last, value.end()); - return result; -} - -inline std::string normalizeParserEquivalentSql(std::string value) { - boost::replace_all(value, "INNER JOIN", "JOIN"); - boost::replace_all(value, "<>", "!="); - boost::replace_all(value, " ASC", ""); - return normalizeNumericLiterals(value); -} - -} // namespace lsst::qserv::tests - -#endif // LSST_QSERV_TESTS_PARSERNORMALIZATION_H \ No newline at end of file From 1e50e41e5dc784aaca59923310660d8fed424edf Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Mon, 22 Jun 2026 11:44:09 -0700 Subject: [PATCH 14/19] Update Hyrise IR test to properly test SET This previously was being routed through the ANTLR-based parser. --- src/ccontrol/testHyriseGeneratedIR.cc | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/ccontrol/testHyriseGeneratedIR.cc b/src/ccontrol/testHyriseGeneratedIR.cc index a1eae12529..5c6f74b708 100644 --- a/src/ccontrol/testHyriseGeneratedIR.cc +++ b/src/ccontrol/testHyriseGeneratedIR.cc @@ -34,7 +34,6 @@ // Qserv headers #include "ccontrol/ParseRunner.h" -#include "ccontrol/UserQuerySet.h" #include "ccontrol/UserQueryType.h" #include "parser/ParseException.h" #include "qproc/QuerySession.h" @@ -2364,24 +2363,24 @@ BOOST_DATA_TEST_CASE(hyrise_test, ANTLR4_TEST_QUERIES, queryInfo) { } BOOST_AUTO_TEST_CASE(set_session_var_test) { - auto parser = ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 0;"); - auto uq = parser.getUserQuery(); - auto setQuery = std::static_pointer_cast(uq); - BOOST_REQUIRE_EQUAL(setQuery->varName(), "QSERV_ROW_COUNTER_OPTIMIZATION"); - BOOST_REQUIRE_EQUAL(setQuery->varValue(), "0"); - - auto parser1 = ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 1;"); - uq = parser1.getUserQuery(); - setQuery = std::static_pointer_cast(uq); - BOOST_REQUIRE_EQUAL(setQuery->varName(), "QSERV_ROW_COUNTER_OPTIMIZATION"); - BOOST_REQUIRE_EQUAL(setQuery->varValue(), "1"); - - // Verify that bool vals (not handled) are explicity rejected (to prevent a case where a + std::string varName, varValue; + + BOOST_REQUIRE(ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 0;", varName, + varValue)); + BOOST_REQUIRE_EQUAL(varName, "QSERV_ROW_COUNTER_OPTIMIZATION"); + BOOST_REQUIRE_EQUAL(varValue, "0"); + + BOOST_REQUIRE(ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 1;", varName, + varValue)); + BOOST_REQUIRE_EQUAL(varName, "QSERV_ROW_COUNTER_OPTIMIZATION"); + BOOST_REQUIRE_EQUAL(varValue, "1"); + + // Verify that bool vals (not handled) are explicitly rejected (to prevent a case where a // non-zero value "FALSE" evaluates to ON) - BOOST_CHECK_THROW(ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = FALSE;"), - parser::adapter_order_error); - BOOST_CHECK_THROW(ccontrol::ParseRunner("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = TRUE;"), - parser::adapter_order_error); + BOOST_REQUIRE(!ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = FALSE;", + varName, varValue)); + BOOST_REQUIRE(!ccontrol::UserQueryType::isSet("SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = TRUE;", + varName, varValue)); } // OFFSET is not supported by qserv. From fa3a12ba3c2be2528d20f20ef4dac753bbe1098c Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Mon, 22 Jun 2026 18:38:07 -0700 Subject: [PATCH 15/19] Make CALL regex more restrictive Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/ccontrol/UserQueryType.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ccontrol/UserQueryType.cc b/src/ccontrol/UserQueryType.cc index f9c05b10f0..4ff53b87e8 100644 --- a/src/ccontrol/UserQueryType.cc +++ b/src/ccontrol/UserQueryType.cc @@ -89,8 +89,8 @@ boost::regex _setRe(R"(^set\s+.+$)", boost::regex::ECMAScript | boost::regex::ic boost::regex _setGlobalRe(R"(^set\s+global\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*([-+]?\d+)\s*;?\s*$)", boost::regex::ECMAScript | boost::regex::icase | boost::regex::optimize); -// regex extracting the argument of `CALL QSERV_RESULT_DELETE()` -boost::regex _resultDeleteRe(R"(^call\s+qserv_result_delete\s*\(\s*(.*?)\s*\)\s*;?\s*$)", +// regex extracting the argument of `CALL QSERV_RESULT_DELETE()` +boost::regex _resultDeleteRe(R"(^call\s+qserv_result_delete\s*\(\s*(\d+)\s*\)\s*;?\s*$)", boost::regex::ECMAScript | boost::regex::icase | boost::regex::optimize); } // namespace From 0b293486082581a069a7fceabdde9072d09df7e1 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Tue, 23 Jun 2026 14:56:43 -0700 Subject: [PATCH 16/19] Update session variable handling for SET GLOBAL Previously all nonzero values were considered 'true' by SET GLOBAL user queries. This specifically accepts "0" or "1" for false/true or returns a UserQueryInvalid otherwise. --- src/ccontrol/UserQueryFactory.cc | 45 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/ccontrol/UserQueryFactory.cc b/src/ccontrol/UserQueryFactory.cc index d6f36fae41..ec085f99af 100644 --- a/src/ccontrol/UserQueryFactory.cc +++ b/src/ccontrol/UserQueryFactory.cc @@ -79,6 +79,19 @@ namespace lsst::qserv::ccontrol { using userQuerySharedResourcesPtr = std::shared_ptr; +UserQuery::Ptr setBooleanSessionVariable(std::string const& varName, std::string const& varValue, + bool& sessionVariable) { + if (varValue == "0") { + sessionVariable = false; + } else if (varValue == "1") { + sessionVariable = true; + } else { + return std::make_shared("Unsupported value for " + varName + ": " + varValue); + } + LOGS(_log, LOG_LVL_WARN, varName << "=" << (sessionVariable ? "1" : "0")); + return std::make_shared(varName, varValue); +} + /** * @brief Determine if the table name in the FROM statement refers to PROCESSLIST table. * @@ -413,22 +426,11 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st return parser->getUserQuery(); #endif } else if (UserQueryType::isSet(query)) { -#ifdef QSERV_USE_HYRISE_SQL_PARSER std::string varName, varValue; +#ifdef QSERV_USE_HYRISE_SQL_PARSER if (!UserQueryType::isSet(query, varName, varValue)) { return std::make_shared("Unsupported SET statement: " + query); } - std::lock_guard factoryLock(_factoryMtx); - auto uq = std::make_shared(varName, varValue); - if (varName == "QSERV_ROW_COUNTER_OPTIMIZATION") { - _useQservRowCounterOptimization = varValue != "0"; - LOGS(_log, LOG_LVL_WARN, - "QSERV_ROW_COUNTER_OPTIMIZATION=" << (_useQservRowCounterOptimization ? "1" : "0")); - } else if (varName == "QSERV_DEBUG_CZAR_NO_MERGE") { - _debugNoMerge = varValue != "0"; - LOGS(_log, LOG_LVL_WARN, "QSERV_DEBUG_CZAR_NO_MERGE=" << (_debugNoMerge ? "1" : "0")); - } - return uq; #else ParseRunner::Ptr parser; try { @@ -437,18 +439,17 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st return std::make_shared(std::string("ParseException:") + e.what()); } auto uq = parser->getUserQuery(); - std::lock_guard factoryLock(_factoryMtx); auto setQuery = std::static_pointer_cast(uq); - if (setQuery->varName() == "QSERV_ROW_COUNTER_OPTIMIZATION") { - _useQservRowCounterOptimization = setQuery->varValue() != "0"; - LOGS(_log, LOG_LVL_WARN, - "QSERV_ROW_COUNTER_OPTIMIZATION=" << (_useQservRowCounterOptimization ? "1" : "0")); - } else if (setQuery->varName() == "QSERV_DEBUG_CZAR_NO_MERGE") { - _debugNoMerge = setQuery->varValue() != "0"; - LOGS(_log, LOG_LVL_WARN, "QSERV_DEBUG_CZAR_NO_MERGE=" << (_debugNoMerge ? "1" : "0")); - } - return uq; + varName = setQuery->varName(); + varValue = setQuery->varValue(); #endif + std::lock_guard factoryLock(_factoryMtx); + if (varName == "QSERV_ROW_COUNTER_OPTIMIZATION") { + return setBooleanSessionVariable(varName, varValue, _useQservRowCounterOptimization); + } else if (varName == "QSERV_DEBUG_CZAR_NO_MERGE") { + return setBooleanSessionVariable(varName, varValue, _debugNoMerge); + } + return std::make_shared("Unsupported SET variable: " + varName); } else { std::lock_guard factoryLock(_factoryMtx); // something that we don't recognize From 8936681174cecc221fc1618b652d342839eab9aa Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Wed, 24 Jun 2026 14:53:00 -0700 Subject: [PATCH 17/19] Update area restrictor handling with AND/OR/NOT Area restrictor are handled as a special case, and in some situations queries with OR / NOT were silently converted to conjunctive (AND) queries. This resolves the issue and also allows some conjunctive cases that were previously restricted. Test cases were added to exercise these paths. This issue also appears to be present in the ANTLR-based parser path. --- src/ccontrol/HyriseAdapter.cc | 81 ++++++++++++++++---------- src/ccontrol/testAntlr4GeneratedIR.cc | 12 ++++ src/ccontrol/testHyriseGeneratedIR.cc | 83 +++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 29 deletions(-) diff --git a/src/ccontrol/HyriseAdapter.cc b/src/ccontrol/HyriseAdapter.cc index da8d3106d4..56c04c79ca 100644 --- a/src/ccontrol/HyriseAdapter.cc +++ b/src/ccontrol/HyriseAdapter.cc @@ -561,45 +561,63 @@ std::shared_ptr buildAreaRestrictor(hsql::Expr const* exp return nullptr; } +std::shared_ptr buildConstValueExpr(std::string const& value) { + return query::ValueExpr::newSimple(query::ValueFactor::newConstFactor(value)); +} + +std::shared_ptr buildUnaryMinusValueExpr(hsql::Expr const* expr) { + auto const* operand = expr->expr; + if (operand != nullptr) { + switch (operand->type) { + case hsql::kExprLiteralInt: + return buildConstValueExpr("-" + std::to_string(operand->ival)); + case hsql::kExprLiteralIntString: + return buildConstValueExpr("-" + nullToEmpty(operand->name)); + case hsql::kExprLiteralFloat: + return buildConstValueExpr("-" + formatFloat(operand->fval)); + default: + break; + } + } + + auto value = std::make_shared(); + value->addValueFactor(query::ValueFactor::newConstFactor("0")); + value->addOp(query::ValueExpr::MINUS); + value->addValueFactor(buildValueFactor(operand)); + return value; +} + std::shared_ptr buildValueExpr(hsql::Expr const* expr) { if (expr == nullptr) unsupported("null value expression"); - if (expr->type == hsql::kExprOperator) { - if (expr->opType == hsql::kOpUnaryMinus) { - if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralInt) { - return query::ValueExpr::newSimple( - query::ValueFactor::newConstFactor("-" + std::to_string(expr->expr->ival))); - } - if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralIntString) { - return query::ValueExpr::newSimple( - query::ValueFactor::newConstFactor("-" + nullToEmpty(expr->expr->name))); - } - if (expr->expr != nullptr && expr->expr->type == hsql::kExprLiteralFloat) { - return query::ValueExpr::newSimple( - query::ValueFactor::newConstFactor("-" + formatFloat(expr->expr->fval))); - } - auto value = std::make_shared(); - value->addValueFactor(query::ValueFactor::newConstFactor("0")); - value->addOp(query::ValueExpr::MINUS); - value->addValueFactor(buildValueFactor(expr->expr)); - return value; - } - auto value = std::make_shared(); - value->addValueFactor(buildValueFactor(expr->expr)); - value->addOp(valueOp(expr->opType)); - value->addValueFactor(buildValueFactor(expr->expr2)); - return value; + if (expr->type != hsql::kExprOperator) { + return query::ValueExpr::newSimple(buildValueFactor(expr)); + } + if (expr->opType == hsql::kOpUnaryMinus) { + return buildUnaryMinusValueExpr(expr); } - return query::ValueExpr::newSimple(buildValueFactor(expr)); + + auto value = std::make_shared(); + value->addValueFactor(buildValueFactor(expr->expr)); + value->addOp(valueOp(expr->opType)); + value->addValueFactor(buildValueFactor(expr->expr2)); + return value; } -WhereTerm buildWhereTerm(hsql::Expr const* expr) { +WhereTerm buildWhereTerm(hsql::Expr const* expr, bool allowAreaRestrictor = true) { if (expr == nullptr) unsupported("null boolean expression"); if (auto restrictor = buildAreaRestrictor(expr)) { + if (!allowAreaRestrictor) { + unsupported("qserv area restrictors are only supported in conjunctive (AND) contexts"); + } return {nullptr, {restrictor}}; } + if (expr->type == hsql::kExprOperator && (expr->opType == hsql::kOpAnd || expr->opType == hsql::kOpOr)) { - auto left = buildWhereTerm(expr->expr); - auto right = buildWhereTerm(expr->expr2); + // Area restrictors are extracted into WhereClause and handled as a special case, effectively making + // them conjunctive. We explicitly disallow area restrictors combined with OR / NOT. + auto const childAllowsAreaRestrictor = allowAreaRestrictor && expr->opType != hsql::kOpOr; + auto left = buildWhereTerm(expr->expr, childAllowsAreaRestrictor); + auto right = buildWhereTerm(expr->expr2, childAllowsAreaRestrictor); WhereTerm result; appendRestrictors(result.restrictors, left.restrictors); appendRestrictors(result.restrictors, right.restrictors); @@ -634,6 +652,11 @@ WhereTerm buildWhereTerm(hsql::Expr const* expr) { } return result; } + + if (expr->type == hsql::kExprOperator && expr->opType == hsql::kOpNot) { + if (expr->expr == nullptr) unsupported("NOT expression"); + buildWhereTerm(expr->expr, false); + } return {buildBoolTerm(expr), {}}; } diff --git a/src/ccontrol/testAntlr4GeneratedIR.cc b/src/ccontrol/testAntlr4GeneratedIR.cc index cb903de924..6d42a3d52f 100644 --- a/src/ccontrol/testAntlr4GeneratedIR.cc +++ b/src/ccontrol/testAntlr4GeneratedIR.cc @@ -69,6 +69,18 @@ using namespace std; namespace test = boost::test_tools; using namespace lsst::qserv; +// ------------- +// !!! NOTE: !!! +// ------------- +// The ANTLR adapter currently rejects some valid AND placements and accepts some invalid OR placements. +// This behavior was corrected in the Hyrise adapter. See Hyrise tests: +// - area_restrictor_in_conjunction_supported +// - area_restrictor_under_or_rejected +// - area_restrictor_under_not_rejected +// +// The ANTLR adapter was left unchanged to preserve legacy behavior. In the event that we decide to retain the +// legacy ANTLR parser, we should investigate fixing the bug here as well. + BOOST_AUTO_TEST_SUITE(Suite) /// Negation is used in class constructors where the class may be negated by 'NOT', where IS_NOT == "NOT", diff --git a/src/ccontrol/testHyriseGeneratedIR.cc b/src/ccontrol/testHyriseGeneratedIR.cc index 5c6f74b708..201ab4a821 100644 --- a/src/ccontrol/testHyriseGeneratedIR.cc +++ b/src/ccontrol/testHyriseGeneratedIR.cc @@ -57,6 +57,7 @@ #include "query/OrTerm.h" #include "query/PassTerm.h" #include "query/AreaRestrictor.h" +#include "query/QueryTemplate.h" #include "query/SelectList.h" #include "query/SelectStmt.h" #include "query/TableRef.h" @@ -1140,6 +1141,8 @@ static const vector ANTLR4_TEST_QUERIES = { }, "SELECT `objectId` FROM `Object` WHERE qserv_areaspec_box(0,0,3,10) ORDER BY `objectId` ASC"), // test qserv_areaspec_box wrapped in an equality comparison (form used in some integration tests) + // The equality wrapper is a legacy compatibility form. Qserv extracts the area restrictor and + // ignores the `= 1` or `1 =` wrapper. Antlr4TestQueries( "SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) = 1", []() -> shared_ptr { @@ -2429,4 +2432,84 @@ BOOST_AUTO_TEST_CASE(area_restrictor_against_column_not_supported) { parser::ParseException); } +bool areaRestrictorNotAllowed(parser::ParseException const& err) { + return std::string(err.what()) + .find("qserv area restrictors are only supported in conjunctive (AND) contexts") != + std::string::npos; +} + +void checkAreaRestrictorConjunctionIr(std::string const& query, std::string const& expectedRootTerm) { + auto selectStmt = ccontrol::ParseRunner::makeSelectStmt(query); + BOOST_REQUIRE(selectStmt != nullptr); + BOOST_REQUIRE(selectStmt->hasWhereClause()); + + auto& whereClause = selectStmt->getWhereClause(); + BOOST_REQUIRE(whereClause.hasRestrs()); + BOOST_REQUIRE(whereClause.getRestrs() != nullptr); + BOOST_REQUIRE_EQUAL(whereClause.getRestrs()->size(), 1); + BOOST_REQUIRE(whereClause.getRootTerm() != nullptr); + + query::QueryTemplate rootTermTemplate; + whereClause.getRootTerm()->renderTo(rootTermTemplate); + BOOST_REQUIRE_EQUAL(rootTermTemplate.sqlFragment(), expectedRootTerm); +} + +BOOST_AUTO_TEST_CASE(area_restrictor_in_conjunction_supported) { + checkAreaRestrictorConjunctionIr( + "SELECT objectId FROM Object " + "WHERE filterName='g' AND (qserv_areaspec_box(0, 0, 3, 10) AND ra_PS > 1)", + "`filterName`='g' AND `ra_PS`>1"); + checkAreaRestrictorConjunctionIr( + "SELECT objectId FROM Object " + "WHERE qserv_areaspec_box(0, 0, 3, 10) AND (filterName='g' OR filterName='r')", + "`filterName`='g' OR `filterName`='r'"); + checkAreaRestrictorConjunctionIr( + "SELECT objectId FROM Object " + "WHERE qserv_areaspec_box(0, 0, 3, 10) AND NOT (filterName='g')", + "NOT `filterName`='g'"); +} + +// A qserv area restrictor under OR would be silently extracted to an AND side-channel, changing +// semantics: "restrictor OR x=1" would become effectively "restrictor AND x=1". Reject explicitly. +BOOST_AUTO_TEST_CASE(area_restrictor_under_or_rejected) { + BOOST_CHECK_EXCEPTION( + ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) OR filterName='g'"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION( + ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object WHERE filterName='g' OR qserv_areaspec_box(0, 0, 3, 10)"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object " + "WHERE (qserv_areaspec_box(0, 0, 3, 10) AND ra_PS > 1) OR filterName='g'"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object " + "WHERE filterName='g' OR (qserv_areaspec_box(0, 0, 3, 10) AND ra_PS > 1)"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object " + "WHERE qserv_areaspec_box(0, 0, 3, 10) = 1 OR filterName='g'"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object " + "WHERE filterName='g' OR 1 = qserv_areaspec_box(0, 0, 3, 10)"), + parser::ParseException, areaRestrictorNotAllowed); +} + +BOOST_AUTO_TEST_CASE(area_restrictor_under_not_rejected) { + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object WHERE NOT qserv_areaspec_box(0, 0, 3, 10)"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object " + "WHERE NOT (qserv_areaspec_box(0, 0, 3, 10) AND filterName='g')"), + parser::ParseException, areaRestrictorNotAllowed); + BOOST_CHECK_EXCEPTION(ccontrol::ParseRunner::makeSelectStmt( + "SELECT objectId FROM Object " + "WHERE NOT (qserv_areaspec_box(0, 0, 3, 10) OR filterName='g')"), + parser::ParseException, areaRestrictorNotAllowed); +} + BOOST_AUTO_TEST_SUITE_END() From 829fa8c3b7e536d2e17b5426e6e99807f07481a2 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Thu, 25 Jun 2026 15:03:25 -0700 Subject: [PATCH 18/19] Minor refactor to improve readability --- src/ccontrol/HyriseAdapter.cc | 168 +++++++++++++++++++++------------- 1 file changed, 104 insertions(+), 64 deletions(-) diff --git a/src/ccontrol/HyriseAdapter.cc b/src/ccontrol/HyriseAdapter.cc index 56c04c79ca..66565f8600 100644 --- a/src/ccontrol/HyriseAdapter.cc +++ b/src/ccontrol/HyriseAdapter.cc @@ -345,15 +345,6 @@ query::CompPredicate::OpType compOp(hsql::OperatorType op) { } } -struct WhereTerm { - std::shared_ptr term; - query::AreaRestrictorVec restrictors; -}; - -void appendRestrictors(query::AreaRestrictorVec& target, query::AreaRestrictorVec const& source) { - target.insert(target.end(), source.begin(), source.end()); -} - std::shared_ptr buildColumnRef(hsql::Expr const* expr) { if (expr->type != hsql::kExprColumnRef) unsupported("non-column column reference"); std::string schema = nullToEmpty(expr->schema); @@ -603,35 +594,53 @@ std::shared_ptr buildValueExpr(hsql::Expr const* expr) { return value; } -WhereTerm buildWhereTerm(hsql::Expr const* expr, bool allowAreaRestrictor = true) { +void validateAreaRestrictorPlacement(hsql::Expr const* expr, bool allowAreaRestrictorExtraction = true) { if (expr == nullptr) unsupported("null boolean expression"); - if (auto restrictor = buildAreaRestrictor(expr)) { - if (!allowAreaRestrictor) { + + if (buildAreaRestrictor(expr) != nullptr) { + if (!allowAreaRestrictorExtraction) { unsupported("qserv area restrictors are only supported in conjunctive (AND) contexts"); } - return {nullptr, {restrictor}}; + return; } if (expr->type == hsql::kExprOperator && (expr->opType == hsql::kOpAnd || expr->opType == hsql::kOpOr)) { // Area restrictors are extracted into WhereClause and handled as a special case, effectively making // them conjunctive. We explicitly disallow area restrictors combined with OR / NOT. - auto const childAllowsAreaRestrictor = allowAreaRestrictor && expr->opType != hsql::kOpOr; - auto left = buildWhereTerm(expr->expr, childAllowsAreaRestrictor); - auto right = buildWhereTerm(expr->expr2, childAllowsAreaRestrictor); - WhereTerm result; - appendRestrictors(result.restrictors, left.restrictors); - appendRestrictors(result.restrictors, right.restrictors); + auto const childAllowsAreaRestrictorExtraction = + allowAreaRestrictorExtraction && expr->opType != hsql::kOpOr; + validateAreaRestrictorPlacement(expr->expr, childAllowsAreaRestrictorExtraction); + validateAreaRestrictorPlacement(expr->expr2, childAllowsAreaRestrictorExtraction); + return; + } + + if (expr->type == hsql::kExprOperator && expr->opType == hsql::kOpNot) { + if (expr->expr == nullptr) unsupported("NOT expression"); + validateAreaRestrictorPlacement(expr->expr, false); + } +} + +std::shared_ptr buildWhereTerm(hsql::Expr const* expr, query::WhereClause& where) { + if (expr == nullptr) unsupported("null boolean expression"); + if (auto restrictor = buildAreaRestrictor(expr)) { + where.addAreaRestrictor(restrictor); + return nullptr; + } + + if (expr->type == hsql::kExprOperator && (expr->opType == hsql::kOpAnd || expr->opType == hsql::kOpOr)) { + auto left = buildWhereTerm(expr->expr, where); + auto right = buildWhereTerm(expr->expr2, where); query::BoolTerm::PtrVector terms; - if (left.term != nullptr) terms.push_back(left.term); - if (right.term != nullptr) terms.push_back(right.term); - if (terms.empty()) return result; + if (left != nullptr) terms.push_back(left); + if (right != nullptr) terms.push_back(right); + if (terms.empty()) return nullptr; if (terms.size() == 1) { - result.term = std::dynamic_pointer_cast(terms.front()); - if (result.term == nullptr) { - result.term = std::make_shared(terms); + auto term = std::dynamic_pointer_cast(terms.front()); + if (term == nullptr) { + term = std::make_shared(terms); } - return result; + return term; } if (expr->opType == hsql::kOpAnd) { auto andTerm = std::make_shared(); @@ -640,24 +649,18 @@ WhereTerm buildWhereTerm(hsql::Expr const* expr, bool allowAreaRestrictor = true andTerm->addBoolTerm(term); } } - result.term = andTerm; - } else { - auto orTerm = std::make_shared(); - for (auto const& term : terms) { - if (!orTerm->merge(*term)) { - orTerm->addBoolTerm(std::make_shared(term)); - } - } - result.term = orTerm; + return andTerm; } - return result; - } - if (expr->type == hsql::kExprOperator && expr->opType == hsql::kOpNot) { - if (expr->expr == nullptr) unsupported("NOT expression"); - buildWhereTerm(expr->expr, false); + auto orTerm = std::make_shared(); + for (auto const& term : terms) { + if (!orTerm->merge(*term)) { + orTerm->addBoolTerm(std::make_shared(term)); + } + } + return orTerm; } - return {buildBoolTerm(expr), {}}; + return buildBoolTerm(expr); } std::shared_ptr buildBoolTerm(hsql::Expr const* expr) { @@ -728,17 +731,6 @@ std::shared_ptr buildSelectList(hsql::SelectStatement const& return selectList; } -std::string tableAlias(hsql::Alias const* alias) { - return alias == nullptr ? std::string() : nullToEmpty(alias->name); -} - -query::TableRef::Ptr buildSimpleTableRef(hsql::TableRef const* table) { - if (table == nullptr) unsupported("missing from table"); - if (table->type != hsql::kTableName) unsupported("non-simple table reference"); - return std::make_shared(nullToEmpty(table->schema), nullToEmpty(table->name), - tableAlias(table->alias)); -} - query::JoinRef::Type buildJoinType(hsql::JoinType type) { switch (type) { case hsql::kJoinInner: @@ -774,14 +766,48 @@ std::shared_ptr buildJoinSpec(hsql::JoinDefinition const* join) unsupported("join without ON or USING"); } -query::TableRef::Ptr buildJoinedTableRef(hsql::TableRef const* table) { +query::TableRef::Ptr buildNamedTableRef(hsql::TableRef const* table) { if (table == nullptr) unsupported("missing from table"); - if (table->type == hsql::kTableName) return buildSimpleTableRef(table); + if (table->type != hsql::kTableName) unsupported("non-simple table reference"); + + std::string alias; + if (table->alias != nullptr) alias = nullToEmpty(table->alias->name); + + return std::make_shared(nullToEmpty(table->schema), nullToEmpty(table->name), alias); +} + +query::TableRef::Ptr buildTableRef(hsql::TableRef const* table) { + if (table == nullptr) unsupported("missing from table"); + + if (table->type == hsql::kTableName) return buildNamedTableRef(table); + if (table->type != hsql::kTableJoin || table->join == nullptr) { unsupported("non-simple table reference"); } - auto left = buildJoinedTableRef(table->join->left); - auto right = buildSimpleTableRef(table->join->right); + + // Hyrise represents joins as a tree, e.g.: + // FROM A + // JOIN B ON A.id = B.id + // JOIN C ON B.id = C.id + // JOIN D ON C.id = D.id + // + // Is represented as: + // kTableJoin + // |- kTableJoin (left) + // | |- kTableJoin (left) + // | | |- kTableName: 'A' (left) + // | | |- kTableName: 'B' (right) + // | |- kTableName: 'C' (right) + // |- kTableName: 'D' (right) + // + // So we traverse down the left side recursively and build the right + // side on our way up to convert this to a Qserv join list. + + auto left = buildTableRef(table->join->left); + + // Qserv supports only named tables on the right side of an explicit join. + auto right = buildNamedTableRef(table->join->right); + left->addJoin(std::make_shared( right, buildJoinType(table->join->type), table->join->natural || table->join->type == hsql::kJoinNatural, buildJoinSpec(table->join))); @@ -792,41 +818,51 @@ std::shared_ptr buildFromList(hsql::SelectStatement const& stmt auto tables = std::make_shared(); if (stmt.fromTable == nullptr) unsupported("missing FROM"); if (stmt.fromTable->type == hsql::kTableCrossProduct) { + // We are selecting from multiple tables e.g., SELECT * FROM Object, Source, Filter + // (cross-product / CROSS JOIN) if (stmt.fromTable->list == nullptr) unsupported("empty table list"); for (auto const* table : *stmt.fromTable->list) { - tables->push_back(buildJoinedTableRef(table)); + tables->push_back(buildTableRef(table)); } } else { - tables->push_back(buildJoinedTableRef(stmt.fromTable)); + // single FROM + tables->push_back(buildTableRef(stmt.fromTable)); } return std::make_shared(tables); } std::shared_ptr buildWhereClause(hsql::SelectStatement const& stmt) { if (stmt.whereClause == nullptr) return nullptr; + + // Qserv area restrictors have specific placment requirements: + validateAreaRestrictorPlacement(stmt.whereClause); + + // The parse tree for WHERE works similarly to table refs, see buildTableRefs + // for a brief explanation. auto where = std::make_shared(); - auto result = buildWhereTerm(stmt.whereClause); - if (result.term != nullptr) { - where->setRootTerm(result.term); - } - for (auto const& restrictor : result.restrictors) { - where->addAreaRestrictor(restrictor); + auto rootTerm = buildWhereTerm(stmt.whereClause, *where); + if (rootTerm != nullptr) { + where->setRootTerm(rootTerm); } return where; } std::shared_ptr buildOrderBy(hsql::SelectStatement const& stmt) { if (stmt.order == nullptr || stmt.order->empty()) return nullptr; + auto orderBy = std::make_shared(); for (auto const* term : *stmt.order) { if (term->null_ordering != hsql::NullOrdering::Undefined) unsupported("NULLS FIRST/LAST in ORDER BY"); + auto valueExpr = buildValueExpr(term->expr); if (valueExpr->isFunction()) { throw parser::ParseException("qserv does not support functions in ORDER BY."); } + query::OrderByTerm::Order order = query::OrderByTerm::DEFAULT; if (term->type == hsql::kOrderAsc) order = query::OrderByTerm::ASC; if (term->type == hsql::kOrderDesc) order = query::OrderByTerm::DESC; + orderBy->addTerm(query::OrderByTerm(valueExpr, order)); } return orderBy; @@ -836,6 +872,7 @@ std::shared_ptr buildGroupBy(hsql::SelectStatement const& if (stmt.groupBy == nullptr || stmt.groupBy->columns == nullptr || stmt.groupBy->columns->empty()) { return nullptr; } + auto groupBy = std::make_shared(); for (auto const* expr : *stmt.groupBy->columns) { groupBy->addTerm(query::GroupByTerm(buildValueExpr(expr), std::string())); @@ -847,6 +884,7 @@ std::shared_ptr buildHaving(hsql::SelectStatement const& st if (stmt.groupBy != nullptr && stmt.groupBy->having != nullptr) { return std::make_shared(buildBoolTerm(stmt.groupBy->having)); } + if (stmt.having != nullptr) { return std::make_shared(buildBoolTerm(stmt.having)); } @@ -856,9 +894,11 @@ std::shared_ptr buildHaving(hsql::SelectStatement const& st int buildLimit(hsql::SelectStatement const& stmt) { if (stmt.limit == nullptr || stmt.limit->limit == nullptr) return lsst::qserv::NOTSET; if (stmt.limit->offset != nullptr) unsupported("OFFSET"); + auto const* limit = stmt.limit->limit; if (limit->type != hsql::kExprLiteralInt) unsupported("non-integer LIMIT"); if (limit->ival > static_cast(std::numeric_limits::max())) unsupported("LIMIT overflow"); + return static_cast(limit->ival); } From a2aaa7f78740dcd02100eac6bcb180d0b1dfe9b2 Mon Sep 17 00:00:00 2001 From: Matthew Malensek Date: Thu, 25 Jun 2026 17:00:45 -0700 Subject: [PATCH 19/19] Update _resultDeleteRe docstring to match regex Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/ccontrol/UserQueryType.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ccontrol/UserQueryType.h b/src/ccontrol/UserQueryType.h index 3dc26a996a..94205e9216 100644 --- a/src/ccontrol/UserQueryType.h +++ b/src/ccontrol/UserQueryType.h @@ -103,7 +103,7 @@ class UserQueryType { /** * Returns true if query is `CALL QSERV_RESULT_DELETE()` - * On a match, sets @p queryId to the raw, unvalidated argument string. + * On a match, sets @p queryId to the numeric query id string (digits only). */ static bool isResultDelete(std::string const& query, std::string& queryId);