feat(deparser): add type-name quoting policy for minimal quoting in type positions #248
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.
feat(deparser): add type-name quoting policy for minimal quoting in type positions
Summary
This PR fixes over-quoting of user-defined schema-qualified type names that contain PostgreSQL keywords. Previously, types like
myschema.json,custom.int, andmyapp.booleanwere being emitted asmyschema."json",custom."int",myapp."boolean"because the deparser applied strict identifier quoting to all type name parts.The fix introduces a new "type-name quoting policy" that is less strict than standalone identifier quoting but still quotes RESERVED_KEYWORD:
SELECT '{"d":4}'::myschema."json"SELECT '{"d":4}'::myschema.jsonChanges:
quoteIdentifierTypeName()function that only quotes RESERVED_KEYWORD (allows COL_NAME_KEYWORD and TYPE_FUNC_NAME_KEYWORD unquoted)quoteTypeDottedName()for schema-qualified type namesTypeNamehandler to use new quoting for non-pg_catalog typesReview & Testing Checklist for Human
json,int,boolean) and TYPE_FUNC_NAME_KEYWORD (interval) unquoted in type positions. Test by running the generated SQL against a real PostgreSQL instance.myschema.selectstill get quoted correctly asmyschema."select"(the snapshots suggest this works, but manual verification recommended)quoteTypeDottedName()is the right choice for ALL non-pg_catalog typesRecommended test plan:
pnpm testin packages/deparser - quoting tests should passNotes
AlertLevelvsalertlevel) are unrelated to this changeLink to Devin run: https://app.devin.ai/sessions/713c834a5761453297e17345e1c1fd47
Requested by: Dan Lynch (@pyramation)