PHOENIX-4294 Allow scalar function to declare that it's not thread safe
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/e2351ef4 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/e2351ef4 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/e2351ef4 Branch: refs/heads/4.x-HBase-1.1 Commit: e2351ef4a23ef63747fede4b80859d7b2f7f34f4 Parents: 7d2c1ed Author: James Taylor <jtay...@salesforce.com> Authored: Wed Oct 18 09:28:31 2017 -0700 Committer: James Taylor <jtay...@salesforce.com> Committed: Wed Nov 15 10:39:19 2017 -0800 ---------------------------------------------------------------------- .../apache/phoenix/expression/function/ScalarFunction.java | 9 +++++++++ .../phoenix/expression/visitor/CloneExpressionVisitor.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/e2351ef4/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ScalarFunction.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ScalarFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ScalarFunction.java index 4f44cde..2a5fe44 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ScalarFunction.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/ScalarFunction.java @@ -87,4 +87,13 @@ public abstract class ScalarFunction extends FunctionExpression { public KeyPart newKeyPart(KeyPart childPart) { return null; } + + /** + * Used to determine if the same ScalarFunction instance may be + * used by multiple threads. + * @return true if function is thread safe and false otherwise. + */ + public boolean isThreadSafe() { + return true; + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/e2351ef4/phoenix-core/src/main/java/org/apache/phoenix/expression/visitor/CloneExpressionVisitor.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/visitor/CloneExpressionVisitor.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/visitor/CloneExpressionVisitor.java index e47fb64..c6d7c9e 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/expression/visitor/CloneExpressionVisitor.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/visitor/CloneExpressionVisitor.java @@ -110,7 +110,7 @@ public abstract class CloneExpressionVisitor extends TraverseAllExpressionVisito @Override public Expression visitLeave(ScalarFunction node, List<Expression> l) { - return isCloneNode(node, l) ? node.clone(l) : node; + return isCloneNode(node, l) || !node.isThreadSafe() ? node.clone(l) : node; } public Expression visitLeave(UDFExpression node, List<Expression> l) {