From 502a3832cc54c7115dacb8a2dae06f0620995ac6 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Wed, 22 Feb 2017 11:10:49 -0500 Subject: [PATCH] Correctly handle array pseudotypes in to_json and to_jsonb Columns with array pseudotypes have not been identified as arrays, so they have been rendered as strings in the json and jsonb conversion routines. This change allows them to be rendered as json arrays, making it possible to deal correctly with the anyarray columns in pg_stats. --- src/backend/utils/adt/json.c | 5 +++-- src/backend/utils/adt/jsonb.c | 5 +++-- src/test/regress/expected/json.out | 9 +++++++++ src/test/regress/expected/jsonb.out | 9 +++++++++ src/test/regress/sql/json.sql | 6 ++++++ src/test/regress/sql/jsonb.sql | 6 ++++++ 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 628e9de616..0ed6a10a44 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -1397,9 +1397,10 @@ json_categorize_type(Oid typoid, default: /* Check for arrays and composites */ - if (OidIsValid(get_element_type(typoid))) + if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID + || typoid == RECORDARRAYOID) *tcategory = JSONTYPE_ARRAY; - else if (type_is_rowtype(typoid)) + else if (type_is_rowtype(typoid)) /* includes RECORDOID */ *tcategory = JSONTYPE_COMPOSITE; else { diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index b9bf18ffe5..5b6178badf 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -644,9 +644,10 @@ jsonb_categorize_type(Oid typoid, default: /* Check for arrays and composites */ - if (OidIsValid(get_element_type(typoid))) + if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID + || typoid == RECORDARRAYOID) *tcategory = JSONBTYPE_ARRAY; - else if (type_is_rowtype(typoid)) + else if (type_is_rowtype(typoid)) /* includes RECORDOID */ *tcategory = JSONBTYPE_COMPOSITE; else { diff --git a/src/test/regress/expected/json.out b/src/test/regress/expected/json.out index efcdc4141e..1bb87689fb 100644 --- a/src/test/regress/expected/json.out +++ b/src/test/regress/expected/json.out @@ -383,6 +383,15 @@ SELECT row_to_json(row((select array_agg(x) as d from generate_series(5,10) x)), {"f1":[5,6,7,8,9,10]} (1 row) +-- anyarray column +select to_json(histogram_bounds) histogram_bounds +from pg_stats +where attname = 'tmplname' and tablename = 'pg_pltemplate'; + histogram_bounds +--------------------------------------------------------------------------------------- + ["plperl","plperlu","plpgsql","plpython2u","plpython3u","plpythonu","pltcl","pltclu"] +(1 row) + -- to_json, timestamps select to_json(timestamp '2014-05-28 12:22:35.614298'); to_json diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index ba9b1d711e..8ec4150bc2 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -279,6 +279,15 @@ SELECT array_to_json(ARRAY [jsonb '{"a":1}', jsonb '{"b":[2,3]}']); [{"a": 1},{"b": [2, 3]}] (1 row) +-- anyarray column +select to_jsonb(histogram_bounds) histogram_bounds +from pg_stats +where attname = 'tmplname' and tablename = 'pg_pltemplate'; + histogram_bounds +---------------------------------------------------------------------------------------------- + ["plperl", "plperlu", "plpgsql", "plpython2u", "plpython3u", "plpythonu", "pltcl", "pltclu"] +(1 row) + -- to_jsonb, timestamps select to_jsonb(timestamp '2014-05-28 12:22:35.614298'); to_jsonb diff --git a/src/test/regress/sql/json.sql b/src/test/regress/sql/json.sql index 603288bd1a..5e61922fbf 100644 --- a/src/test/regress/sql/json.sql +++ b/src/test/regress/sql/json.sql @@ -102,6 +102,12 @@ FROM rows q; SELECT row_to_json(row((select array_agg(x) as d from generate_series(5,10) x)),false); +-- anyarray column + +select to_json(histogram_bounds) histogram_bounds +from pg_stats +where attname = 'tmplname' and tablename = 'pg_pltemplate'; + -- to_json, timestamps select to_json(timestamp '2014-05-28 12:22:35.614298'); diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql index eb65a38197..e2eaca0e27 100644 --- a/src/test/regress/sql/jsonb.sql +++ b/src/test/regress/sql/jsonb.sql @@ -62,6 +62,12 @@ SELECT ' '::jsonb; -- ERROR, no value -- make sure jsonb is passed through json generators without being escaped SELECT array_to_json(ARRAY [jsonb '{"a":1}', jsonb '{"b":[2,3]}']); +-- anyarray column + +select to_jsonb(histogram_bounds) histogram_bounds +from pg_stats +where attname = 'tmplname' and tablename = 'pg_pltemplate'; + -- to_jsonb, timestamps select to_jsonb(timestamp '2014-05-28 12:22:35.614298');