Title: Empty union base definitions rejected before extensions are merged (spec violation) · Issue #4200 · graphql-java/graphql-java · GitHub
Open Graph Title: Empty union base definitions rejected before extensions are merged (spec violation) · Issue #4200 · graphql-java/graphql-java
X Title: Empty union base definitions rejected before extensions are merged (spec violation) · Issue #4200 · graphql-java/graphql-java
Description: Describe the bug The spec grammar: (UnionTypeDefinition : Description? union Name Directives[Const]? UnionMemberTypes?) makes UnionMemberTypes optional. SchemaParser correctly parses this SDL and TypeDefinitionRegistry correctly shows th...
Open Graph Description: Describe the bug The spec grammar: (UnionTypeDefinition : Description? union Name Directives[Const]? UnionMemberTypes?) makes UnionMemberTypes optional. SchemaParser correctly parses this SDL and T...
X Description: Describe the bug The spec grammar: (UnionTypeDefinition : Description? union Name Directives[Const]? UnionMemberTypes?) makes UnionMemberTypes optional. SchemaParser correctly parses this SDL and T...
Opengraph URL: https://github.com/graphql-java/graphql-java/issues/4200
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Empty union base definitions rejected before extensions are merged (spec violation)","articleBody":"**Describe the bug**\n\nThe spec grammar:\n```\n(UnionTypeDefinition : Description? union Name Directives[Const]? UnionMemberTypes?)\n```\nmakes UnionMemberTypes optional. SchemaParser correctly parses this SDL and TypeDefinitionRegistry correctly shows the union extensions. However, SchemaGenerator.makeExecutableSchema() fails validation with:\n```\nSchemaProblem{errors=[Union type 'Pet' must include one or more member types.]}\n```\nRoot cause is that the validation checks the base definition before merging extension members (which isn't done for other types like interfaces). For deeper dive on root cause see [this link](https://chatgpt.com/s/dr_6959b10af4308191bd5c920346071456).\n\n(GraphQL Java 25.0)\n\n**To Reproduce**\n```\nimport graphql.schema.idl.SchemaParser\nimport graphql.schema.idl.UnExecutableSchemaGenerator\nimport org.junit.jupiter.api.Test\n\n/**\n * Demonstrates a graphql-java bug: empty union base definitions with members\n * added via extensions are rejected, even though the GraphQL spec allows this.\n *\n * The spec grammar (UnionTypeDefinition : Description? union Name Directives[Const]? UnionMemberTypes?)\n * makes UnionMemberTypes optional. SchemaParser correctly parses this SDL and\n * TypeDefinitionRegistry correctly shows the union extensions. However,\n * SchemaGenerator.makeExecutableSchema() fails validation with:\n *\n * SchemaProblem{errors=[Union type 'Pet' must include one or more member types.]}\n *\n * The validation checks the base definition before merging extension members.\n */\nclass UnionTest {\n @Test\n fun `test empty union base`() {\n val sdl = \"\"\"\n type Cat { meow: String }\n type Dog { bark: String }\n union Pet\n extend union Pet = Cat | Dog\n type Query { pet: Pet }\n \"\"\".trimIndent()\n\n val registry = SchemaParser().parse(sdl)\n\n println(\"=== Registry parsed successfully ===\")\n println(\"Types: ${registry.types().keys}\")\n println(\"Union extensions: ${registry.unionTypeExtensions()}\")\n\n try {\n val schema = UnExecutableSchemaGenerator.makeUnExecutableSchema(registry)\n println(\"=== Schema built successfully ===\")\n } catch (e: Exception) {\n println(\"=== Exception ===\")\n println(\"Class: ${e.javaClass.name}\")\n println(\"Message: ${e.message}\")\n e.printStackTrace()\n throw e\n }\n }\n}\n```\n","author":{"url":"https://github.com/rstata","@type":"Person","name":"rstata"},"datePublished":"2026-01-04T00:13:26.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/4200/graphql-java/issues/4200"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:33a160c6-1627-02a5-0b3d-e3a4b71c1a87 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DC0E:CC8BA:59AFCD:7F9C91:696F8505 |
| html-safe-nonce | 9f80a427096e9f4d313e7a19a29575ce41282fde69505240c905ac009e1ce716 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQzBFOkNDOEJBOjU5QUZDRDo3RjlDOTE6Njk2Rjg1MDUiLCJ2aXNpdG9yX2lkIjoiMjU1NDQyNzAzMzY1MTIxNzY2OSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 06e3b4077f52521c806f65975b0eb7b0dd504780775d8a23911aa339a2720c50 |
| hovercard-subject-tag | issue:3778615768 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/graphql-java/graphql-java/4200/issue_layout |
| twitter:image | https://opengraph.githubassets.com/a4096a5fc63660fb684086c85ecedcc04b700825e411f3f5e3af4390afb87a30/graphql-java/graphql-java/issues/4200 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/a4096a5fc63660fb684086c85ecedcc04b700825e411f3f5e3af4390afb87a30/graphql-java/graphql-java/issues/4200 |
| og:image:alt | Describe the bug The spec grammar: (UnionTypeDefinition : Description? union Name Directives[Const]? UnionMemberTypes?) makes UnionMemberTypes optional. SchemaParser correctly parses this SDL and T... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | rstata |
| hostname | github.com |
| expected-hostname | github.com |
| None | c1b02b4e3a8edff2fe0bd71b0551654be66034591c7ab65aaaaf61a6096862d3 |
| turbo-cache-control | no-preview |
| go-import | github.com/graphql-java/graphql-java git https://github.com/graphql-java/graphql-java.git |
| octolytics-dimension-user_id | 14289921 |
| octolytics-dimension-user_login | graphql-java |
| octolytics-dimension-repository_id | 38602457 |
| octolytics-dimension-repository_nwo | graphql-java/graphql-java |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 38602457 |
| octolytics-dimension-repository_network_root_nwo | graphql-java/graphql-java |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 4a1073fcc34432ac33cec03885ff2d96920686de |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width