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++;