Skip to content

Commit 73e79c5

Browse files
committed
parens for complex stmts
1 parent 16b22a3 commit 73e79c5

File tree

4 files changed

+37
-8
lines changed

4 files changed

+37
-8
lines changed

__fixtures__/generated/generated.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21097,6 +21097,7 @@
2109721097
"misc/issues-11.sql": "COMMENT ON COLUMN \"foo\".\"whatever\" IS $$\nSomething blah, this data may have chars like '\\n' and '\\r' in it.\n$$",
2109821098
"misc/issues-12.sql": "SELECT * from foo.bar.baz",
2109921099
"misc/issues-13.sql": "CREATE AGGREGATE json_agg_strict(anyelement)(\n SFUNC = json_agg_strict_sfunc,\n STYPE = jsonb,\n FINALFUNC = json_agg_strict_finalfunc,\n INITCOND = '[]'\n)",
21100+
"misc/issues-14.sql": "SELECT (1 IS NOT NULL) IS DISTINCT FROM (2 IS NOT NULL)",
2110021101
"misc/inflection-1.sql": "CREATE SCHEMA inflection",
2110121102
"misc/inflection-2.sql": "GRANT USAGE ON SCHEMA inflection TO PUBLIC",
2110221103
"misc/inflection-3.sql": "ALTER DEFAULT PRIVILEGES IN SCHEMA inflection \n GRANT EXECUTE ON FUNCTIONS TO PUBLIC",

__fixtures__/kitchen-sink/misc/issues.sql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,7 @@ CREATE AGGREGATE json_agg_strict(anyelement)(
6464
STYPE = jsonb,
6565
FINALFUNC = json_agg_strict_finalfunc,
6666
INITCOND = '[]'
67-
);
67+
);
68+
69+
-- https://github.com/launchql/pgsql-parser/issues/62
70+
SELECT (1 IS NOT NULL) IS DISTINCT FROM (2 IS NOT NULL);

packages/deparser/__tests__/kitchen-sink/misc-issues.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ it('misc-issues', async () => {
1616
"misc/issues-10.sql",
1717
"misc/issues-11.sql",
1818
"misc/issues-12.sql",
19-
"misc/issues-13.sql"
19+
"misc/issues-13.sql",
20+
"misc/issues-14.sql"
2021
]);
2122
});

packages/deparser/src/deparser.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,18 +438,42 @@ export class Deparser implements DeparserVisitor {
438438
'ALL',
439439
this.formatter.parens(this.visit(rexpr, context))
440440
]);
441-
case 'AEXPR_DISTINCT':
441+
case 'AEXPR_DISTINCT': {
442+
let leftExpr = this.visit(lexpr, context);
443+
let rightExpr = this.visit(rexpr, context);
444+
445+
// Add parentheses for complex expressions
446+
if (lexpr && this.isComplexExpression(lexpr)) {
447+
leftExpr = this.formatter.parens(leftExpr);
448+
}
449+
if (rexpr && this.isComplexExpression(rexpr)) {
450+
rightExpr = this.formatter.parens(rightExpr);
451+
}
452+
442453
return this.formatter.format([
443-
this.visit(lexpr, context),
454+
leftExpr,
444455
'IS DISTINCT FROM',
445-
this.visit(rexpr, context)
456+
rightExpr
446457
]);
447-
case 'AEXPR_NOT_DISTINCT':
458+
}
459+
case 'AEXPR_NOT_DISTINCT': {
460+
let leftExpr = this.visit(lexpr, context);
461+
let rightExpr = this.visit(rexpr, context);
462+
463+
// Add parentheses for complex expressions
464+
if (lexpr && this.isComplexExpression(lexpr)) {
465+
leftExpr = this.formatter.parens(leftExpr);
466+
}
467+
if (rexpr && this.isComplexExpression(rexpr)) {
468+
rightExpr = this.formatter.parens(rightExpr);
469+
}
470+
448471
return this.formatter.format([
449-
this.visit(lexpr, context),
472+
leftExpr,
450473
'IS NOT DISTINCT FROM',
451-
this.visit(rexpr, context)
474+
rightExpr
452475
]);
476+
}
453477
case 'AEXPR_NULLIF':
454478
return this.formatter.format([
455479
'NULLIF',

0 commit comments

Comments
 (0)