On Fri, Apr 27, 2012 at 11:27:03AM +0200, Vik Reykja wrote:
> On Fri, Apr 27, 2012 at 03:12, Tom Lane <t...@sss.pgh.pa.us> wrote:
> 
> > Does anybody else have an opinion as to which of these solutions is
> > more preferable?
> >
> 
> I think all unquoted whitespace should be ignored, so I prefer your
> solution. (note: I haven't actually tested it, I'm going off these emails)
As long as we make it consistent on both sides of the '=>' (and document
it, too), then I don't really care either way. Currently you have to use
quotes to get an empty key, so I thought it natural to that you should
have to quote to get an empty value.

I've attached a modified version of Tom's patch which also allows empty
keys.

> 
> 
> > And should we regard this as a back-patchable bug
> > fix, or a definition change suitable only for HEAD?
> >
> 
> Since this is removing a syntax error and not creating one, I'd say it
> should be safe to backpatch.

-Ryan Kelly
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index 0eb48cf..f03dcdc 100644
--- a/contrib/hstore/hstore_io.c
+++ b/contrib/hstore/hstore_io.c
@@ -74,7 +74,15 @@ get_val(HSParser *state, bool ignoreeq, bool *escaped)
 			}
 			else if (*(state->ptr) == '=' && !ignoreeq)
 			{
-				elog(ERROR, "Syntax error near '%c' at postion %d", *(state->ptr), (int4) (state->ptr - state->begin));
+				/* Empty key is perfectly OK */
+				state->ptr--;
+				return true;
+			}
+			else if (*(state->ptr) == ',' && ignoreeq)
+			{
+				/* Empty value is perfectly OK */
+				state->ptr--;
+				return true;
 			}
 			else if (*(state->ptr) == '\\')
 			{
@@ -191,7 +199,7 @@ parse_hstore(HSParser *state)
 		if (st == WKEY)
 		{
 			if (!get_val(state, false, &escaped))
-				return;
+				return;			/* end of string */
 			if (state->pcur >= state->plen)
 			{
 				state->plen *= 2;
@@ -236,7 +244,10 @@ parse_hstore(HSParser *state)
 		else if (st == WVAL)
 		{
 			if (!get_val(state, true, &escaped))
-				elog(ERROR, "Unexpected end of string");
+			{
+				/* end of string, treat as empty value */
+				state->ptr--;
+			}
 			state->pairs[state->pcur].val = state->word;
 			state->pairs[state->pcur].vallen = hstoreCheckValLen(state->cur - state->word);
 			state->pairs[state->pcur].isnull = false;
-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to