blob: 5dc6a734b9a1bd25bcf7bb59c6efeff336709850 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "LeadLagParser.h"
#include <DataTypes/DataTypeNullable.h>
#include <Interpreters/ActionsDAG.h>
#include <Common/BlockTypeUtils.h>
#include <Common/CHUtil.h>
namespace local_engine
{
using namespace DB;
DB::ActionsDAG::NodeRawConstPtrs
LeadParser::parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAG & actions_dag) const
{
DB::ActionsDAG::NodeRawConstPtrs args;
const auto & arg0 = func_info.arguments[0].value();
const auto & arg1 = func_info.arguments[1].value();
/// The 3rd arg is default value
/// when it is set to null, the 1st arg must be nullable
const auto & arg2 = func_info.arguments[2].value();
const auto * arg0_col = parseExpression(actions_dag, arg0);
auto arg0_col_name = arg0_col->result_name;
auto arg0_col_type= arg0_col->result_type;
const DB::ActionsDAG::Node * node = nullptr;
if (arg2.has_literal() && arg2.literal().has_null() && !arg0_col_type->isNullable())
{
node = ActionsDAGUtil::convertNodeType(
actions_dag,
arg0_col,
DB::makeNullable(arg0_col_type),
arg0_col_name);
actions_dag.addOrReplaceInOutputs(*node);
args.push_back(node);
}
else
{
args.push_back(arg0_col);
}
node = parseExpression(actions_dag, arg1);
node = ActionsDAGUtil::convertNodeType(actions_dag, node, BIGINT());
actions_dag.addOrReplaceInOutputs(*node);
args.push_back(node);
if (arg2.has_literal() && !arg2.literal().has_null())
{
node = parseExpression(actions_dag, arg2);
actions_dag.addOrReplaceInOutputs(*node);
args.push_back(node);
}
return args;
}
AggregateFunctionParserRegister<LeadParser> lead_register;
DB::ActionsDAG::NodeRawConstPtrs
LagParser::parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAG & actions_dag) const
{
DB::ActionsDAG::NodeRawConstPtrs args;
const auto & arg0 = func_info.arguments[0].value();
const auto & arg1 = func_info.arguments[1].value();
/// The 3rd arg is default value
/// when it is set to null, the 1st arg must be nullable
const auto & arg2 = func_info.arguments[2].value();
const auto * arg0_col = parseExpression(actions_dag, arg0);
auto arg0_col_name = arg0_col->result_name;
auto arg0_col_type = arg0_col->result_type;
const DB::ActionsDAG::Node * node = nullptr;
if (arg2.has_literal() && arg2.literal().has_null() && !arg0_col->result_type->isNullable())
{
node = ActionsDAGUtil::convertNodeType(
actions_dag,
arg0_col,
makeNullable(arg0_col_type),
arg0_col_name);
actions_dag.addOrReplaceInOutputs(*node);
args.push_back(node);
}
else
{
args.push_back(arg0_col);
}
// lag's offset is negative
auto literal_result = parseLiteral(arg1.literal());
assert(literal_result.second.safeGet<Int32>() < 0);
auto real_field = 0 - literal_result.second.safeGet<Int32>();
node = &actions_dag.addColumn(ColumnWithTypeAndName(
literal_result.first->createColumnConst(1, real_field), literal_result.first, getUniqueName(toString(real_field))));
node = ActionsDAGUtil::convertNodeType(actions_dag, node, BIGINT());
actions_dag.addOrReplaceInOutputs(*node);
args.push_back(node);
if (arg2.has_literal() && !arg2.literal().has_null())
{
node = parseExpression(actions_dag, arg2);
actions_dag.addOrReplaceInOutputs(*node);
args.push_back(node);
}
return args;
}
AggregateFunctionParserRegister<LagParser> lag_register;
}