Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
normalize_astnow flattens nestedBoolExprnodes that use the same operator, so that redundant parentheses do not make two semantically identical ASTs compare different.Only same-operator
ANDandORare flattened.NOT, and any mix ofANDandOR, keep their original tree shape - there the parentheses carry meaning.Why
PostgreSQL builds a left-leaning tree whose shape depends on where the author put redundant parentheses.
The printer normalizes that away, so the reparsed output legitimately differs in shape from the input AST, and the beta round-trip guard reports
Normalized ASTs differ after formattingon a statement the printer handled perfectly.The result is that a
WHEREclause with a few grouped conditions (routine in generated or hand-tuned ETL SQL) is silently never formatted.Implementation
The pass walks
BoolExprnodes and processes descendants first: flattening a parent moves its children, so child pointers must not be used after their parent has been normalized.Tests
A
multifixture covering a real-worldCREATE TABLE ASwith nested same-operator groups, plus the two one-liners above (one flattened, one deliberately not), snapshotted at widths 80 and 100.