diff --git a/contrib/hstore/expected/hstore.out b/contrib/hstore/expected/hstore.out index 1836c9acf3..26815cbc7f 100644 --- a/contrib/hstore/expected/hstore.out +++ b/contrib/hstore/expected/hstore.out @@ -243,6 +243,14 @@ select ' '::hstore; (1 row) +-- UTF-8 Mac OS X en_US.UTF-8 locale bug: isspace(0x85) returns true +-- \u0105 encodes as 0xc4 0x85 in UTF-8; the 0x85 was interpreted as whitespace +select E'key\u0105=>value'::hstore; + hstore +----------------- + "keyÄ…"=>"value" +(1 row) + -- invalid input select ' =>null'::hstore; ERROR: syntax error in hstore, near "=" at position 2 diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index cec7df71a2..999ddad76d 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -13,6 +13,7 @@ #include "lib/stringinfo.h" #include "libpq/pqformat.h" #include "nodes/miscnodes.h" +#include "parser/scansup.h" #include "utils/builtins.h" #include "utils/json.h" #include "utils/jsonb.h" @@ -118,7 +119,7 @@ get_val(HSParser *state, bool ignoreeq, bool *escaped) { st = GV_WAITESCIN; } - else if (!isspace((unsigned char) *(state->ptr))) + else if (!scanner_isspace((unsigned char) *(state->ptr))) { *(state->cur) = *(state->ptr); state->cur++; @@ -141,7 +142,7 @@ get_val(HSParser *state, bool ignoreeq, bool *escaped) state->ptr--; return true; } - else if (isspace((unsigned char) *(state->ptr))) + else if (scanner_isspace((unsigned char) *(state->ptr))) { return true; } @@ -255,7 +256,7 @@ parse_hstore(HSParser *state) { PRSEOF; } - else if (!isspace((unsigned char) *(state->ptr))) + else if (!scanner_isspace((unsigned char) *(state->ptr))) { PRSSYNTAXERROR; } @@ -309,7 +310,7 @@ parse_hstore(HSParser *state) { return true; } - else if (!isspace((unsigned char) *(state->ptr))) + else if (!scanner_isspace((unsigned char) *(state->ptr))) { PRSSYNTAXERROR; } diff --git a/contrib/hstore/sql/hstore.sql b/contrib/hstore/sql/hstore.sql index efef91292a..36c7422018 100644 --- a/contrib/hstore/sql/hstore.sql +++ b/contrib/hstore/sql/hstore.sql @@ -53,6 +53,10 @@ select e'\\"a=>q"w'::hstore; select ''::hstore; select ' '::hstore; +-- UTF-8 Mac OS X en_US.UTF-8 locale bug: isspace(0x85) returns true +-- \u0105 encodes as 0xc4 0x85 in UTF-8; the 0x85 was interpreted as whitespace +select E'key\u0105=>value'::hstore; + -- invalid input select ' =>null'::hstore; select 'aa=>"'::hstore;