0004-SQL-JSON-Respect-OMIT-QUOTES-when-RETURNING-domain_t.patch
application/octet-stream
Filename: 0004-SQL-JSON-Respect-OMIT-QUOTES-when-RETURNING-domain_t.patch
Type: application/octet-stream
Part: 3
Patch
Format: format-patch
Series: patch 0004
Subject: SQL/JSON: Respect OMIT QUOTES when RETURNING domain_type
| File | + | − |
|---|---|---|
| src/backend/utils/adt/jsonfuncs.c | 6 | 5 |
| src/test/regress/expected/sqljson_queryfuncs.out | 8 | 0 |
| src/test/regress/sql/sqljson_queryfuncs.sql | 3 | 0 |
From bb14709b3fe73045916ebde27f031112b438ee6b Mon Sep 17 00:00:00 2001
From: Amit Langote <amitlan@postgresql.org>
Date: Thu, 25 Jul 2024 23:07:21 +0900
Subject: [PATCH 4/5] SQL/JSON: Respect OMIT QUOTES when RETURNING domain_type
populate_domain() didn't consider the omit_quotes flag passed down to
json_populate_type() by ExecEvalJsonCoercion(). Fix that.
Reported-by: Jian He <jian.universality@gmail.com>
Discussion: https://postgr.es/m/CACJufxEo4sUjKCYtda0_qt9tazqqKPmF1cqhW9KBOUeJFqQd2g@mail.gmail.com
---
src/backend/utils/adt/jsonfuncs.c | 11 ++++++-----
src/test/regress/expected/sqljson_queryfuncs.out | 8 ++++++++
src/test/regress/sql/sqljson_queryfuncs.sql | 3 +++
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 48c3f88140..1b681eff5f 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -453,7 +453,7 @@ static void prepare_column_cache(ColumnIOData *column, Oid typid, int32 typmod,
static Datum populate_record_field(ColumnIOData *col, Oid typid, int32 typmod,
const char *colname, MemoryContext mcxt, Datum defaultval,
JsValue *jsv, bool *isnull, Node *escontext,
- bool omit_quotes);
+ bool omit_scalar_quotes);
static RecordIOData *allocate_record_info(MemoryContext mcxt, int ncolumns);
static bool JsObjectGetField(JsObject *obj, char *field, JsValue *jsv);
static void populate_recordset_record(PopulateRecordsetState *state, JsObject *obj);
@@ -470,7 +470,7 @@ static Datum populate_array(ArrayIOData *aio, const char *colname,
Node *escontext);
static Datum populate_domain(DomainIOData *io, Oid typid, const char *colname,
MemoryContext mcxt, JsValue *jsv, bool *isnull,
- Node *escontext);
+ Node *escontext, bool omit_quotes);
/* functions supporting jsonb_delete, jsonb_set and jsonb_concat */
static JsonbValue *IteratorConcat(JsonbIterator **it1, JsonbIterator **it2,
@@ -3218,7 +3218,8 @@ populate_domain(DomainIOData *io,
MemoryContext mcxt,
JsValue *jsv,
bool *isnull,
- Node *escontext)
+ Node *escontext,
+ bool omit_quotes)
{
Datum res;
@@ -3229,7 +3230,7 @@ populate_domain(DomainIOData *io,
res = populate_record_field(io->base_io,
io->base_typid, io->base_typmod,
colname, mcxt, PointerGetDatum(NULL),
- jsv, isnull, escontext, false);
+ jsv, isnull, escontext, omit_quotes);
Assert(!*isnull || SOFT_ERROR_OCCURRED(escontext));
}
@@ -3461,7 +3462,7 @@ populate_record_field(ColumnIOData *col,
case TYPECAT_DOMAIN:
return populate_domain(&col->io.domain, typid, colname, mcxt,
- jsv, isnull, escontext);
+ jsv, isnull, escontext, omit_scalar_quotes);
default:
elog(ERROR, "unrecognized type category '%c'", typcat);
diff --git a/src/test/regress/expected/sqljson_queryfuncs.out b/src/test/regress/expected/sqljson_queryfuncs.out
index 3080f5ed3e..2a56e247f8 100644
--- a/src/test/regress/expected/sqljson_queryfuncs.out
+++ b/src/test/regress/expected/sqljson_queryfuncs.out
@@ -738,6 +738,14 @@ SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quot
SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes error on error);
ERROR: malformed range literal: ""[1,2]""
DETAIL: Missing left parenthesis or bracket.
+CREATE DOMAIN char_domain_not_a AS char(1);
+SELECT JSON_QUERY(jsonb '"a"', '$' RETURNING char_domain_not_a OMIT QUOTES ERROR ON ERROR);
+ json_query
+------------
+ a
+(1 row)
+
+DROP DOMAIN char_domain_not_a;
SELECT JSON_QUERY(jsonb '[]', '$[*]');
json_query
------------
diff --git a/src/test/regress/sql/sqljson_queryfuncs.sql b/src/test/regress/sql/sqljson_queryfuncs.sql
index 0dd55f9453..6ae33418b2 100644
--- a/src/test/regress/sql/sqljson_queryfuncs.sql
+++ b/src/test/regress/sql/sqljson_queryfuncs.sql
@@ -214,6 +214,9 @@ SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] keep quotes
SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range omit quotes);
SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes);
SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes error on error);
+CREATE DOMAIN char_domain_not_a AS char(1);
+SELECT JSON_QUERY(jsonb '"a"', '$' RETURNING char_domain_not_a OMIT QUOTES ERROR ON ERROR);
+DROP DOMAIN char_domain_not_a;
SELECT JSON_QUERY(jsonb '[]', '$[*]');
SELECT JSON_QUERY(jsonb '[]', '$[*]' NULL ON EMPTY);
--
2.43.0