diff --git a/.gitignore b/.gitignore
index 794e35b..37331c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,7 @@ win32ver.rc
 *.exe
 lib*dll.def
 lib*.pc
+tags
 
 # Local excludes in root directory
 /GNUmakefile
diff --git a/contrib/ltree/ltree_io.c b/contrib/ltree/ltree_io.c
index e086c09..0ffb4b8 100644
--- a/contrib/ltree/ltree_io.c
+++ b/contrib/ltree/ltree_io.c
@@ -521,64 +521,50 @@ lquery_in(PG_FUNCTION_ARGS)
 	while (*ptr)
 	{
 		charlen = pg_mblen(ptr);
-
-		if (state == LQPRS_WAITLEVEL)
+		switch (state)
 		{
+		 case LQPRS_WAITLEVEL:
 			if (t_isspace(ptr))
-			{
-				ptr += charlen;
-				pos++;
-				continue;
-			}
+				break; /* Just go to next symbol */
 
 			escaped_count = 0;
 			real_levels++;
+
 			if (charlen == 1)
 			{
-				if (t_iseq(ptr, '!'))
+				if (strchr(".|@%{}", *ptr))
+					UNCHAR;
+
+				if (t_iseq(ptr, '*'))
 				{
-					GETVAR(curqlevel) = lptr = (nodeitem *) palloc0(sizeof(nodeitem) * numOR);
-					lptr->start = ptr + 1;
-					state = LQPRS_WAITDELIM;
-					curqlevel->numvar = 1;
-					curqlevel->flag |= LQL_NOT;
-					hasnot = true;
-				}
-				else if (t_iseq(ptr, '*'))
 					state = LQPRS_WAITOPEN;
-				else if (t_iseq(ptr, '\\'))
+					break;
+				}
+			}
+			GETVAR(curqlevel) = lptr = (nodeitem *) palloc0(sizeof(nodeitem) * numOR);
+			lptr->start = ptr;
+			curqlevel->numvar = 1;
+			state = LQPRS_WAITDELIM;
+			if (charlen == 1)
+			{
+				if (t_iseq(ptr, '\\'))
 				{
-					GETVAR(curqlevel) = lptr = (nodeitem *) palloc0(sizeof(nodeitem) * numOR);
-					lptr->start = ptr;
-					curqlevel->numvar = 1;
 					state = LQPRS_WAITESCAPED;
+					break;
 				}
-				else if (strchr(".|@%{}", *ptr))
+				if (t_iseq(ptr, '!'))
 				{
-					UNCHAR;
+					lptr->start += 1 /*FIXME explain why */;
+					curqlevel->flag |= LQL_NOT;
+					hasnot = true;
 				}
-				else
+				else if (t_iseq(ptr, '"'))
 				{
-					GETVAR(curqlevel) = lptr = (nodeitem *) palloc0(sizeof(nodeitem) * numOR);
-					lptr->start = ptr;
-					state = LQPRS_WAITDELIM;
-					curqlevel->numvar = 1;
-					if (t_iseq(ptr, '"'))
-					{
-						lptr->flag |= LVAR_QUOTEDPART;
-					}
+					lptr->flag |= LVAR_QUOTEDPART;
 				}
 			}
-			else
-			{
-				GETVAR(curqlevel) = lptr = (nodeitem *) palloc0(sizeof(nodeitem) * numOR);
-				lptr->start = ptr;
-				state = LQPRS_WAITDELIM;
-				curqlevel->numvar = 1;
-			}
-		}
-		else if (state == LQPRS_WAITVAR)
-		{
+			break;
+		case LQPRS_WAITVAR:
 			if (t_isspace(ptr))
 			{
 				ptr += charlen;
@@ -596,9 +582,9 @@ lquery_in(PG_FUNCTION_ARGS)
 			state = (t_iseq(ptr, '\\')) ? LQPRS_WAITESCAPED : LQPRS_WAITDELIM;
 			if (t_iseq(ptr, '"'))
 				lptr->flag |= LVAR_QUOTEDPART;
-		}
-		else if (state == LQPRS_WAITDELIM || state == LQPRS_WAITDELIMSTRICT)
-		{
+			break;
+		case LQPRS_WAITDELIM:
+		case LQPRS_WAITDELIMSTRICT:
 			if (charlen == 1 && t_iseq(ptr, '"'))
 			{
 				/* We are here if variant begins with ! */
@@ -725,9 +711,8 @@ lquery_in(PG_FUNCTION_ARGS)
 				tail_space_symbols = 0;
 				tail_space_bytes = 0;
 			}
-		}
-		else if (state == LQPRS_WAITOPEN)
-		{
+			break;
+		case LQPRS_WAITOPEN:
 			if (charlen == 1 && t_iseq(ptr, '{'))
 				state = LQPRS_WAITFNUM;
 			else if (charlen == 1 && t_iseq(ptr, '.'))
@@ -739,9 +724,8 @@ lquery_in(PG_FUNCTION_ARGS)
 			}
 			else
 				UNCHAR;
-		}
-		else if (state == LQPRS_WAITFNUM)
-		{
+			break;
+		case LQPRS_WAITFNUM:
 			if (charlen == 1 && t_iseq(ptr, ','))
 				state = LQPRS_WAITSNUM;
 			else if (t_isdigit(ptr))
@@ -751,9 +735,8 @@ lquery_in(PG_FUNCTION_ARGS)
 			}
 			else
 				UNCHAR;
-		}
-		else if (state == LQPRS_WAITSNUM)
-		{
+			break;
+		case LQPRS_WAITSNUM:
 			if (t_isdigit(ptr))
 			{
 				curqlevel->high = atoi(ptr);
@@ -766,16 +749,14 @@ lquery_in(PG_FUNCTION_ARGS)
 			}
 			else
 				UNCHAR;
-		}
-		else if (state == LQPRS_WAITCLOSE)
-		{
+			break;
+		case LQPRS_WAITCLOSE:
 			if (charlen == 1 && t_iseq(ptr, '}'))
 				state = LQPRS_WAITEND;
 			else if (!t_isdigit(ptr))
 				UNCHAR;
-		}
-		else if (state == LQPRS_WAITND)
-		{
+			break;
+		case LQPRS_WAITND:
 			if (charlen == 1 && t_iseq(ptr, '}'))
 			{
 				curqlevel->high = curqlevel->low;
@@ -785,9 +766,8 @@ lquery_in(PG_FUNCTION_ARGS)
 				state = LQPRS_WAITSNUM;
 			else if (!t_isdigit(ptr))
 				UNCHAR;
-		}
-		else if (state == LQPRS_WAITEND)
-		{
+			break;
+		case LQPRS_WAITEND:
 			if (charlen == 1 && (t_iseq(ptr, '.') || t_iseq(ptr, '|')))
 			{
 				state = LQPRS_WAITLEVEL;
@@ -795,16 +775,15 @@ lquery_in(PG_FUNCTION_ARGS)
 			}
 			else
 				UNCHAR;
-		}
-		else if (state == LQPRS_WAITESCAPED)
-		{
+			break;
+		case LQPRS_WAITESCAPED:
 			state = LQPRS_WAITDELIM;
 			escaped_count++;
-		}
-		else
+			break;
+		default:
 			/* internal error */
 			elog(ERROR, "internal error in parser");
-
+		}
 		ptr += charlen;
 		if (state == LQPRS_WAITDELIM || state == LQPRS_WAITDELIMSTRICT)
 			lptr->wlen++;
