Repository navigation
Options: model/table/db_type overrides, rename, global options, unknown-option errors, engine check, comments - #44
Merged
doron050 merged 1 commit intoNov 3, 2026
Conversation
…mes, global options, unknown-option errors, engine check, schema comments Co-Authored-By: Doron Eli Rachman <doron050@gmail.com>
Contributor
Author
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
doron050
approved these changes
Nov 3, 2026
4 tasks done
doron050
added a commit
that referenced
this pull request
Nov 3, 2026
…te affinity (#43) ## Summary Adds the sqlc features from the feature-gap analysis (section 1b) that used to make generation fail with an error. It also contains the section 1c options work from #44, which was merged into this branch. - **`:execresult`**: returns `ExecResult` (`rows_affected`, `last_insert_id`). This is a `Data` class (a `Struct` below Ruby 3.2) nested in the query class. pg: `result.cmd_tuples` with `nil` last id (use `RETURNING`). mysql2: `stmt.affected_rows` / `client.last_id`. sqlite3: `client.changes` / `client.last_insert_row_id`. - **`:batchexec` / `:batchone` / `:batchmany`**: take an `Array` of `<Query>Args` (the same kind of `Data` class `:copyfrom` uses) and run the prepared statement once per element on one connection. They return `nil` / `Array[Row?]` / `Array[Array[Row]]`. Available on all three drivers. This is sequential execution, not libpq pipeline mode. - **Unknown types no longer abort generation**: a query column or parameter whose type the plugin doesn't map (e.g. `now()`, `unnest`, `any`, domains) is typed `untyped`. Models already did this. - **More PostgreSQL types**: `timetz`, `tsvector` / `tsquery`, `hstore`, `ltree` / `lquery` / `ltxtquery`, geometric types, ranges and multiranges, `reg*`, `pg_lsn`, ... map to `String`, and `oid` maps to `Integer`. These are the classes the pg gem returns; I checked each one against postgres:16. Pseudo-types (`any`, `anyelement`, `record`, `void`, ...) map to `untyped`. - **Composite types**: `Schema.composite_types` (protobuf field 5) is now decoded. Composite columns are `String` (the record text, e.g. `"(3,4)"`). - **SQLite declared types**: `VARCHAR(255)`, `DECIMAL(10, 5)`, `UNSIGNED BIG INT`, `NATIVE CHARACTER(70)` are normalized. Types that no mapping matches follow SQLite's type-affinity rules, through a new driver hook `affinity_type`. - **Options (from #44)**: model/table/`db_type` overrides, `rename`, `exactTableNames`, global options, errors for unknown options, engine/driver check, schema/table/column/enum comments as doc comments. **Breaking**: configs with misspelled option names now fail. Domains stay `untyped`: sqlc sends only the domain name, not its base type. The examples gain `postgres_special_types` (incl. a composite type and a domain), SQLite `declared_types`, and `:execresult` / `:batch*` queries for all three engines. The fixtures are recaptured, and `steep_expectations.yml` is refreshed (line shifts only). ## Checklist - [x] `examples/` is regenerated (`rake sqlc_generate_process`) and committed - [x] Tests added or updated (`rake test`, and `rake end2end_*` when the generated code changes) - [x] The generated code stays RuboCop-clean (`rake rubocop`) and Steep-clean (`rake steep`) - [x] Labelled (`feature`, `bug`, `breaking`, `documentation`) so the release notes are grouped correctly Tested locally: `rake test`, `rake rubocop steep`, `rake end2end_pg` (postgres:16), `rake end2end_mysql2` (mysql:8.3), `rake end2end_sqlite3`. --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Doron Eli Rachman <doron050@gmail.com>
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
Fixes the configuration and option gaps from the feature-gap analysis (section 1c). Stacked on #43, which is stacked on #42; retarget to
mainonce those are merged.overrides:only affected query rows and parameters, soAuthor#biokept the database type whileGetAuthorRow#bioused the override.*:<column>now also applies to models. Two new forms work like sqlc's Go overrides:column: "<table>.<column>"(or"<schema>.<table>.<column>"): the table's model plus every query column that sqlc reports as coming from that table.db_type: "uuid": every column or parameter of that database type.Query:col>table.col>*:col>db_type.rename:{authors: Writer, bio: biography}. A table name (orschema.table) sets the model class name. A column name sets the attribute name in rows and models; the value is still read by the original column name. Class names are validated.exactTableNames(the equivalent ofemit_exact_table_names):authorsgivesAuthorsinstead ofAuthor.GenerateRequest.global_options(field 6, the plugin's entry in the top-leveloptions:ofsqlc.yaml) used to be ignored. It is now merged under the codegen options: the codegen options win, and theoverridesof both apply.unknown plugin options: generate_types (did you mean generateTypes?).GenerateRequest.settings(version,engine) is now decoded. A driver used with another engine (e.g.driver: pgwithengine: mysql) is an error..rb+.rbs), and column comments become comments in the RBS. The PG example gainsCOMMENT ONstatements to show this.Breaking: configs with misspelled or unsupported option keys now fail. Models change type when an existing
*:<column>override matches one of their columns.The fixtures are recaptured; they now include
settings.Checklist
examples/is regenerated (rake sqlc_generate_process) and committedrake test, andrake end2end_*when the generated code changes)rake rubocop) and Steep-clean (rake steep)feature,bug,breaking,documentation) so the release notes are grouped correctlyTested locally:
rake test,rake rubocop steep,rake end2end_pg(postgres:16).