On Thu, Apr 7, 2022 at 7:41 PM Tom Lane <t...@sss.pgh.pa.us> wrote:
> Mark Dilger <mark.dil...@enterprisedb.com> writes:
> > The patch submitted changes processSQLNamePattern() to return a dot count 
> > by reference.  It's up to the caller to decide whether to raise an error.  
> > If you pass in no schemavar, and you get back dotcnt=2, you know it parsed 
> > it as a two part pattern, and you can pg_fatal(...) or ereport(ERROR, ...) 
> > or whatever.
>
> Well, I'm not telling Robert what to do, but I wouldn't accept that
> API.  It requires duplicative error-handling code at every call site
> and is an open invitation to omitting necessary error checks.
>
> Possibly a better idea is to add an enum argument telling the function
> what to do (parse the whole thing as one name regardless of dots,
> parse as two names if there's a dot, throw error if there's a dot,
> etc etc as needed by existing call sites).  Perhaps some of the
> existing arguments could be merged into such an enum, too.

I hadn't considered that approach, but I don't think it works very
well, because front-end error handling is so inconsistent. From the
patch:

+               pg_log_error("improper relation name (too many dotted
names): %s", pattern);
+               exit(2);

+                       fatal("improper qualified name (too many
dotted names): %s",
+                                 cell->val);

+                       pg_log_error("improper qualified name (too
many dotted names): %s",
+                                                cell->val);
+                       PQfinish(conn);
+                       exit_nicely(1);

+               pg_log_error("improper qualified name (too many dotted
names): %s",
+                                        pattern);
+               termPQExpBuffer(&dbbuf);
+               return false;

Come to think of it, maybe the error text there could stand some
bikeshedding, but AFAICS there's not much to be done about the fact
that one caller wants pg_log_error + exit(2), another wants fatal(), a
third PQfinish(conn) and exit_nicely(), and the last termPQExpBuffer()
and return false.

-- 
Robert Haas
EDB: http://www.enterprisedb.com


Reply via email to