throw exception for unsupported escape sequences
diff --git a/asterix-app/data/escapes-err-1.adm b/asterix-app/data/escapes-err-1.adm
new file mode 100644
index 0000000..5b70bc7
--- /dev/null
+++ b/asterix-app/data/escapes-err-1.adm
@@ -0,0 +1 @@
+{ "id": "a\bc" }
diff --git a/asterix-app/data/escapes.adm b/asterix-app/data/escapes.adm
index d8193c1..0fd9f20c 100644
--- a/asterix-app/data/escapes.adm
+++ b/asterix-app/data/escapes.adm
@@ -1,3 +1,5 @@
{ "id": "abc" }
{ "id": "\"abc\"" }
{ "id": "\\abc\\" }
+{ "id": "\\\\abc" }
+{ "id": "\\\"abc" }
diff --git a/asterix-app/src/test/resources/runtimets/queries/load/escapes-err-1/escapes-err-1.1.ddl.aql b/asterix-app/src/test/resources/runtimets/queries/load/escapes-err-1/escapes-err-1.1.ddl.aql
new file mode 100644
index 0000000..28a27d1
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/load/escapes-err-1/escapes-err-1.1.ddl.aql
@@ -0,0 +1,10 @@
+drop dataverse TestDataverse if exists;
+create dataverse TestDataverse;
+use dataverse TestDataverse;
+
+create type TestType as {
+ id: string
+}
+
+create dataset TestSet(TestType)
+primary key id;
diff --git a/asterix-app/src/test/resources/runtimets/queries/load/escapes-err-1/escapes-err-1.2.update.aql b/asterix-app/src/test/resources/runtimets/queries/load/escapes-err-1/escapes-err-1.2.update.aql
new file mode 100644
index 0000000..93a67f5
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/load/escapes-err-1/escapes-err-1.2.update.aql
@@ -0,0 +1,3 @@
+use dataverse TestDataverse;
+
+load dataset TestSet using localfs (("path"="nc1://data/escapes-err-1.adm"),("format"="adm"));
diff --git a/asterix-app/src/test/resources/runtimets/results/load/escapes/escapes.1.adm b/asterix-app/src/test/resources/runtimets/results/load/escapes/escapes.1.adm
index 68d1632..adea811 100644
--- a/asterix-app/src/test/resources/runtimets/results/load/escapes/escapes.1.adm
+++ b/asterix-app/src/test/resources/runtimets/results/load/escapes/escapes.1.adm
@@ -1,3 +1,5 @@
{ "id": "\"abc\"" }
+{ "id": "\\\"abc" }
+{ "id": "\\\\abc" }
{ "id": "\\abc\\" }
{ "id": "abc" }
diff --git a/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterix-app/src/test/resources/runtimets/testsuite.xml
index 880c41f..d1297a4 100644
--- a/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -4750,6 +4750,12 @@
<output-dir compare="Text">escapes</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="load">
+ <compilation-unit name="escapes-err-1">
+ <output-dir compare="Text">none</output-dir>
+ <expected-error>edu.uci.ics.hyracks.api.exceptions.HyracksException</expected-error>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="user-defined-functions">
<compilation-unit name="query-issue244">
<output-dir compare="Text">query-issue244</output-dir>
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
index ac92355..012c5e9 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
@@ -372,8 +372,27 @@
}
}
- private String replaceEscapes(String tokenImage) {
- return tokenImage.replace("\\\"", "\"").replace("\\\\", "\\");
+ private String replaceEscapes(String tokenImage) throws ParseException {
+ char[] chars = tokenImage.toCharArray();
+ int len = chars.length;
+ int idx = 0;
+ while (idx < len) {
+ if (chars[idx] == '\\') {
+ switch (chars[idx + 1]) {
+ case '\\':
+ case '\"':
+ for (int i = idx + 1; i < len; ++i) {
+ chars[i - 1] = chars[i];
+ }
+ --len;
+ break;
+ default:
+ throw new ParseException("Illegal escape '\\" + chars[idx + 1] + "'");
+ }
+ }
+ ++idx;
+ }
+ return new String(chars, 0, len);
}
private IAType getComplexType(IAType aObjectType, ATypeTag tag) {