diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2025-01-03 09:23:46 -0500 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2025-01-03 10:36:30 -0500 |
commit | 30f017626308a06cf0c0c82a706a1ba1b07df34a (patch) | |
tree | bab5af8cca336d73ead7f8490fb6f58205646273 /src | |
parent | e28033fe1af8037e0fec8bb3a32fabbe18ac06b1 (diff) | |
download | postgresql-30f017626308a06cf0c0c82a706a1ba1b07df34a.tar.gz postgresql-30f017626308a06cf0c0c82a706a1ba1b07df34a.zip |
Document strange jsonb sort order for empty top level arrays
Slightly faulty logic in the original jsonb code (commit d9134d0a355)
results in an empty top level array sorting less than a json null. We
can't change the sort order now since it would affect btree indexes over
jsonb, so document the anomaly.
Backpatch to all live branches (13 .. 17)
In master, also add a code comment noting the anomaly.
Reported-by: Yan Chengpen
Reviewed-by: Jian He
Discussion: https://postgr.es/m/OSBPR01MB45199DD8DA2D1CECD50518188E272@OSBPR01MB4519.jpnprd01.prod.outlook.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/adt/jsonb_util.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 806d1aa3a98..773f3690c7b 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -246,6 +246,13 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b) */ if (va.val.array.rawScalar != vb.val.array.rawScalar) res = (va.val.array.rawScalar) ? -1 : 1; + + /* + * There should be an "else" here, to prevent us from + * overriding the above, but we can't change the sort + * order now, so there is a mild anomaly that an empty + * top level array sorts less than null. + */ if (va.val.array.nElems != vb.val.array.nElems) res = (va.val.array.nElems > vb.val.array.nElems) ? 1 : -1; break; |