This is an automated email from the ASF dual-hosted git repository.
htowaileb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new e5c0d8d [ASTERIXDB-2625][OTH] Proper error message for invalid uuid
e5c0d8d is described below
commit e5c0d8d65ff7504f304c8ed0fa5ff11ad84fd27a
Author: Hussain Towaileb <[email protected]>
AuthorDate: Wed Sep 4 18:13:15 2019 +0300
[ASTERIXDB-2625][OTH] Proper error message for invalid uuid
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Returns a proper message for invalid uuid. (incorrect uuid
length)
- Add a setter to allow setting the SourceLocation to an
already created exception.
Change-Id: I2cd836afcb35955e23e6cba7da5e17917d0705b0
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3537
Contrib: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Integration-Tests: Jenkins <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>
---
.../constructor/{ => uuid}/uuid_01/uuid_01.1.ddl.sqlpp | 0
.../{ => uuid}/uuid_01/uuid_01.2.update.sqlpp | 0
.../{ => uuid}/uuid_01/uuid_01.3.query.sqlpp | 0
.../uuid_02/uuid_02.1.query.sqlpp} | 4 +---
.../uuid_03/uuid_03.1.query.sqlpp} | 1 +
.../constructor/{ => uuid}/uuid_01/uuid_01.1.adm | 0
.../src/test/resources/runtimets/testsuite_sqlpp.xml | 14 +++++++++++++-
.../java/org/apache/asterix/om/base/AMutableUUID.java | 17 ++++++++++++-----
.../AUUIDFromStringConstructorDescriptor.java | 18 ++++--------------
.../hyracks/api/exceptions/HyracksException.java | 6 +++++-
10 files changed, 36 insertions(+), 24 deletions(-)
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.1.ddl.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.1.ddl.sqlpp
similarity index 100%
copy from
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.1.ddl.sqlpp
copy to
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.1.ddl.sqlpp
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.2.update.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.2.update.sqlpp
similarity index 100%
copy from
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.2.update.sqlpp
copy to
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.2.update.sqlpp
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.3.query.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.3.query.sqlpp
similarity index 100%
rename from
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.3.query.sqlpp
rename to
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.3.query.sqlpp
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.1.ddl.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp
similarity index 92%
rename from
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.1.ddl.sqlpp
rename to
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp
index 21479a2..a11fd8b 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.1.ddl.sqlpp
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp
@@ -17,6 +17,4 @@
* under the License.
*/
-drop dataverse test if exists;
-create dataverse test;
-
+uuid('02a199ca-bf58-412e-bd9f-60a0c975a8a-'); // Invalid format
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.2.update.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
similarity index 96%
rename from
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.2.update.sqlpp
rename to
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
index bd244d0..a9fb88e 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid_01/uuid_01.2.update.sqlpp
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
@@ -17,3 +17,4 @@
* under the License.
*/
+uuid('12345'); // Invalid length
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid_01/uuid_01.1.adm
b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid/uuid_01/uuid_01.1.adm
similarity index 100%
rename from
asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid_01/uuid_01.1.adm
rename to
asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid/uuid_01/uuid_01.1.adm
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 91c86f2..a3c9508 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -3344,11 +3344,23 @@
<output-dir compare="Text">time_01</output-dir>
</compilation-unit>
</test-case>
- <test-case FilePath="constructor">
+ <test-case FilePath="constructor/uuid">
<compilation-unit name="uuid_01">
<output-dir compare="Text">uuid_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor/uuid">
+ <compilation-unit name="uuid_02">
+ <output-dir compare="Text">uuid_02</output-dir>
+ <expected-error>Invalid format for uuid in
02a199ca-bf58-412e-bd9f-60a0c975a8a-</expected-error>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="constructor/uuid">
+ <compilation-unit name="uuid_03">
+ <output-dir compare="Text">uuid_03</output-dir>
+ <expected-error>Invalid format for uuid in 12345</expected-error>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="custord">
<!--
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
index 9a097dc..e5e810a 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
@@ -19,7 +19,10 @@
package org.apache.asterix.om.base;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.exceptions.RuntimeDataException;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.util.string.UTF8StringUtil;
public class AMutableUUID extends AUUID {
@@ -71,9 +74,14 @@ public class AMutableUUID extends AUUID {
// Calculate a long value from a hex string.
private static void decodeBytesFromHex(byte[] hexArray, int
hexArrayOffset, byte[] outputArray, int outputOffset,
int length) throws HyracksDataException {
- for (int i = hexArrayOffset; i < hexArrayOffset + length;) {
- int hi = transformHexCharToInt(hexArray[i++]);
- outputArray[outputOffset++] = (byte) (hi << 4 |
transformHexCharToInt(hexArray[i++]));
+ try {
+ for (int i = hexArrayOffset; i < hexArrayOffset + length;) {
+ int hi = transformHexCharToInt(hexArray[i++]);
+ outputArray[outputOffset++] = (byte) (hi << 4 |
transformHexCharToInt(hexArray[i++]));
+ }
+ } catch (Exception ex) {
+ // Can also happen in case of invalid length, out of bound
exception
+ throw new RuntimeDataException(ErrorCode.INVALID_FORMAT, "uuid",
UTF8StringUtil.toString(hexArray, 1));
}
}
@@ -119,8 +127,7 @@ public class AMutableUUID extends AUUID {
case 'F':
return 15;
default:
- throw new HyracksDataException("This is not a correct UUID
value.");
+ throw new RuntimeDataException(ErrorCode.INVALID_FORMAT);
}
}
-
}
\ No newline at end of file
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
index bfc7177..6693877 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
@@ -19,20 +19,17 @@
package org.apache.asterix.runtime.evaluators.constructors;
import java.io.DataOutput;
-import java.io.IOException;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AMutableUUID;
import org.apache.asterix.om.base.AUUID;
import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
import
org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
@@ -55,12 +52,7 @@ import
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class AUUIDFromStringConstructorDescriptor extends
AbstractScalarFunctionDynamicDescriptor {
private static final long serialVersionUID = 1L;
- public static final IFunctionDescriptorFactory FACTORY = new
IFunctionDescriptorFactory() {
- @Override
- public IFunctionDescriptor createFunctionDescriptor() {
- return new AUUIDFromStringConstructorDescriptor();
- }
- };
+ public static final IFunctionDescriptorFactory FACTORY =
AUUIDFromStringConstructorDescriptor::new;
@Override
public IScalarEvaluatorFactory createEvaluatorFactory(final
IScalarEvaluatorFactory[] args) {
@@ -111,15 +103,13 @@ public class AUUIDFromStringConstructorDescriptor extends
AbstractScalarFunction
throw new TypeMismatchException(sourceLoc,
getIdentifier(), 0, tt,
ATypeTag.SERIALIZED_STRING_TYPE_TAG);
}
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc,
getIdentifier(), e,
- ATypeTag.SERIALIZED_UUID_TYPE_TAG);
+ } catch (HyracksDataException e) {
+ e.setSourceLocation(sourceLoc);
+ throw e;
}
}
-
};
}
-
};
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksException.java
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksException.java
index 69601cf..89e46de 100644
---
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksException.java
+++
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksException.java
@@ -32,7 +32,7 @@ public class HyracksException extends IOException implements
IFormattedException
private final int errorCode;
private final Serializable[] params;
private final String nodeId;
- private final SourceLocation sourceLoc;
+ private SourceLocation sourceLoc;
private transient volatile String msgCache;
public static HyracksException create(Throwable cause) {
@@ -142,6 +142,10 @@ public class HyracksException extends IOException
implements IFormattedException
return sourceLoc;
}
+ public void setSourceLocation(SourceLocation sourceLocation) {
+ this.sourceLoc = sourceLocation;
+ }
+
@Override
public String getMessage() {
if (msgCache == null) {