Skip to content

Support dynamic where clauses #2060

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
go-aegian opened this issue Feb 11, 2023 · 10 comments
Open

Support dynamic where clauses #2060

go-aegian opened this issue Feb 11, 2023 · 10 comments

Comments

@go-aegian
Copy link

go-aegian commented Feb 11, 2023

apart from the predefined where clause, it needs somehow to be able to support passing a string containing a filter clause that it's parameters are already resolved prior to the Query function, I proposed a possible solution to be able to declare in the sql definition something like this

-- name: ListOrders :many
  select * from order where status = $1 and (@filter::text);

Generated

const listOrders = "select * from order where status = $1 and (@filter::text);"

 type ListOrdersParams struct {
       Status string
       Filter string
}
func (q *Queries) ListOrders(ctx context.Context, arg ListOrdersParams) ([]*ListOrdersRow, error) {
        filter:=arg.Filter
        if filter=="" {
           filter = "1=1"
        }
        listOrdersWithFilter = strings.Replace(listOrders, "@filter::text", filter, -1)

	rows, err := q.db.Query(ctx, listOrdersWithFilter, arg.Status)

...

What database engines need to be changed?

PostgreSQL, MySQL

What programming language backends need to be changed?

Go, Python, Kotlin

@go-aegian go-aegian added enhancement New feature or request triage New issues that hasn't been reviewed labels Feb 11, 2023
@kyleconroy kyleconroy added 📚 mysql 📚 postgresql 🔧 golang and removed triage New issues that hasn't been reviewed labels Jun 7, 2023
@jwc-clinnection
Copy link
Contributor

I have implemented this in #2343

@go-aegian
Copy link
Author

Thank you @jwc-clinnection once the release is available I'll check it out

@jwc-clinnection
Copy link
Contributor

It is failing some tests. For example this is an expected change given the pull request:

                -               rows, err := q.db.Query(ctx, joinTextArray)
                +               sql := joinTextArray
                +       
                +               rows, err := q.db.Query(ctx, sql)

I tried:

make build-endtoend
cd ./internal/endtoend/testdata && go build ./...

But, I still get errors when I run:

make test

Should I be doing something to regenerate the test samples? If so, may I have some guidance on the procedure?

@jwc-clinnection
Copy link
Contributor

Thank you @jwc-clinnection once the release is available I'll check it out

@go-aegian Can you give any direction? Thank you.

@go-aegian
Copy link
Author

@jwc-clinnection unfortunately I can't help you on this as I am not familiar how is it compiled, tested. That is why I wait for a released version.

@jwc-clinnection
Copy link
Contributor

@kyleconroy The tests that this is failing are expected given the changes. Can you give me advice as to how to proceed to correct the tests?

@iancharters
Copy link

Any movement on this? I would really like to be able to leverage this in our codebases that use sqlc.

@go-aegian
Copy link
Author

@jwc-clinnection have you got any advice from @kyleconroy on how to move this forward to the release?

In the meantime I did manage a workaround process until your work is released though.

@victoraugustolls
Copy link
Contributor

@kyleconroy, any news here? I'm open to help in any way I can. Dynamic filters are a really useful feature that would allow us to use sqlc in some queries that we opt to use squirrel instead.

@emilecaron
Copy link
Contributor

@jwc-clinnection have you got any advice from @kyleconroy on how to move this forward to the release?

In the meantime I did manage a workaround process until your work is released though.

would you care to elaborate on this workaround ?

# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

No branches or pull requests

6 participants