mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge pull request #47495 from ClickHouse/Parameterized_view_bug_fix_47287_47247
Parameterized view bug fix 47287 47247
This commit is contained in:
commit
52b6976822
@ -562,7 +562,6 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
{
|
||||
/// Allow push down and other optimizations for VIEW: replace with subquery and rewrite it.
|
||||
ASTPtr view_table;
|
||||
NameToNameMap parameter_values;
|
||||
NameToNameMap parameter_types;
|
||||
if (view)
|
||||
{
|
||||
@ -575,14 +574,13 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
/// and after query is replaced, we use these parameters to substitute in the parameterized view query
|
||||
if (query_info.is_parameterized_view)
|
||||
{
|
||||
parameter_values = analyzeFunctionParamValues(query_ptr);
|
||||
view->setParameterValues(parameter_values);
|
||||
parameter_types = view->getParameterValues();
|
||||
query_info.parameterized_view_values = analyzeFunctionParamValues(query_ptr);
|
||||
parameter_types = view->getParameterTypes();
|
||||
}
|
||||
view->replaceWithSubquery(getSelectQuery(), view_table, metadata_snapshot, view->isParameterizedView());
|
||||
if (query_info.is_parameterized_view)
|
||||
{
|
||||
view->replaceQueryParametersIfParametrizedView(query_ptr);
|
||||
view->replaceQueryParametersIfParametrizedView(query_ptr, query_info.parameterized_view_values);
|
||||
}
|
||||
|
||||
}
|
||||
@ -595,7 +593,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
required_result_column_names,
|
||||
table_join,
|
||||
query_info.is_parameterized_view,
|
||||
parameter_values,
|
||||
query_info.parameterized_view_values,
|
||||
parameter_types);
|
||||
|
||||
|
||||
@ -747,7 +745,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
query_info.filter_asts.push_back(parallel_replicas_custom_filter_ast);
|
||||
}
|
||||
|
||||
source_header = storage_snapshot->getSampleBlockForColumns(required_columns, parameter_values);
|
||||
source_header = storage_snapshot->getSampleBlockForColumns(required_columns, query_info.parameterized_view_values);
|
||||
}
|
||||
|
||||
/// Calculate structure of the result.
|
||||
|
@ -254,6 +254,7 @@ struct SelectQueryInfo
|
||||
MergeTreeDataSelectAnalysisResultPtr merge_tree_select_result_ptr;
|
||||
|
||||
bool is_parameterized_view = false;
|
||||
NameToNameMap parameterized_view_values;
|
||||
|
||||
// If limit is not 0, that means it's a trivial limit query.
|
||||
UInt64 limit = 0;
|
||||
|
@ -37,6 +37,7 @@ namespace ErrorCodes
|
||||
extern const int LOGICAL_ERROR;
|
||||
}
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
@ -123,7 +124,7 @@ StorageView::StorageView(
|
||||
NormalizeSelectWithUnionQueryVisitor{data}.visit(description.inner_query);
|
||||
|
||||
is_parameterized_view = query.isParameterizedView();
|
||||
parameter_types = analyzeReceiveQueryParamsWithType(description.inner_query);
|
||||
view_parameter_types = analyzeReceiveQueryParamsWithType(description.inner_query);
|
||||
storage_metadata.setSelectQuery(description);
|
||||
setInMemoryMetadata(storage_metadata);
|
||||
}
|
||||
@ -172,7 +173,7 @@ void StorageView::read(
|
||||
query_plan.addStep(std::move(materializing));
|
||||
|
||||
/// And also convert to expected structure.
|
||||
const auto & expected_header = storage_snapshot->getSampleBlockForColumns(column_names, parameter_values);
|
||||
const auto & expected_header = storage_snapshot->getSampleBlockForColumns(column_names, query_info.parameterized_view_values);
|
||||
const auto & header = query_plan.getCurrentDataStream().header;
|
||||
|
||||
const auto * select_with_union = current_inner_query->as<ASTSelectWithUnionQuery>();
|
||||
@ -208,7 +209,7 @@ static ASTTableExpression * getFirstTableExpression(ASTSelectQuery & select_quer
|
||||
return select_element->table_expression->as<ASTTableExpression>();
|
||||
}
|
||||
|
||||
void StorageView::replaceQueryParametersIfParametrizedView(ASTPtr & outer_query)
|
||||
void StorageView::replaceQueryParametersIfParametrizedView(ASTPtr & outer_query, const NameToNameMap & parameter_values)
|
||||
{
|
||||
ReplaceQueryParameterVisitor visitor(parameter_values);
|
||||
visitor.visit(outer_query);
|
||||
@ -266,7 +267,8 @@ String StorageView::replaceQueryParameterWithValue(const String & column_name, c
|
||||
if ((pos = name.find(parameter.first)) != std::string::npos)
|
||||
{
|
||||
auto parameter_datatype_iterator = parameter_types.find(parameter.first);
|
||||
if (parameter_datatype_iterator != parameter_types.end())
|
||||
size_t parameter_end = pos + parameter.first.size();
|
||||
if (parameter_datatype_iterator != parameter_types.end() && name.size() >= parameter_end && (name[parameter_end] == ',' || name[parameter_end] == ')'))
|
||||
{
|
||||
String parameter_name("_CAST(" + parameter.second + ", '" + parameter_datatype_iterator->second + "')");
|
||||
name.replace(pos, parameter.first.size(), parameter_name);
|
||||
|
@ -35,7 +35,7 @@ public:
|
||||
size_t max_block_size,
|
||||
size_t num_streams) override;
|
||||
|
||||
void replaceQueryParametersIfParametrizedView(ASTPtr & outer_query);
|
||||
static void replaceQueryParametersIfParametrizedView(ASTPtr & outer_query, const NameToNameMap & parameter_values);
|
||||
|
||||
static void replaceWithSubquery(ASTSelectQuery & select_query, ASTPtr & view_name, const StorageMetadataPtr & metadata_snapshot, const bool parameterized_view)
|
||||
{
|
||||
@ -47,20 +47,14 @@ public:
|
||||
static String replaceQueryParameterWithValue (const String & column_name, const NameToNameMap & parameter_values, const NameToNameMap & parameter_types);
|
||||
static String replaceValueWithQueryParameter (const String & column_name, const NameToNameMap & parameter_values);
|
||||
|
||||
void setParameterValues (NameToNameMap parameter_values_)
|
||||
const NameToNameMap & getParameterTypes() const
|
||||
{
|
||||
parameter_values = parameter_values_;
|
||||
}
|
||||
|
||||
NameToNameMap getParameterValues() const
|
||||
{
|
||||
return parameter_types;
|
||||
return view_parameter_types;
|
||||
}
|
||||
|
||||
protected:
|
||||
bool is_parameterized_view;
|
||||
NameToNameMap parameter_values;
|
||||
NameToNameMap parameter_types;
|
||||
NameToNameMap view_parameter_types;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -35,3 +35,4 @@ ERROR
|
||||
10
|
||||
20
|
||||
10
|
||||
10
|
||||
|
@ -15,6 +15,7 @@ $CLICKHOUSE_CLIENT -q "DROP VIEW IF EXISTS test_02428_pv6"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW IF EXISTS test_02428_pv7"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW IF EXISTS test_02428_pv8"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW IF EXISTS test_02428_pv9"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW IF EXISTS test_02428_pv10"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW IF EXISTS test_02428_v1"
|
||||
$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS test_02428_Catalog"
|
||||
$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS ${CLICKHOUSE_TEST_UNIQUE_NAME}.pv1"
|
||||
@ -83,6 +84,9 @@ $CLICKHOUSE_CLIENT -q "SELECT * FROM test_02428_pv8(prices=[10,20])"
|
||||
$CLICKHOUSE_CLIENT -q "CREATE VIEW test_02428_pv9 AS SELECT Price FROM test_02428_Catalog WHERE Price IN (10,20) AND Quantity={quantity:UInt64} ORDER BY Price"
|
||||
$CLICKHOUSE_CLIENT -q "SELECT * FROM test_02428_pv9(quantity=3)"
|
||||
|
||||
$CLICKHOUSE_CLIENT -q "CREATE VIEW test_02428_pv10 AS SELECT Price FROM test_02428_Catalog WHERE Price={Pri:UInt64} ORDER BY Price"
|
||||
$CLICKHOUSE_CLIENT -q "SELECT * FROM test_02428_pv10(Pri=10)"
|
||||
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv1"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv2"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv3"
|
||||
@ -91,6 +95,7 @@ $CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv6"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv7"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv8"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv9"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_pv10"
|
||||
$CLICKHOUSE_CLIENT -q "DROP VIEW test_02428_v1"
|
||||
$CLICKHOUSE_CLIENT -q "DROP TABLE test_02428_Catalog"
|
||||
$CLICKHOUSE_CLIENT -q "DROP TABLE ${CLICKHOUSE_TEST_UNIQUE_NAME}.pv1"
|
||||
|
Loading…
Reference in New Issue
Block a user