Skip to content

Commit

Permalink
Fixed CORE-5314 - UDFs declared with large varchars take excessive ti…
Browse files Browse the repository at this point in the history
…me to execute.
  • Loading branch information
asfernandes committed Oct 17, 2016
1 parent 60c2339 commit 13fd2f7
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 6 deletions.
13 changes: 10 additions & 3 deletions src/dsql/ExprNodes.cpp
Expand Up @@ -11062,7 +11062,7 @@ ValueExprNode* UdfCallNode::pass2(thread_db* tdbb, CompilerScratch* csb)
dsc desc;
getDesc(tdbb, csb, &desc);

impureOffset = CMP_impure(csb, sizeof(impure_value));
impureOffset = CMP_impure(csb, sizeof(Impure));

if (function->isDefined() && !function->fun_entrypoint)
{
Expand All @@ -11084,7 +11084,8 @@ ValueExprNode* UdfCallNode::pass2(thread_db* tdbb, CompilerScratch* csb)
dsc* UdfCallNode::execute(thread_db* tdbb, jrd_req* request) const
{
UCHAR* impure = request->getImpure<UCHAR>(impureOffset);
impure_value* value = request->getImpure<impure_value>(impureOffset);
Impure* impureArea = request->getImpure<Impure>(impureOffset);
impure_value* value = &impureArea->value;

USHORT& invariantFlags = value->vlu_flags;

Expand Down Expand Up @@ -11149,7 +11150,13 @@ dsc* UdfCallNode::execute(thread_db* tdbb, jrd_req* request) const
else
value->vlu_desc.dsc_address = (UCHAR*) &value->vlu_misc;

FUN_evaluate(tdbb, function, args->items, value);
if (!impureArea->temp)
{
impureArea->temp =
FB_NEW_POOL(*tdbb->getDefaultPool()) Array<UCHAR>(*tdbb->getDefaultPool());
}

FUN_evaluate(tdbb, function, args->items, value, *impureArea->temp);
}
else
{
Expand Down
7 changes: 7 additions & 0 deletions src/dsql/ExprNodes.h
Expand Up @@ -1488,6 +1488,13 @@ class TrimNode : public TypedNode<ValueExprNode, ExprNode::TYPE_TRIM>

class UdfCallNode : public TypedNode<ValueExprNode, ExprNode::TYPE_UDF_CALL>
{
private:
struct Impure
{
impure_value value; // must be first
Firebird::Array<UCHAR>* temp;
};

public:
explicit UdfCallNode(MemoryPool& pool, const Firebird::QualifiedName& aName,
ValueListNode* aArgs = NULL);
Expand Down
3 changes: 1 addition & 2 deletions src/jrd/fun.epp
Expand Up @@ -303,7 +303,7 @@ static bool private_move(Jrd::thread_db* tdbb, dsc* from, dsc* to);


void FUN_evaluate(thread_db* tdbb, const Function* function, const NestValueArray& node,
impure_value* value)
impure_value* value, Array<UCHAR>& temp)
{
/**************************************
*
Expand Down Expand Up @@ -370,7 +370,6 @@ void FUN_evaluate(thread_db* tdbb, const Function* function, const NestValueArra
try {

UDF_ARG args[MAX_UDF_ARGUMENTS + 1];
HalfStaticArray<UCHAR, 800> temp;

// Start by constructing argument list
UCHAR* temp_ptr = temp.getBuffer(function->fun_temp_length + FB_DOUBLE_ALIGN);
Expand Down
2 changes: 1 addition & 1 deletion src/jrd/fun_proto.h
Expand Up @@ -37,7 +37,7 @@ class IbUtil
};

void FUN_evaluate(Jrd::thread_db*, const Jrd::Function*, const Jrd::NestValueArray&,
Jrd::impure_value*);
Jrd::impure_value*, Firebird::Array<UCHAR>& temp);


#endif // JRD_FUN_PROTO_H

0 comments on commit 13fd2f7

Please sign in to comment.