GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — fix(compiler): reject sqlc.embed on the nullable side of an outer join by meem3443 · Pull Request #4679 · sqlc-dev/sqlc

Conversation

@meem3443

@meem3443 meem3443 commented Nov 6, 2026

Copy link
Copy Markdown

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 no Table. generate now fails for this case instead:

query.sql:2:23: sqlc.embed(u) on the nullable side of an outer join is not supported

The join rules are the same as for plain columns (LEFT, RIGHT, FULL). Embed.Param() is new so a self join like users a LEFT JOIN users b can 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:

  • Only the top-level FROM is checked, like plain columns, so embeds inside subqueries or CTEs are not covered.
  • It only applies to the default analyzer. With a database analyzer (database: in the config) inference errors are discarded by design, so the query still generates as before. The error cases run in the base context only for that reason.
  • The analysis core (SQLC_TEST_CORE) doesn't support embeds yet.

Test

New end-to-end cases internal/endtoend/testdata/sqlc_embed_outer_join_*: left (SQLite, PostgreSQL), right and self expect the error, ok still generates. The four error cases fail without the change.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@meem3443
fix(compiler): reject sqlc.embed on the nullable side of an outer join
0842233
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

1 participant

@meem3443
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.