aboutsummaryrefslogtreecommitdiff
path: root/src/include/common/jsonapi.h
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2025-01-19 09:09:58 -0500
committerAndrew Dunstan <andrew@dunslane.net>2025-01-19 09:09:58 -0500
commitea5ff5833c7d4ae727a5acfc590c848b520775d0 (patch)
tree8c08c15dfcccd02c2286bb9f5dd951783c96e2ab /src/include/common/jsonapi.h
parentd3d0983169130a9b81e3fe48d5c2ca4931480956 (diff)
downloadpostgresql-ea5ff5833c7d4ae727a5acfc590c848b520775d0.tar.gz
postgresql-ea5ff5833c7d4ae727a5acfc590c848b520775d0.zip
Be clearer about when jsonapi's need_escapes is needed
Most operations beyond pure json parsing need to set need_escapes to true to get access to field names and string scalars. Document this fact more explicitly. Slightly tweaked patch from: Author: Corey Huinker <corey.huinker@gmail.com> Discussion: https://postgr.es/m/CADkLM=c49Vkfg2+A8ubSuEtaGEjuaKZXCA6SrXA8kdwHjx3uxQ@mail.gmail.com
Diffstat (limited to 'src/include/common/jsonapi.h')
-rw-r--r--src/include/common/jsonapi.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/include/common/jsonapi.h b/src/include/common/jsonapi.h
index c3a1b04ca71..5d1a3ef3833 100644
--- a/src/include/common/jsonapi.h
+++ b/src/include/common/jsonapi.h
@@ -118,6 +118,12 @@ typedef struct JsonLexContext
struct jsonapi_StrValType *errormsg;
} JsonLexContext;
+/*
+ * Function types for custom json parsing actions.
+ *
+ * fname will be NULL if the context has need_escapes=false, as will token for
+ * string type values.
+ */
typedef JsonParseErrorType (*json_struct_action) (void *state);
typedef JsonParseErrorType (*json_ofield_action) (void *state, char *fname, bool isnull);
typedef JsonParseErrorType (*json_aelem_action) (void *state, bool isnull);
@@ -197,12 +203,17 @@ extern JsonParseErrorType json_count_array_elements(JsonLexContext *lex,
* struct is allocated.
*
* If need_escapes is true, ->strval stores the unescaped lexemes.
+ *
+ * Setting need_escapes to true is necessary if the operation needs
+ * to reference field names or scalar string values. This is true of most
+ * operations beyond purely checking the json-validity of the source
+ * document.
+ *
* Unescaping is expensive, so only request it when necessary.
*
* If need_escapes is true or lex was given as NULL, then the caller is
* responsible for freeing the returned struct, either by calling
- * freeJsonLexContext() or (in backend environment) via memory context
- * cleanup.
+ * freeJsonLexContext() or (in backends) via memory context cleanup.
*/
extern JsonLexContext *makeJsonLexContextCstringLen(JsonLexContext *lex,
const char *json,