Repository navigation
Support :execresult, :batch*, more PostgreSQL types, composites, SQLite affinity - #43
Merged
Merged
Conversation
…le/attribute names, outer-join embeds, nested and undecoded PG arrays Co-Authored-By: Doron Eli Rachman <doron050@gmail.com>
…osite types, SQLite type affinity; unknown types fall back to untyped 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)".
|
4 tasks done
…wn-option errors, engine check, comments (#44) ## Summary Fixes the configuration and option gaps from the feature-gap analysis (section 1c). **Stacked on #43**, which is stacked on #42; retarget to `main` once those are merged. - **Overrides now apply to models.** Before, `overrides:` only affected query rows and parameters, so `Author#bio` kept the database type while `GetAuthorRow#bio` used 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. - Order of precedence: `Query:col` > `table.col` > `*:col` > `db_type`. - **`rename`**: `{authors: Writer, bio: biography}`. A table name (or `schema.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 of `emit_exact_table_names`): `authors` gives `Authors` instead of `Author`. - **Global options**: `GenerateRequest.global_options` (field 6, the plugin's entry in the top-level `options:` of `sqlc.yaml`) used to be ignored. It is now merged under the codegen options: the codegen options win, and the `overrides` of both apply. - **Unknown options are rejected** instead of silently ignored, with a hint for near misses: `unknown plugin options: generate_types (did you mean generateTypes?)`. - **Engine check**: `GenerateRequest.settings` (`version`, `engine`) is now decoded. A driver used with another engine (e.g. `driver: pg` with `engine: mysql`) is an error. - **Comments**: table and enum comments become doc comments of the models (`.rb` + `.rbs`), and column comments become comments in the RBS. The PG example gains `COMMENT ON` statements 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 - [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). Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Doron Eli Rachman <doron050@gmail.com>
…wrong-output Co-Authored-By: Doron Eli Rachman <doron050@gmail.com> # Conflicts: # examples/authors/postgresql/query.sql # examples/authors/postgresql/schema.sql # examples/pg/models.rb # examples/pg/models.rbs # examples/pg/query_sql.rb # examples/pg/query_sql.rbs # lib/sqlc_gen_ruby/code.rb # lib/sqlc_gen_ruby/drivers/pg.rb # lib/sqlc_gen_ruby/generator.rb # lib/sqlc_gen_ruby/method_gen.rb # lib/sqlc_gen_ruby/row_layout.rb # lib/sqlc_gen_ruby/type_resolver.rb # steep_expectations.yml # test/features_test.rb # test/fixtures/pg.bin # test/golden/pg/default/models.rb # test/golden/pg/default/models.rbs # test/golden/pg/default/my_queries_sql.rb # test/golden/pg/default/other_sql.rb # test/golden/pg/default/query_sql.rb # test/golden/pg/default/query_sql.rbs # test/golden/pg/ruby31_gemfile/models.rb # test/golden/pg/ruby31_gemfile/models.rbs # test/golden/pg/ruby31_gemfile/my_queries_sql.rb # test/golden/pg/ruby31_gemfile/other_sql.rb # test/golden/pg/ruby31_gemfile/query_sql.rb # test/golden/pg/ruby31_gemfile/query_sql.rbs # test/golden/pg/ruby32_notypes/models.rb # test/golden/pg/ruby32_notypes/my_queries_sql.rb # test/golden/pg/ruby32_notypes/other_sql.rb # test/golden/pg/ruby32_notypes/query_sql.rb # tests/end2end_pg.rb
…9-unsupported-features Co-Authored-By: Doron Eli Rachman <doron050@gmail.com>
devin-ai-integration
Bot
changed the base branch from
devin/1793571093-fix-wrong-output
to
main
November 3, 2026 13:03
doron050
approved these changes
Nov 3, 2026
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
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: returnsExecResult(rows_affected,last_insert_id). This is aDataclass (aStructbelow Ruby 3.2) nested in the query class. pg:result.cmd_tupleswithnillast id (useRETURNING). mysql2:stmt.affected_rows/client.last_id. sqlite3:client.changes/client.last_insert_row_id.:batchexec/:batchone/:batchmany: take anArrayof<Query>Args(the same kind ofDataclass:copyfromuses) and run the prepared statement once per element on one connection. They returnnil/Array[Row?]/Array[Array[Row]]. Available on all three drivers. This is sequential execution, not libpq pipeline mode.now(),unnest,any, domains) is typeduntyped. Models already did this.timetz,tsvector/tsquery,hstore,ltree/lquery/ltxtquery, geometric types, ranges and multiranges,reg*,pg_lsn, ... map toString, andoidmaps toInteger. These are the classes the pg gem returns; I checked each one against postgres:16. Pseudo-types (any,anyelement,record,void, ...) map tountyped.Schema.composite_types(protobuf field 5) is now decoded. Composite columns areString(the record text, e.g."(3,4)").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 hookaffinity_type.db_typeoverrides,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), SQLitedeclared_types, and:execresult/:batch*queries for all three engines. The fixtures are recaptured, andsteep_expectations.ymlis refreshed (line shifts only).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),rake end2end_mysql2(mysql:8.3),rake end2end_sqlite3.