2016-11-10 13:54 GMT+07:00 Michael Paquier <michael.paqu...@gmail.com>:
> On Thu, Nov 10, 2016 at 7:37 AM, Tom Lane <t...@sss.pgh.pa.us> wrote: > > Given that nobody actually cares what that sort order is, I think that > > having to jump through hoops in pg_upgrade in order to fix it is not a > > great tradeoff. I suggest changing the documentation to match the code. > Don't you in this case think we should match sort order in javascript? > Yes, definitely. > =# create table json_data (a jsonb); > CREATE TABLE > =# INSERT INTO json_data values ('{}'::jsonb), ('[]'::jsonb), > ('null'::jsonb), ('true'::jsonb), ('1'::jsonb), ('""'::jsonb); > INSERT 0 6 > =# SELECT * FROM json_data ORDER BY 1 DESC; > a > ------ > {} > true > 1 > "" > null > [] > (6 rows) > So that's object > boolean > integer > string > NULL > array. > > a = [{}, [], null, true, 1, '""'] [ {}, [], null, true, 1, '""' ] > a.sort() [ [], '""', 1, {}, null, true ] > a.reverse() [ true, null, {}, 1, '""', [] ] So in this case it's boolean > NULL > Object > integer > string > array (tried in Chromium 53, Firefox 49 and Node v6.9.1) When I tried to search for the ECMA Standard for this behavior, i found this: http://blog.rodneyrehm.de/archives/14-Sorting-Were-Doing-It-Wrong.html. There are problems about automatic conversion in javascript, like this: > a = [{}, [], null, true, 1, 'someotherstring'] [ {}, [], null, true, 1, 'someotherstring' ] > a.sort().reverse() [ true, 'someotherstring', null, {}, 1, [] ] versus this: > a = [{}, [], null, true, 1, 'SomeOtherString'] [ {}, [], null, true, 1, 'SomeOtherString' ] > a.sort().reverse() [ true, null, {}, 'SomeOtherString', 1, [] ] and this: > a = [{}, [], null, true, 1, '2'] [ {}, [], null, true, 1, '2' ] > a.sort().reverse() [ true, null, {}, '2', 1, [] ] So we can't replicate javascript sort order without emulating those. Regards, Ali Akbar