make the uuid evaluate once per statement
Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/9312bd20 Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/9312bd20 Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/9312bd20 Branch: refs/heads/master Commit: 9312bd20c952bc8f0a74141400a3a9e30c053dc5 Parents: f59119c Author: Liu Ming <ovis_p...@sina.com> Authored: Fri Feb 16 22:51:10 2018 +0000 Committer: Liu Ming <ovis_p...@sina.com> Committed: Fri Feb 16 22:51:10 2018 +0000 ---------------------------------------------------------------------- core/sql/common/OperTypeEnum.h | 5 ++--- core/sql/generator/GenExpGenerator.cpp | 2 ++ core/sql/optimizer/BindItemExpr.cpp | 30 ++++++++++++++++++----------- core/sql/optimizer/GroupAttr.cpp | 2 ++ core/sql/optimizer/ItemExpr.cpp | 13 +++++++++++++ core/sql/optimizer/ItemFunc.h | 6 ++++++ 6 files changed, 44 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafodion/blob/9312bd20/core/sql/common/OperTypeEnum.h ---------------------------------------------------------------------- diff --git a/core/sql/common/OperTypeEnum.h b/core/sql/common/OperTypeEnum.h index 293a372..c70310f 100644 --- a/core/sql/common/OperTypeEnum.h +++ b/core/sql/common/OperTypeEnum.h @@ -472,9 +472,8 @@ enum OperatorTypeEnum { // Regular Expression ITM_REGEXP = 2178, ITM_UNIX_TIMESTAMP = 2179, - ITM_UUID_SHORT = 2180, - ITM_SLEEP = 2181, - ITM_UNIQUE_SHORT_ID = 2182, + ITM_SLEEP = 2180, + ITM_UNIQUE_SHORT_ID = 2181, // numeric functions ITM_ABS = 2200, http://git-wip-us.apache.org/repos/asf/trafodion/blob/9312bd20/core/sql/generator/GenExpGenerator.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenExpGenerator.cpp b/core/sql/generator/GenExpGenerator.cpp index 1b038a5..f2651c4 100644 --- a/core/sql/generator/GenExpGenerator.cpp +++ b/core/sql/generator/GenExpGenerator.cpp @@ -3701,6 +3701,8 @@ short ExpGenerator::generateInputExpr(const ValueIdList &val_id_list, if ((item_expr->isAUserSuppliedInput()) || //evaluate once functions (item_expr->getOperatorType() == ITM_CURRENT_TIMESTAMP) || (item_expr->getOperatorType() == ITM_UNIX_TIMESTAMP) || + (item_expr->getOperatorType() == ITM_UNIQUE_ID) || + (item_expr->getOperatorType() == ITM_UNIQUE_SHORT_ID) || (item_expr->getOperatorType() == ITM_CURRENT_USER) || (item_expr->getOperatorType() == ITM_SESSION_USER) || (item_expr->getOperatorType() == ITM_EXEC_COUNT) || http://git-wip-us.apache.org/repos/asf/trafodion/blob/9312bd20/core/sql/optimizer/BindItemExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/BindItemExpr.cpp b/core/sql/optimizer/BindItemExpr.cpp index ee687e4..c617d17 100644 --- a/core/sql/optimizer/BindItemExpr.cpp +++ b/core/sql/optimizer/BindItemExpr.cpp @@ -3199,6 +3199,23 @@ ItemExpr *BuiltinFunction::bindNode(BindWA *bindWA) { break; } + case ITM_UNIQUE_ID: + case ITM_UNIQUE_SHORT_ID: + { + if (nodeIsBound()) + return getValueId().getItemExpr(); + const NAType *type = synthTypeWithCollateClause(bindWA); + if (!type) return this; + + ItemExpr* ie = ItemExpr::bindUserInput(bindWA,type,getText()); + if (bindWA->errStatus()) + return this; + + // add this value id to BindWA's input function list. + bindWA->inputFunction().insert(getValueId()); + return ie; + } + break; case ITM_NULLIFZERO: { // binder has already verified that child is numeric @@ -3473,6 +3490,7 @@ ItemExpr *BuiltinFunction::bindNode(BindWA *bindWA) // expression getting translated correctly. setReplacementExpr(ie); + return ie; } @@ -12013,17 +12031,7 @@ ItemExpr *ZZZBinderFunction::bindNode(BindWA *bindWA) } } break; -/* - case ITM_SLEEP: - { - ItemExpr * tempBoundTree = child(0)->castToItemExpr()->bindNode(bindWA); - if (bindWA->errStatus()) - return this; - buf[0] = 0; - parseTree = child(0); - } - break; -*/ + case ITM_TO_NUMBER: { ItemExpr *tempBoundTree = child(0)->castToItemExpr()->bindNode(bindWA); http://git-wip-us.apache.org/repos/asf/trafodion/blob/9312bd20/core/sql/optimizer/GroupAttr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/GroupAttr.cpp b/core/sql/optimizer/GroupAttr.cpp index eb6a87b..3ebe690 100644 --- a/core/sql/optimizer/GroupAttr.cpp +++ b/core/sql/optimizer/GroupAttr.cpp @@ -1793,6 +1793,8 @@ void GroupAttributes::resolveCharacteristicInputs(const ValueIdSet& externalInpu ItemExpr * vidExpr = vid.getItemExpr(); if ((vidExpr->getOperatorType() == ITM_CURRENT_USER) || (vidExpr->getOperatorType() == ITM_CURRENT_TIMESTAMP) || + (vidExpr->getOperatorType() == ITM_UNIQUE_SHORT_ID) || + (vidExpr->getOperatorType() == ITM_UNIQUE_ID) || (vidExpr->getOperatorType() == ITM_UNIX_TIMESTAMP)) currentConstants += vid; http://git-wip-us.apache.org/repos/asf/trafodion/blob/9312bd20/core/sql/optimizer/ItemExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ItemExpr.cpp b/core/sql/optimizer/ItemExpr.cpp index b58aa5e..a2e56eb 100644 --- a/core/sql/optimizer/ItemExpr.cpp +++ b/core/sql/optimizer/ItemExpr.cpp @@ -872,6 +872,8 @@ NABoolean ItemExpr::doesExprEvaluateToConstant(NABoolean strict, case ITM_DYN_PARAM: case ITM_CACHE_PARAM: + case ITM_UNIQUE_ID: + case ITM_UNIQUE_SHORT_ID: case ITM_CURRENT_USER: case ITM_SESSION_USER: case ITM_CURRENT_TIMESTAMP: @@ -969,6 +971,8 @@ NABoolean ItemExpr::referencesAHostVar() const case ITM_CURRENT_TIMESTAMP: case ITM_GET_TRIGGERS_STATUS: case ITM_UNIQUE_EXECUTE_ID: + case ITM_UNIQUE_SHORT_ID: + case ITM_UNIQUE_ID: case ITM_CURR_TRANSID: return TRUE; @@ -7368,6 +7372,15 @@ Int32 BuiltinFunction::getArity() const return getNumChildren(); } +NABoolean BuiltinFunction::isAUserSuppliedInput() const +{ + if(getOperatorType() == ITM_UNIQUE_ID || + getOperatorType() == ITM_UNIQUE_SHORT_ID ) + return TRUE; + else + return FALSE; +} + // ----------------------------------------------------------------------- // BuiltinFunction::isCovered() // ----------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafodion/blob/9312bd20/core/sql/optimizer/ItemFunc.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ItemFunc.h b/core/sql/optimizer/ItemFunc.h index 09f4652..7c67931 100644 --- a/core/sql/optimizer/ItemFunc.h +++ b/core/sql/optimizer/ItemFunc.h @@ -680,6 +680,12 @@ public: // a virtual function for performing name binding within the query tree virtual ItemExpr * bindNode(BindWA *bindWA); + // A method that returns for "user-given" input values. + // These are values that are either constants, host variables, parameters, + // or even values that are sensed from the environment such as + // current time, the user name, etcetera. + virtual NABoolean isAUserSuppliedInput() const; + // Each operator supports a (virtual) method for transforming its // scalar expressions to a canonical form virtual void transformNode(NormWA & normWARef,