fix(plpgsql-parser): multi-function scripts no longer all get the first function's body#302
Merged
Merged
Conversation
…-function scripts keep distinct bodies
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
In
plpgsql-parser, a script with multipleLANGUAGE plpgsqlfunctions deparsed every function with the FIRST function's body:Root cause:
extractFunctionInfocalledparsePlPgSQLSync(fullSql)— the whole script — so eachParsedFunction.plpgsql.rawcontained ALL functions, anddeparse/deparseSyncpair each statement withplpgsql_funcs?.[0], i.e. always the first.Fix in
parse(): slice each statement's own SQL from the source usingrawStmt.stmt_location/stmt_len(byte offsets, viaBuffer) and pass only that toparsePlPgSQLSync, soplpgsql_funcshas exactly one entry per function and the existing[0]pairing is correct.Tests: transform round-trip asserting each of three functions (incl. a trigger fn) keeps its own body exactly once, and a
parse()-level test assertingfunctions[i].plpgsql.rawcontains only its own function's AST. Full workspace suite passes.This was the bug noted in constructive-db's kitchen-sink fixture ("multiple PL/pgSQL functions in one file all receive the first function's body"), which forced its transform fixtures into a single comprehensive function.
Link to Devin session: https://app.devin.ai/sessions/eeb8deba0c04475091df703c88877302
Requested by: @pyramation