| /********************************************************************** |
| // @@@ START COPYRIGHT @@@ |
| // |
| // 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. |
| // |
| // @@@ END COPYRIGHT @@@ |
| **********************************************************************/ |
| #ifndef ITEMFUNCUDF_H |
| #define ITEMFUNCUDF_H |
| |
| // This code should be moved into ItemFunc.h |
| |
| #include "IntervalType.h" |
| #include "CharType.h" |
| #include "ItemExpr.h" |
| #include "NATable.h" |
| #include "exp_like.h" |
| #include "QRExprElement.h" |
| #include "RoutineDesc.h" |
| |
| // ----------------------------------------------------------------------- |
| // forward references |
| // ----------------------------------------------------------------------- |
| class CharType; |
| class DisjunctArray; |
| class Generator; |
| class RangePartitioningFunction; |
| class IntegerList; |
| class NARoutine; |
| class ItemList; |
| class RoutineDesc; |
| |
| // ----------------------------------------------------------------------- |
| // User-defined functions (e. g. stored procedures), new functions may |
| // be defined at run time |
| // ----------------------------------------------------------------------- |
| class UDFunction : public Function |
| { |
| // ITM_USER_DEF_FUNCTION |
| public: |
| UDFunction(const ComObjectName &functionName, |
| const LIST(ItemExpr *) &children, |
| CollHeap *h) : |
| Function(ITM_USER_DEF_FUNCTION, children, h), |
| functionName_(functionName), functionNamePos_(0), |
| udfDesc_(0), hasSubquery_(FALSE), heap_(h) |
| { |
| // we do allow null input parameters |
| allowsSQLnullArg() = TRUE; |
| } |
| |
| UDFunction(const ComObjectName &functionName, |
| Lng32 argCount, CollHeap *h) : |
| Function(ITM_USER_DEF_FUNCTION, h, argCount), |
| functionName_(functionName), functionNamePos_(0), |
| udfDesc_(0), hasSubquery_(FALSE), heap_(h) |
| { |
| // we do allow null input parameters |
| allowsSQLnullArg() = TRUE; |
| } |
| |
| // virtual destructor |
| virtual ~UDFunction(); |
| |
| // Function name position within command line. This is used for rewriting the |
| // UDF name to fully qualified for MVS. |
| const Int32 getNamePosOfUdfInQuery() const { return functionNamePos_; } |
| void setNamePosOfUdfInQuery(Int32 pos) { functionNamePos_ = pos; } |
| |
| // Routine descriptor |
| const RoutineDesc *getRoutineDesc() const { return udfDesc_; } |
| void setRoutineDesc(RoutineDesc *rdesc) { udfDesc_ = rdesc; } |
| |
| // append an ascii-version of ItemExpr into cachewa.qryText_ |
| virtual void generateCacheKey(CacheWA& cwa) const; |
| |
| // is the UDFunction expression cacheable. |
| // Only makes sense after it has been bound. |
| virtual NABoolean isCacheableExpr(CacheWA& cwa); |
| |
| // is any literal in this expr safely coercible to its target type? |
| virtual NABoolean isSafelyCoercible(CacheWA& cwa) const; |
| |
| // replace any constant parameters so that we can reuse the plan |
| virtual ItemExpr* normalizeForCache(CacheWA& cwa, BindWA& bindWA); |
| |
| virtual ExprValueId & operator[] (Lng32 ix); |
| virtual const ExprValueId & operator[] (Lng32 ix) const; |
| // get the degree of this node (it depends on the type of the operator) |
| virtual Int32 getArity() const; |
| |
| virtual HashValue topHash(); |
| virtual NABoolean duplicateMatch(const ItemExpr & other) const; |
| virtual ItemExpr * copyTopNode(ItemExpr *derivedNode = NULL, |
| CollHeap* outHeap = 0); |
| |
| // Does semantic checks and binds the function. |
| virtual ItemExpr * bindNode(BindWA * bindWA); |
| |
| virtual void transformNode(NormWA & normWARef, |
| ExprValueId & locationOfPointerToMe, |
| ExprGroupId & introduceSemiJoinHere, |
| const ValueIdSet & externalInputs); |
| |
| virtual void transformToRelExpr(NormWA & normWARef, |
| ExprValueId & locationOfPointerToMe, |
| ExprGroupId & introduceSemiJoinHere, |
| const ValueIdSet & externalInputs); |
| |
| virtual ItemExpr * normalizeNode(NormWA & normWARef); |
| |
| virtual ItemExpr *containsUDF(); |
| virtual NABoolean containsIsolatedUDFunction(); |
| |
| virtual const NAType *synthesizeType(); |
| |
| // method to do code generation |
| virtual short codeGen(Generator*); |
| |
| // get a printable string that identifies the operator |
| virtual const NAString getText() const; |
| ComObjectName &getFunctionName() { return functionName_; } |
| virtual void unparse(NAString &result, |
| PhaseEnum phase = OPTIMIZER_PHASE, |
| UnparseFormatEnum form = USER_FORMAT, |
| TableDesc * tabId = NULL) const; |
| |
| // output degree functions to handle multi-valued UDFs. |
| // Returns the number of outputs and the ItemExpr for each. |
| virtual Int32 getOutputDegree(); |
| virtual ItemExpr *getOutputItem(UInt32 i); |
| |
| private: |
| // Copy constructor and assignment operator not written and not allowed. |
| UDFunction (const UDFunction &, CollHeap * h=0); |
| UDFunction &operator=(UDFunction &other); |
| |
| inline const NARoutine *getRoutine() |
| { if (udfDesc_) return udfDesc_->getNARoutine(); else return NULL; } |
| inline const NARoutine *getAction() |
| { if (udfDesc_) return udfDesc_->getActionNARoutine(); else return NULL; } |
| |
| void setInOrOutParam (RoutineDesc *routine, |
| ItemExpr *argument, |
| Int32 position, |
| ComColumnDirection paramMode, |
| ItemExprList *inParams, |
| BindWA *bindWA); |
| |
| CollHeap *heap_; |
| Int32 functionNamePos_; |
| ComObjectName functionName_; |
| NAString actionName_; // Must be a string: MX Object names can't have '$' as first char. |
| RoutineDesc *udfDesc_; |
| |
| NABoolean hasSubquery_; |
| ValueIdSet inputVars_; |
| ValueIdSet outputVars_; |
| }; |
| |
| |
| #endif /* ITEMFUNCUDF_H */ |