fix(plpgsql-deparser): preserve ALIAS FOR declarations#312
Merged
Conversation
…metadata
libpg-query 18.1.2 serializes PL/pgSQL ALIAS declarations as an aliases
array on PLpgSQL_function ({name, varno, lineno}); previously the alias
name lived only in the compiler namespace and was dropped, so deparsed
bodies referenced undeclared names.
The deparser now renders 'name ALIAS FOR <datums[varno].refname>;',
interleaved with variable declarations by source lineno (variables win
ties) so an alias of a local variable follows its target's declaration.
Fixtures 63-65 cover positional-param, named-param/local-var interleaving,
and OLD/NEW trigger aliases.
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
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.
Summary
Closes the last PL/pgSQL round-trip gap:
ALIAS FORdeclarations were dropped on deparse, so bodies referenced undeclared names:The parser half already shipped —
libpg-query@18.1.2(which this repo now consumes) serializes aliases onPLpgSQL_function:This PR is the deparser half (nothing else renders it):
PLpgSQL_aliastype ({name, varno, lineno?}) onPLpgSQL_function.aliasesdeparseDeclareSectionemitsname ALIAS FOR <datums[varno].refname>;interleaved with variable declarations by sourcelineno(variables win ties, so an alias of a local variable follows its target's declaration)old/newtrigger aliases) + snapshot testsNote: the DECLARE section now round-trips exactly; a
RETURN <alias>body still deparses to the alias's target name (e.g.RETURN buffer/RETURN NEW) because the RETURN carriesretvarnopointing at the underlying datum — semantically identical and AST-round-trip-clean, just not textually the alias.Supersedes #308 (rebuilt fresh on current PG18
main; #308 can be closed).Local: plpgsql-deparser 109, plpgsql-parser 303, plpgsql-parse 9, parse 68 — all green against the published 18.1.2 parser.
Link to Devin session: https://app.devin.ai/sessions/eeb8deba0c04475091df703c88877302
Requested by: @pyramation