vaticle / typedb

TypeDB: the polymorphic database powered by types
https://typedb.com
Mozilla Public License 2.0
3.72k stars 338 forks source link

Fetch query fails to parse special character whereas equivalent Get query can #6948

Closed shreyas1599 closed 7 months ago

shreyas1599 commented 7 months ago

Description

Special characters in string are not handled when doing a fetch query versus when doing a get query because the JsonParser of the library com.eclipsesource.json fails to parse in the readEscape function of JsonParser. The Get query runs fine but the fetch query fails cause it's trying to jsonify something that it can't. This is the character - \u0000.

Environment

  1. TypeDB distribution: Core
  2. TypeDB version: 2.25.0
  3. Environment: Mac
  4. Client and version: Java Driver 2.25.0
  5. Other details:

Reproducible Steps

  1. Set up Running a TypeQLQuery on studio or through a driver

  2. Execute

Fetch:

match 
$entityName has attribute-name "NAME";
(roleplayer1, roleplayer2) isa relation;
fetch role1: attribute;

fails with "Expected Hexadecimal digit"

whereas the get query equivalent works fine and fetches the string with the special character.

match 
$entityName has attribute-name "NAME";
(roleplayer1, roleplayer2) isa relation;
$roleplayer1 has attribute $attributeWithSpecialCharacter
get $rolePlayer1;

I also tried to find a way to find all instances of the offending character so that I could replace it:

match $x isa attribute, $x contains ""; get $x;

but TypeDB studio crashes when I do that. I also tried doing the same through the driver but even the driver crashes.

Additional information

Relevant logs from TypeDB or Driver:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.eclipsesource.json.ParseException: Expected hexadecimal digit at 1:1261] with root cause

com.eclipsesource.json.ParseException: Expected hexadecimal digit at 1:1261 at com.eclipsesource.json.JsonParser.error(JsonParser.java:490) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.expected(JsonParser.java:486) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readEscape(JsonParser.java:350) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readStringInternal(JsonParser.java:309) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readString(JsonParser.java:300) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readValue(JsonParser.java:171) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readObject(JsonParser.java:246) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readValue(JsonParser.java:177) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readArray(JsonParser.java:212) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readValue(JsonParser.java:174) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readObject(JsonParser.java:246) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readValue(JsonParser.java:177) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readObject(JsonParser.java:246) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.readValue(JsonParser.java:177) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.parse(JsonParser.java:152) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.JsonParser.parse(JsonParser.java:91) ~[minimal-json-0.9.5.jar:na] at com.eclipsesource.json.Json.parse(Json.java:295) ~[minimal-json-0.9.5.jar:na] at com.vaticle.typedb.driver.api.answer.JSON.parse(JSON.java:42) ~[typedb-driver-2.25.7.jar:na] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na] at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[na:na] at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]