-
Notifications
You must be signed in to change notification settings - Fork 834
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
Postgres: casting result to text results in sqlc generating a string instead of a nullable string #3710
Comments
I have tried changing my query to the json operator to specifically extract as text: -- name: MyGet :many
SELECT *, mt.myjson->'thing1'->>'thing2'
FROM "mytable" mt; This results in an output model using type MyGetRow struct {
ID int64 `json:"id"`
Myjson []byte `json:"myjson"`
Column3 interface{} `json:"column_3"`
} This is despite the docs saying that the I have also tried adding a case statement to try to make it clear to SQLC that the result can be null: -- name: MyGet :many
SELECT *, CASE WHEN mt.myjson @? '$.thing1.thing2' THEN (mt.myjson->'thing1'->'thing2')::text ELSE null::text END
FROM "mytable" mt; When using I have also tried switching the type from a text to an enum, but the results are the same. To be clear, my goal is to have the output model be: type MyGetRow struct {
ID int64 `json:"id"`
Myjson []byte `json:"myjson"`
Column3 pgtype.Text `json:"column_3"`
} I definitely thought that |
hi, I have created PR to allow any selected column with json operator in type cast to be nullable column. let me know if you have any comments on that. is it working on your side? |
I think the problem is more than just JSON operators, though your PR would help quite a bit. The following cases should all generate a function that returns -- name: GetNullable1 :many
SELECT null::text
FROM "mytable";
-- name: GetNullable2 :many
SELECT CASE WHEN true THEN 'hello'::text ELSE null::text END
FROM "mytable";
-- name: GetNullable3 :many
SELECT CASE WHEN true THEN 'hello'::text ELSE null END
FROM "mytable";
-- name: GetNullable4 :many
SELECT CASE WHEN true THEN 'hello'::text END
FROM "mytable";
-- name: GetNullable5 :many
SELECT (mt.myjson->'thing1'->'thing2')::text
FROM "mytable";
-- name: GetNullable6 :many
SELECT mt.myjson->'thing1'->>'thing2'
FROM "mytable"; The first ( But the second one ( And the next two, ( The last ones your PR might cover. And Those 6 above would be the test cases I would like added to this library. All should return |
Really appreciate your feedback. I have added your test cases and few other test cases to make sure that it's really working. Let me know if you have any comments on the PR #3739 |
Version
1.27.0
What happened?
panic: can't scan into dest[2]: cannot scan NULL into *string
I receive this error because the result has nulls in it, but SQLC has generated an output struct where the column is not nullable.
Running the same query manually:
Returns:
Running a golang query using the generated code:
Gives:
The generated output model:
The problem stems from the fact that postgres casts allow null, while SQLC is assuming casts means NOT NULL.
I can see that on the parameter/argument side of things, sqlc has
sqlc.narg()
for helping clarify the situation.However, on the generated struct side, there doesn't appear to be anything easy to help fix this situation.
Expectation
The generated output model should be:
Relevant log output
No response
Database schema
SQL queries
Configuration
Playground URL
https://play.sqlc.dev/p/50bf69bcc997f524318e1c0fbcf9bc5c5e342c327f6eb2f7901a25756727547d
What operating system are you using?
Linux, macOS
What database engines are you using?
PostgreSQL
What type of code are you generating?
Go
The text was updated successfully, but these errors were encountered: