ClickHouse/dbms/src/Storages/tests/gtest_transform_query_for_external_database.cpp

103 lines
4.2 KiB
C++
Raw Normal View History

2019-05-16 19:57:20 +00:00
#include <gtest/gtest.h>
#include <Storages/transformQueryForExternalDatabase.h>
#include <Parsers/ParserSelectQuery.h>
#include <Parsers/parseQuery.h>
#include <DataTypes/DataTypesNumber.h>
2019-10-09 20:16:17 +00:00
#include <DataTypes/DataTypeDateTime.h>
2019-05-16 19:57:20 +00:00
#include <Interpreters/Context.h>
#include <Databases/DatabaseMemory.h>
#include <Storages/StorageMemory.h>
2019-05-16 21:09:06 +00:00
#include <Functions/registerFunctions.h>
2019-05-16 19:57:20 +00:00
2019-05-16 21:09:06 +00:00
using namespace DB;
2019-05-16 19:57:20 +00:00
2019-05-16 21:09:06 +00:00
2019-05-18 22:19:24 +00:00
/// NOTE How to do better?
struct State
{
Context context{Context::createGlobal()};
2019-10-09 20:16:17 +00:00
NamesAndTypesList columns{
{"column", std::make_shared<DataTypeUInt8>()},
{"apply_id", std::make_shared<DataTypeUInt64>()},
{"apply_type", std::make_shared<DataTypeUInt8>()},
{"apply_status", std::make_shared<DataTypeUInt8>()},
{"create_time", std::make_shared<DataTypeDateTime>()},
};
2019-05-18 22:19:24 +00:00
State()
{
registerFunctions();
DatabasePtr database = std::make_shared<DatabaseMemory>("test");
2019-08-26 02:46:21 +00:00
database->attachTable("table", StorageMemory::create("test", "table", ColumnsDescription{columns}, ConstraintsDescription{}));
2019-07-08 02:14:32 +00:00
context.makeGlobalContext();
2019-05-18 22:19:24 +00:00
context.addDatabase("test", database);
context.setCurrentDatabase("test");
}
};
2019-12-15 06:34:43 +00:00
static State & state()
2019-05-18 22:19:24 +00:00
{
static State res;
return res;
}
2019-12-15 06:34:43 +00:00
static void check(const std::string & query, const std::string & expected, const Context & context, const NamesAndTypesList & columns)
2019-05-16 21:09:06 +00:00
{
2019-05-16 19:57:20 +00:00
ParserSelectQuery parser;
ASTPtr ast = parseQuery(parser, query, 1000);
2019-05-16 21:09:06 +00:00
std::string transformed_query = transformQueryForExternalDatabase(*ast, columns, IdentifierQuotingStyle::DoubleQuotes, "test", "table", context);
EXPECT_EQ(transformed_query, expected);
}
2019-05-18 22:19:24 +00:00
TEST(TransformQueryForExternalDatabase, InWithSingleElement)
2019-05-16 21:09:06 +00:00
{
2019-05-18 22:19:24 +00:00
check("SELECT column FROM test.table WHERE 1 IN (1)",
2019-10-27 18:12:40 +00:00
"SELECT \"column\" FROM \"test\".\"table\" WHERE 1",
2019-05-18 22:19:24 +00:00
state().context, state().columns);
check("SELECT column FROM test.table WHERE column IN (1, 2)",
2019-06-29 16:18:59 +00:00
"SELECT \"column\" FROM \"test\".\"table\" WHERE \"column\" IN (1, 2)",
2019-05-18 22:19:24 +00:00
state().context, state().columns);
check("SELECT column FROM test.table WHERE column NOT IN ('hello', 'world')",
2019-06-29 16:18:59 +00:00
"SELECT \"column\" FROM \"test\".\"table\" WHERE \"column\" NOT IN ('hello', 'world')",
2019-05-18 22:19:24 +00:00
state().context, state().columns);
2019-05-16 22:55:29 +00:00
}
2019-05-18 22:19:24 +00:00
TEST(TransformQueryForExternalDatabase, Like)
2019-05-16 22:55:29 +00:00
{
2019-05-18 22:19:24 +00:00
check("SELECT column FROM test.table WHERE column LIKE '%hello%'",
2019-06-29 16:18:59 +00:00
"SELECT \"column\" FROM \"test\".\"table\" WHERE \"column\" LIKE '%hello%'",
2019-05-18 22:19:24 +00:00
state().context, state().columns);
check("SELECT column FROM test.table WHERE column NOT LIKE 'w%rld'",
2019-06-29 16:18:59 +00:00
"SELECT \"column\" FROM \"test\".\"table\" WHERE \"column\" NOT LIKE 'w%rld'",
2019-05-18 22:19:24 +00:00
state().context, state().columns);
2019-05-16 19:57:20 +00:00
}
2019-08-07 18:52:53 +00:00
TEST(TransformQueryForExternalDatabase, Substring)
{
check("SELECT column FROM test.table WHERE left(column, 10) = RIGHT(column, 10) AND SUBSTRING(column FROM 1 FOR 2) = 'Hello'",
"SELECT \"column\" FROM \"test\".\"table\"",
state().context, state().columns);
}
TEST(TransformQueryForExternalDatabase, MultipleAndSubqueries)
{
check("SELECT column FROM test.table WHERE 1 = 1 AND toString(column) = '42' AND column = 42 AND left(column, 10) = RIGHT(column, 10) AND column IN (1, 42) AND SUBSTRING(column FROM 1 FOR 2) = 'Hello' AND column != 4",
"SELECT \"column\" FROM \"test\".\"table\" WHERE 1 AND (\"column\" = 42) AND (\"column\" IN (1, 42)) AND (\"column\" != 4)",
state().context, state().columns);
check("SELECT column FROM test.table WHERE toString(column) = '42' AND left(column, 10) = RIGHT(column, 10) AND column = 42",
"SELECT \"column\" FROM \"test\".\"table\" WHERE (\"column\" = 42)",
state().context, state().columns);
2019-10-09 20:16:17 +00:00
}
2019-10-09 20:16:17 +00:00
TEST(TransformQueryForExternalDatabase, Issue7245)
{
check("select apply_id from test.table where apply_type = 2 and create_time > addDays(toDateTime('2019-01-01 01:02:03'),-7) and apply_status in (3,4)",
"SELECT \"apply_id\", \"apply_type\", \"apply_status\", \"create_time\" FROM \"test\".\"table\" WHERE (\"apply_type\" = 2) AND (\"create_time\" > '2018-12-25 01:02:03') AND (\"apply_status\" IN (3, 4))",
state().context, state().columns);
2019-08-27 13:13:40 +00:00
}