diff --git a/community/bolt/src/main/java/org/neo4j/bolt/v1/messaging/Neo4jPack.java b/community/bolt/src/main/java/org/neo4j/bolt/v1/messaging/Neo4jPack.java index afa79149f695..7c6cbeea98fc 100644 --- a/community/bolt/src/main/java/org/neo4j/bolt/v1/messaging/Neo4jPack.java +++ b/community/bolt/src/main/java/org/neo4j/bolt/v1/messaging/Neo4jPack.java @@ -90,6 +90,11 @@ else if ( obj instanceof String ) { pack( (String) obj ); } + else if (obj instanceof Character ) + { + Character character = (Character) obj; + pack( character.toString() ); + } else if ( obj instanceof Map ) { Map map = (Map) obj; @@ -115,6 +120,11 @@ else if ( obj instanceof byte[] ) // Pending decision throw new UnsupportedOperationException( "Binary values cannot be packed." ); } + else if ( obj instanceof char[] ) + { + // Treat it as a String + pack( new String( (char[]) obj ) ); + } else if ( obj instanceof short[] ) { short[] array = (short[]) obj; diff --git a/community/bolt/src/main/java/org/neo4j/bolt/v1/packstream/PackStream.java b/community/bolt/src/main/java/org/neo4j/bolt/v1/packstream/PackStream.java index ba9bf150b669..be2e9019b3ec 100644 --- a/community/bolt/src/main/java/org/neo4j/bolt/v1/packstream/PackStream.java +++ b/community/bolt/src/main/java/org/neo4j/bolt/v1/packstream/PackStream.java @@ -216,6 +216,11 @@ public void pack( double value ) throws IOException out.writeByte( FLOAT_64 ).writeDouble( value ); } + public void pack( char character ) throws IOException + { + pack( new String( new char[]{character} ) ); + } + public void pack( String value ) throws IOException { if ( value == null ) { packNull(); } diff --git a/community/bolt/src/test/java/org/neo4j/bolt/v1/messaging/Neo4jPackTest.java b/community/bolt/src/test/java/org/neo4j/bolt/v1/messaging/Neo4jPackTest.java index 4b81811f32d9..a37904fc96ba 100644 --- a/community/bolt/src/test/java/org/neo4j/bolt/v1/messaging/Neo4jPackTest.java +++ b/community/bolt/src/test/java/org/neo4j/bolt/v1/messaging/Neo4jPackTest.java @@ -180,4 +180,32 @@ public void shouldNotBeAbleToUnpackPaths() throws IOException unpacked( packed( path ) ); } } + + @Test + public void shouldTreatSingleCharAsSingleCharacterString() throws IOException + { + // Given + PackedOutputArray output = new PackedOutputArray(); + Neo4jPack.Packer packer = new Neo4jPack.Packer( output ); + packer.pack( 'C' ); + Object unpacked = unpacked( output.bytes() ); + + // Then + assertThat( unpacked, instanceOf( String.class ) ); + assertThat( unpacked, equalTo( "C" ) ); + } + + @Test + public void shouldTreatCharArrayAsString() throws IOException + { + // Given + PackedOutputArray output = new PackedOutputArray(); + Neo4jPack.Packer packer = new Neo4jPack.Packer( output ); + packer.pack( new char[]{'W', 'H', 'Y'} ); + Object unpacked = unpacked( output.bytes() ); + + // Then + assertThat( unpacked, instanceOf( String.class ) ); + assertThat( unpacked, equalTo( "WHY" ) ); + } }