[SYSTEMML-1840] Fix missing validation of transform* specifications Currently, all transform builtin functions parse the provided transform specification during runtime but not during initial compilation. This patch fixes this missing validation to give users immediate feedback on potential syntax errors, even before reading potentially large data.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/fcfbd3d2 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/fcfbd3d2 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/fcfbd3d2 Branch: refs/heads/master Commit: fcfbd3d2473a555b139371ebe4d49714d5dabe48 Parents: 89632b5 Author: Matthias Boehm <mboe...@gmail.com> Authored: Mon Aug 14 23:10:38 2017 -0700 Committer: Matthias Boehm <mboe...@gmail.com> Committed: Tue Aug 15 12:48:29 2017 -0700 ---------------------------------------------------------------------- .../ParameterizedBuiltinFunctionExpression.java | 26 +++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/fcfbd3d2/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java index f90b7ef..2768cc1 100644 --- a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java +++ b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java @@ -26,6 +26,7 @@ import java.util.HashSet; import org.apache.sysml.hops.Hop.ParamBuiltinOp; import org.apache.sysml.parser.LanguageException.LanguageErrorCodes; +import org.apache.wink.json4j.JSONObject; public class ParameterizedBuiltinFunctionExpression extends DataIdentifier @@ -288,6 +289,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier //validate specification checkDataValueType("transformapply", TF_FN_PARAM_SPEC, DataType.SCALAR, ValueType.STRING, conditional); + validateTransformSpec(TF_FN_PARAM_SPEC, conditional); //set output dimensions output.setDataType(DataType.MATRIX); @@ -304,6 +306,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier //validate specification checkDataValueType("transformdecode", TF_FN_PARAM_SPEC, DataType.SCALAR, ValueType.STRING, conditional); + validateTransformSpec(TF_FN_PARAM_SPEC, conditional); //set output dimensions output.setDataType(DataType.FRAME); @@ -316,6 +319,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier { //validate specification checkDataValueType("transformmeta", TF_FN_PARAM_SPEC, DataType.SCALAR, ValueType.STRING, conditional); + validateTransformSpec(TF_FN_PARAM_SPEC, conditional); //validate meta data path checkDataValueType("transformmeta", TF_FN_PARAM_MTD, DataType.SCALAR, ValueType.STRING, conditional); @@ -334,6 +338,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier //validate specification checkDataValueType("transformencode", TF_FN_PARAM_SPEC, DataType.SCALAR, ValueType.STRING, conditional); + validateTransformSpec(TF_FN_PARAM_SPEC, conditional); //set output dimensions output1.setDataType(DataType.MATRIX); @@ -344,6 +349,20 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier output2.setDimensions(-1, -1); } + private void validateTransformSpec(String pname, boolean conditional) throws LanguageException { + Expression data = getVarParam(pname); + if( data instanceof StringIdentifier ) { + try { + StringIdentifier spec = (StringIdentifier)data; + new JSONObject(spec.getValue()); + } + catch(Exception ex) { + raiseValidateError("Transform specification parsing issue: ", + conditional, ex.getMessage()); + } + } + } + private void validateReplace(DataIdentifier output, boolean conditional) throws LanguageException { //check existence and correctness of arguments Expression target = getVarParam("target"); @@ -721,11 +740,6 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier @Override public boolean multipleReturns() { - switch(_opcode) { - case TRANSFORMENCODE: - return true; - default: - return false; - } + return (_opcode == ParameterizedBuiltinFunctionOp.TRANSFORMENCODE); } }