sqlc icon indicating copy to clipboard operation
sqlc copied to clipboard

Support dynamic where clauses

Open go-aegian opened this issue 2 years ago • 9 comments

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 avatar Feb 11 '23 18:02 go-aegian

I have implemented this in #2343

jwc-clinnection avatar Jun 20 '23 17:06 jwc-clinnection

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

go-aegian avatar Jun 20 '23 17:06 go-aegian

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 avatar Jun 21 '23 19:06 jwc-clinnection

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

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

jwc-clinnection avatar Jun 28 '23 16:06 jwc-clinnection

@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.

go-aegian avatar Jun 28 '23 17:06 go-aegian

@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?

jwc-clinnection avatar Jun 28 '23 17:06 jwc-clinnection

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

iancharters avatar Jul 11 '23 00:07 iancharters

@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.

go-aegian avatar Jul 22 '23 14:07 go-aegian

@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.

victoraugustolls avatar May 29 '24 02:05 victoraugustolls

@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 ?

emilecaron avatar Jul 24 '24 15:07 emilecaron