From 85aa82b34f956c908ab3ee88569f8c73cf5a4a47 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 4 Jul 2023 14:07:31 -0400 Subject: [PATCH v9 3/7] Re-indent ArrayCount(). This cleans up after the removal of the "while (!itemdone)" loop. --- src/backend/utils/adt/arrayfuncs.c | 214 ++++++++++++++--------------- 1 file changed, 106 insertions(+), 108 deletions(-) diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index 59bb0614..d1b5d48b 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -477,21 +477,21 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) { bool new_element = false; - switch (*ptr) - { - case '\0': - /* Signal a premature end of the string */ - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected end of input."))); - case '\\': + switch (*ptr) + { + case '\0': + /* Signal a premature end of the string */ + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", str), + errdetail("Unexpected end of input."))); + case '\\': - /* - * An escape must be after a level start, after an element - * start, or after an element delimiter. In any case we - * now must be past an element start. - */ + /* + * An escape must be after a level start, after an element + * start, or after an element delimiter. In any case we now + * must be past an element start. + */ switch (parse_state) { case ARRAY_LEVEL_STARTED: @@ -511,22 +511,22 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) errdetail("Unexpected \"%c\" character.", '\\'))); } - /* skip the escaped character */ - if (*(ptr + 1)) - ptr++; - else - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected end of input."))); - break; - case '"': + /* skip the escaped character */ + if (*(ptr + 1)) + ptr++; + else + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", str), + errdetail("Unexpected end of input."))); + break; + case '"': - /* - * A quote must be after a level start, after a quoted - * element start, or after an element delimiter. In any - * case we now must be past an element start. - */ + /* + * A quote must be after a level start, after a quoted element + * start, or after an element delimiter. In any case we now + * must be past an element start. + */ switch (parse_state) { case ARRAY_LEVEL_STARTED: @@ -549,17 +549,16 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) errmsg("malformed array literal: \"%s\"", str), errdetail("Unexpected array element."))); } - break; - case '{': - if (!in_quotes) - { - /* - * A left brace can occur if no nesting has occurred - * yet, after a level start, or after a level - * delimiter. If we see one after an element - * delimiter, we have something like "{1,{2}}", so - * complain about non-rectangularity. - */ + break; + case '{': + if (!in_quotes) + { + /* + * A left brace can occur if no nesting has occurred yet, + * after a level start, or after a level delimiter. If we + * see one after an element delimiter, we have something + * like "{1,{2}}", so complain about non-rectangularity. + */ switch (parse_state) { case ARRAY_NO_LEVEL: @@ -579,19 +578,19 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) errdetail("Unexpected \"%c\" character.", '{'))); } - parse_state = ARRAY_LEVEL_STARTED; + parse_state = ARRAY_LEVEL_STARTED; /* Nested sub-arrays count as elements of outer level */ if (nest_level > 0) nelems[nest_level - 1]++; /* Initialize element counting in the new level */ - if (nest_level >= MAXDIM) - ereturn(escontext, -1, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", - nest_level + 1, MAXDIM))); + if (nest_level >= MAXDIM) + ereturn(escontext, -1, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", + nest_level + 1, MAXDIM))); nelems[nest_level] = 0; - nest_level++; - if (ndim < nest_level) + nest_level++; + if (ndim < nest_level) { /* Can't increase ndim once it's frozen */ if (ndim_frozen) @@ -599,22 +598,22 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("malformed array literal: \"%s\"", str), errdetail("Multidimensional arrays must have sub-arrays with matching dimensions."))); - ndim = nest_level; + ndim = nest_level; } } - break; - case '}': - if (!in_quotes) - { - /* - * A right brace can occur after an element start, an - * element completion, a quoted element completion, or - * a level completion. We also allow it after a level - * start, that is an empty sub-array "{}" --- but that - * freezes the number of dimensions and all such - * sub-arrays must be at the same level, just like - * sub-arrays containing elements. - */ + break; + case '}': + if (!in_quotes) + { + /* + * A right brace can occur after an element start, an + * element completion, a quoted element completion, or a + * level completion. We also allow it after a level + * start, that is an empty sub-array "{}" --- but that + * freezes the number of dimensions and all such + * sub-arrays must be at the same level, just like + * sub-arrays containing elements. + */ switch (parse_state) { case ARRAY_ELEM_STARTED: @@ -626,9 +625,9 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) /* empty sub-array: OK if at correct nest_level */ ndim_frozen = true; if (nest_level != ndim) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", str), errdetail("Multidimensional arrays must have sub-arrays with matching dimensions."))); break; default: @@ -641,7 +640,7 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) parse_state = ARRAY_LEVEL_COMPLETED; /* The parse state check assured we're in a level. */ Assert(nest_level > 0); - nest_level--; + nest_level--; if (dim[nest_level] < 0) { @@ -651,51 +650,50 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) else if (nelems[nest_level] != dim[nest_level]) { /* Subsequent sub-arrays must have same length */ - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", str), errdetail("Multidimensional arrays must have sub-arrays with matching dimensions."))); - } + } /* Done if this is the outermost level's '}' */ if (nest_level == 0) eoArray = true; + } + break; + default: + if (!in_quotes) + { + if (*ptr == typdelim) + { + /* + * Delimiters can occur after an element start, a + * quoted element completion, or a level completion. + */ + if (parse_state != ARRAY_ELEM_STARTED && + parse_state != ARRAY_QUOTED_ELEM_COMPLETED && + parse_state != ARRAY_LEVEL_COMPLETED) + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", str), + errdetail("Unexpected \"%c\" character.", + typdelim))); + if (parse_state == ARRAY_LEVEL_COMPLETED) + parse_state = ARRAY_LEVEL_DELIMITED; + else + parse_state = ARRAY_ELEM_DELIMITED; } - break; - default: - if (!in_quotes) + else if (!scanner_isspace(*ptr)) { - if (*ptr == typdelim) - { - /* - * Delimiters can occur after an element start, a - * quoted element completion, or a level - * completion. - */ - if (parse_state != ARRAY_ELEM_STARTED && - parse_state != ARRAY_QUOTED_ELEM_COMPLETED && - parse_state != ARRAY_LEVEL_COMPLETED) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected \"%c\" character.", - typdelim))); - if (parse_state == ARRAY_LEVEL_COMPLETED) - parse_state = ARRAY_LEVEL_DELIMITED; - else - parse_state = ARRAY_ELEM_DELIMITED; - } - else if (!scanner_isspace(*ptr)) - { - /* - * Other non-space characters must be after a - * level start, after an element start, or after - * an element delimiter. In any case we now must - * be past an element start. - * - * If it's a space character, we can ignore it; it - * might be data or not, but it doesn't change the - * parsing state. - */ + /* + * Other non-space characters must be after a level + * start, after an element start, or after an element + * delimiter. In any case we now must be past an + * element start. + * + * If it's a space character, we can ignore it; it + * might be data or not, but it doesn't change the + * parsing state. + */ switch (parse_state) { case ARRAY_LEVEL_STARTED: @@ -713,10 +711,10 @@ ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) errmsg("malformed array literal: \"%s\"", str), errdetail("Unexpected array element."))); } - } } - break; - } + } + break; + } /* To reduce duplication, all new-element cases go through here. */ if (new_element) -- 2.34.1