-
Notifications
You must be signed in to change notification settings - Fork 978
Refactor go codegen to plugin types #1460
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
stephen
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added some comments on things i was not sure about in the port
|
|
||
| PythonType python_type = 9; | ||
|
|
||
| ParsedGoType go_type = 10; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oh boy nice indent
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lol. I need to set up some tooling to auto format the proto files. For now, proto files should use spaces instead of tabs. It's not a big deal though.
| Comment: typ.Comment, | ||
| Vals: typ.Vals, | ||
| }) | ||
| case *catalog.CompositeType: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i assume the proto has Enums instead of Types because it it hard to represent a Enum | CompositeType in proto. this could also be a oneof maybe
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, you're correct that oneof is the correct way to handle this type of polymorphism. You can see this in the Python AST proto file. For now I'm happy to keep these as two separate arrays.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ah thanks, i missed the existing usage of oneof. i am happy to keep this as is or take a suggested refactor
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fine to keep this for now
| } | ||
|
|
||
| for _, ct := range schema.CompositeTypes { | ||
| // XXX: old code had a bug? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i think the old code... did not check that the name/schema actually matched? but this is conjecture and i did not try to write a test
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I think the current composite type support is broken at best, so this feels like a step in the right direction.
|
This is awesome! Hoping to review this later tonight |
kyleconroy
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few small changes, but overall this is really close.
| Comment: typ.Comment, | ||
| Vals: typ.Vals, | ||
| }) | ||
| case *catalog.CompositeType: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, you're correct that oneof is the correct way to handle this type of polymorphism. You can see this in the Python AST proto file. For now I'm happy to keep these as two separate arrays.
internal/codegen/golang/compat.go
Outdated
| ) | ||
|
|
||
| func sameTableName(n *ast.TableName, f core.FQN, defaultSchema string) bool { | ||
| func sameTableName(n *plugin.Identifier, f core.FQN, defaultSchema string) bool { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should refactor this to match the signature from the codegen/python so that it doesn't depend on the core package.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done!
internal/codegen/golang/result.go
Outdated
| for _, p := range query.Params { | ||
| cols = append(cols, goColumn{ | ||
| id: p.Number, | ||
| id: int(p.Number), // XXX: ?? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Go can be weird. Casting a int32 to an int is fine.
| } | ||
|
|
||
| for _, ct := range schema.CompositeTypes { | ||
| // XXX: old code had a bug? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I think the current composite type support is broken at best, so this feels like a step in the right direction.
|
|
||
| PythonType python_type = 9; | ||
|
|
||
| ParsedGoType go_type = 10; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lol. I need to set up some tooling to auto format the proto files. For now, proto files should use spaces instead of tabs. It's not a big deal though.
protos/plugin/codegen.proto
Outdated
| repeated Parameter params = 5 [json_name="parameters"]; | ||
| repeated string comments = 6 [json_name="comments"]; | ||
| string filename = 7 [json_name="filename"]; | ||
| Identifier InsertIntoTable = 8; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be insert_into_table.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed, thanks
|
thanks for looking! i addressed/responded to comments here. |
| func goInnerType(r *compiler.Result, col *compiler.Column, settings config.CombinedSettings) string { | ||
| columnType := col.DataType | ||
| func goInnerType(req *plugin.CodeGenRequest, col *plugin.Column) string { | ||
| columnType := dataType(col.Type) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oh, one more thought: it might be worth removing DataType from the proto. I fell into the pit where it's not actually filled but available on the struct.
I suspect that https://github.com/stephen/sqlc/blame/32f4c968857273582f71d01b72fdf85589548f1d/internal/codegen/python/gen.go#L199 might be wrong? probably wants to also dataType(col.Type)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having both is confusing and error-prone. Let's remove it in another PR
See sqlc-dev#1460 (comment) DataType is never filled in so this comparison is buggy. This change mirrors what the go gen.go does instead.
See sqlc-dev#1460 (comment) DataType is never filled in so this comparison is buggy. This change mirrors what the go gen.go does instead. Deleting a field from proto can be not safe for compat, so we could use https://developers.google.com/protocol-buffers/docs/proto3#reserved, but I think these protos are transient so it should be ok.
See #288, #923, #1416 .
(hi @kyleconroy!)
I got excited about the plugin api and wanted to try a few things out with the golang code generation...
There are a couple questionable things in here that I wasn't sure about - will add some comments about them. If you think this work is worth continuing with, I'd be happy to try to clean it up and put it in an upstreamable state.
The tests currently pass.