Repository navigation
Conversation
An embedded struct is the model of its table, whose columns may not be nullable. When the table is on the nullable side of a LEFT, RIGHT or FULL JOIN the query returns NULLs the struct cannot hold, so the generated code compiled but failed at runtime with "converting NULL to string is unsupported". Report an error at generate time instead. The join walk is the one that already makes plain columns nullable (isTableRequired); embeds skipped it because their column carries no table. Only the top-level FROM clause is checked, as for plain columns. The error is returned together with the columns. A database analyzer discards inference errors and replaces the columns when none come back, which would have turned the embed into flat columns. Updates sqlc-dev#2997
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.
Updates #2997.
sqlc.embed(t)on the nullable side of an outer join generates code that compiles but fails at runtime when the row is missing (converting NULL to string is unsupported). The embedded struct is the table's model, so its fields aren't nullable.Plain columns are already made nullable by
isTableRequired, but embeds skipped it because their column has noTable.generatenow fails for this case instead:The join rules are the same as for plain columns (LEFT, RIGHT, FULL).
Embed.Param()is new so a self join likeusers a LEFT JOIN users bcan be told apart by alias.This only turns the runtime failure into a generate-time error, as #2858 did. A real fix needs a design choice (#2348). It is a breaking change for queries that work today because they never hit a missing row.
Limits:
FROMis checked, like plain columns, so embeds inside subqueries or CTEs are not covered.database:in the config) inference errors are discarded by design, so the query still generates as before. The error cases run in thebasecontext only for that reason.SQLC_TEST_CORE) doesn't support embeds yet.Test
New end-to-end cases
internal/endtoend/testdata/sqlc_embed_outer_join_*:left(SQLite, PostgreSQL),rightandselfexpect the error,okstill generates. The four error cases fail without the change.