sql-formatter icon indicating copy to clipboard operation
sql-formatter copied to clipboard

[FORMATTING] Missing space after colon in `JSON_OBJECT(key: value)`

Open felixfbecker opened this issue 1 year ago • 1 comments

When you use the JSON_OBJECT() function from the SQL standard (implemented in PostgreSQL 16), the formatter removes/does not insert a space between the : delimiting the key and value, which makes the SQL somewhat hard to read.

Input data

Which SQL and options did you provide as input?

SELECT JSON_OBJECT(
  'key': 'value',
  'key2': my_table.my_column
)

Expected Output

SELECT JSON_OBJECT(
  'key': 'value',
  'key2': my_table.my_column
)

Actual Output

SELECT JSON_OBJECT(
  'key':'value',
  'key2':my_table.my_column
)

This may not seem that big of a deal for a simple example like this, but when the value is a more complicated expression with nested objects etc it becomes much worse.

Usage

  • How are you calling / using the library? Prettier
  • What SQL language(s) does this apply to? PostgreSQL but presumably all DBs that support JSON_OBJECT()
  • Which SQL Formatter version are you using? 15.0.2

felixfbecker avatar Jul 23 '24 17:07 felixfbecker

Thanks for reporting.

This dense formatting of : is currently done to improve the formatting of array-slice operations (related to #624):

SELECT foo[1:5];

Unfortunately this is tricky to fix with the current architecture. When I improve it for JSON_OBJECT, it'll become worse for array-slice.

There's much more hope of doing better JSON_OBJECT() formatting in prettier-plugin-sql-cst where it currently though produces a hard crash.

nene avatar Jul 24 '24 10:07 nene