Re: Cleaning up ERRCODE usage in our XML code - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Cleaning up ERRCODE usage in our XML code
Date
Msg-id 2528135.1726858842@sss.pgh.pa.us
Whole thread Raw
In response to Cleaning up ERRCODE usage in our XML code  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Cleaning up ERRCODE usage in our XML code
List pgsql-hackers
I wrote:
> [ v1-clean-up-errcodes-for-xml.patch ]

Per cfbot, rebased over d5622acb3.  No functional changes.

            regards, tom lane

diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c
index 0fdf735faf..ef78aa00c8 100644
--- a/contrib/xml2/xpath.c
+++ b/contrib/xml2/xpath.c
@@ -388,7 +388,7 @@ pgxml_xpath(text *document, xmlChar *xpath, xpath_workspace *workspace)
             /* compile the path */
             comppath = xmlXPathCtxtCompile(workspace->ctxt, xpath);
             if (comppath == NULL)
-                xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
+                xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                             "XPath Syntax Error");

             /* Now evaluate the path expression. */
@@ -652,7 +652,7 @@ xpath_table(PG_FUNCTION_ARGS)
                         comppath = xmlXPathCtxtCompile(ctxt, xpaths[j]);
                         if (comppath == NULL)
                             xml_ereport(xmlerrcxt, ERROR,
-                                        ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
+                                        ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                                         "XPath Syntax Error");

                         /* Now evaluate the path expression. */
diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c
index f30a3a42c0..e761ca5cb5 100644
--- a/contrib/xml2/xslt_proc.c
+++ b/contrib/xml2/xslt_proc.c
@@ -90,7 +90,7 @@ xslt_process(PG_FUNCTION_ARGS)
                                 XML_PARSE_NOENT);

         if (doctree == NULL)
-            xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
+            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
                         "error parsing XML document");

         /* Same for stylesheet */
@@ -99,14 +99,14 @@ xslt_process(PG_FUNCTION_ARGS)
                               XML_PARSE_NOENT);

         if (ssdoc == NULL)
-            xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
+            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
                         "error parsing stylesheet as XML document");

         /* After this call we need not free ssdoc separately */
         stylesheet = xsltParseStylesheetDoc(ssdoc);

         if (stylesheet == NULL)
-            xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
+            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                         "failed to parse stylesheet");

         xslt_ctxt = xsltNewTransformContext(stylesheet, doctree);
@@ -141,7 +141,7 @@ xslt_process(PG_FUNCTION_ARGS)
                                           NULL, NULL, xslt_ctxt);

         if (restree == NULL)
-            xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
+            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                         "failed to apply stylesheet");

         resstat = xsltSaveResultToString(&resstr, &reslen, restree, stylesheet);
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 41b1a5c6b0..2654c2d7ff 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -742,7 +742,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent)
         {
             /* If it's a document, saving is easy. */
             if (xmlSaveDoc(ctxt, doc) == -1 || xmlerrcxt->err_occurred)
-                xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+                xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
                             "could not save document to xmlBuffer");
         }
         else if (content_nodes != NULL)
@@ -785,7 +785,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent)
                     if (xmlSaveTree(ctxt, newline) == -1 || xmlerrcxt->err_occurred)
                     {
                         xmlFreeNode(newline);
-                        xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+                        xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
                                     "could not save newline to xmlBuffer");
                     }
                 }
@@ -793,7 +793,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent)
                 if (xmlSaveTree(ctxt, node) == -1 || xmlerrcxt->err_occurred)
                 {
                     xmlFreeNode(newline);
-                    xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+                    xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
                                 "could not save content to xmlBuffer");
                 }
             }
@@ -1004,7 +1004,7 @@ xmlpi(const char *target, text *arg, bool arg_is_null, bool *result_is_null)

     if (pg_strcasecmp(target, "xml") == 0)
         ereport(ERROR,
-                (errcode(ERRCODE_SYNTAX_ERROR), /* really */
+                (errcode(ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION),
                  errmsg("invalid XML processing instruction"),
                  errdetail("XML processing instruction target name cannot be \"%s\".", target)));

@@ -4383,7 +4383,7 @@ xpath_internal(text *xpath_expr_text, xmltype *data, ArrayType *namespaces,
     xpath_len = VARSIZE_ANY_EXHDR(xpath_expr_text);
     if (xpath_len == 0)
         ereport(ERROR,
-                (errcode(ERRCODE_DATA_EXCEPTION),
+                (errcode(ERRCODE_INVALID_ARGUMENT_FOR_XQUERY),
                  errmsg("empty XPath expression")));

     string = pg_xmlCharStrndup(datastr, len);
@@ -4456,7 +4456,7 @@ xpath_internal(text *xpath_expr_text, xmltype *data, ArrayType *namespaces,
          */
         xpathcomp = xmlXPathCtxtCompile(xpathctx, xpath_expr);
         if (xpathcomp == NULL || xmlerrcxt->err_occurred)
-            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                         "invalid XPath expression");

         /*
@@ -4468,7 +4468,7 @@ xpath_internal(text *xpath_expr_text, xmltype *data, ArrayType *namespaces,
          */
         xpathobj = xmlXPathCompiledEval(xpathcomp, xpathctx);
         if (xpathobj == NULL || xmlerrcxt->err_occurred)
-            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+            xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                         "could not create XPath object");

         /*
@@ -4798,7 +4798,7 @@ XmlTableSetNamespace(TableFuncScanState *state, const char *name, const char *ur
     if (xmlXPathRegisterNs(xtCxt->xpathcxt,
                            pg_xmlCharStrndup(name, strlen(name)),
                            pg_xmlCharStrndup(uri, strlen(uri))))
-        xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_DATA_EXCEPTION,
+        xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                     "could not set XML namespace");
 #else
     NO_XML_SUPPORT();
@@ -4820,7 +4820,7 @@ XmlTableSetRowFilter(TableFuncScanState *state, const char *path)

     if (*path == '\0')
         ereport(ERROR,
-                (errcode(ERRCODE_DATA_EXCEPTION),
+                (errcode(ERRCODE_INVALID_ARGUMENT_FOR_XQUERY),
                  errmsg("row path filter must not be empty string")));

     xstr = pg_xmlCharStrndup(path, strlen(path));
@@ -4830,7 +4830,7 @@ XmlTableSetRowFilter(TableFuncScanState *state, const char *path)

     xtCxt->xpathcomp = xmlXPathCtxtCompile(xtCxt->xpathcxt, xstr);
     if (xtCxt->xpathcomp == NULL || xtCxt->xmlerrcxt->err_occurred)
-        xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_SYNTAX_ERROR,
+        xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                     "invalid XPath expression");
 #else
     NO_XML_SUPPORT();
@@ -4854,7 +4854,7 @@ XmlTableSetColumnFilter(TableFuncScanState *state, const char *path, int colnum)

     if (*path == '\0')
         ereport(ERROR,
-                (errcode(ERRCODE_DATA_EXCEPTION),
+                (errcode(ERRCODE_INVALID_ARGUMENT_FOR_XQUERY),
                  errmsg("column path filter must not be empty string")));

     xstr = pg_xmlCharStrndup(path, strlen(path));
@@ -4864,7 +4864,7 @@ XmlTableSetColumnFilter(TableFuncScanState *state, const char *path, int colnum)

     xtCxt->xpathscomp[colnum] = xmlXPathCtxtCompile(xtCxt->xpathcxt, xstr);
     if (xtCxt->xpathscomp[colnum] == NULL || xtCxt->xmlerrcxt->err_occurred)
-        xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_DATA_EXCEPTION,
+        xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                     "invalid XPath expression");
 #else
     NO_XML_SUPPORT();
@@ -4891,7 +4891,7 @@ XmlTableFetchRow(TableFuncScanState *state)
     {
         xtCxt->xpathobj = xmlXPathCompiledEval(xtCxt->xpathcomp, xtCxt->xpathcxt);
         if (xtCxt->xpathobj == NULL || xtCxt->xmlerrcxt->err_occurred)
-            xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+            xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                         "could not create XPath object");

         xtCxt->row_count = 0;
@@ -4955,7 +4955,7 @@ XmlTableGetValue(TableFuncScanState *state, int colnum,
         /* Evaluate column path */
         xpathobj = xmlXPathCompiledEval(xtCxt->xpathscomp[colnum], xtCxt->xpathcxt);
         if (xpathobj == NULL || xtCxt->xmlerrcxt->err_occurred)
-            xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR,
+            xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_ARGUMENT_FOR_XQUERY,
                         "could not create XPath object");

         /*
diff --git a/src/backend/utils/errcodes.txt b/src/backend/utils/errcodes.txt
index b43a24d4bc..97d91eb1e9 100644
--- a/src/backend/utils/errcodes.txt
+++ b/src/backend/utils/errcodes.txt
@@ -141,6 +141,12 @@ Section: Class 0Z - Diagnostics Exception
 0Z000    E    ERRCODE_DIAGNOSTICS_EXCEPTION                                  diagnostics_exception
 0Z002    E    ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER
stacked_diagnostics_accessed_without_active_handler

+Section: Class 10 - XQuery Error
+
+# recent SQL versions define quite a few codes in this class, but for now
+# we are only using this generic one
+10608    E    ERRCODE_INVALID_ARGUMENT_FOR_XQUERY                            invalid_argument_for_xquery
+
 Section: Class 20 - Case Not Found

 20000    E    ERRCODE_CASE_NOT_FOUND                                         case_not_found

pgsql-hackers by date:

Previous
From: Nathan Bossart
Date:
Subject: Re: pg_checksums: Reorder headers in alphabetical order
Next
From: Bruce Momjian
Date:
Subject: Re: First draft of PG 17 release notes