mirror of
https://github.com/stashapp/stash.git
synced 2025-12-06 16:34:02 +01:00
Always wrap filter conditions in parentheses (#1577)
* Always wrap filter conditions in parentheses Fixes #1571
This commit is contained in:
parent
1b20fd1ad6
commit
a13f43c13b
3 changed files with 18 additions and 17 deletions
|
|
@ -310,7 +310,7 @@ func (f *filterBuilder) andClauses(input []sqlClause) (string, []interface{}) {
|
|||
}
|
||||
|
||||
if len(clauses) > 0 {
|
||||
c := strings.Join(clauses, " AND ")
|
||||
c := "(" + strings.Join(clauses, ") AND (") + ")"
|
||||
if len(clauses) > 1 {
|
||||
c = "(" + c + ")"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -252,14 +252,14 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
// ensure single where clause is generated correctly
|
||||
f.addWhere(clause1)
|
||||
r, rArgs := f.generateWhereClauses()
|
||||
assert.Equal(clause1, r)
|
||||
assert.Equal(fmt.Sprintf("(%s)", clause1), r)
|
||||
assert.Len(rArgs, 0)
|
||||
|
||||
// ensure multiple where clauses are surrounded with parenthesis and
|
||||
// ANDed together
|
||||
f.addWhere(clause2, arg1, arg2)
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s AND %s)", clause1, clause2), r)
|
||||
assert.Equal(fmt.Sprintf("((%s) AND (%s))", clause1, clause2), r)
|
||||
assert.Len(rArgs, 2)
|
||||
|
||||
// ensure empty subfilter is not added to generated where clause
|
||||
|
|
@ -267,13 +267,13 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.and(sf)
|
||||
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s AND %s)", clause1, clause2), r)
|
||||
assert.Equal(fmt.Sprintf("((%s) AND (%s))", clause1, clause2), r)
|
||||
assert.Len(rArgs, 2)
|
||||
|
||||
// ensure sub-filter is generated correctly
|
||||
sf.addWhere(clause3, arg3)
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s AND %s) AND (%s)", clause1, clause2, clause3), r)
|
||||
assert.Equal(fmt.Sprintf("((%s) AND (%s)) AND ((%s))", clause1, clause2, clause3), r)
|
||||
assert.Len(rArgs, 3)
|
||||
|
||||
// ensure OR sub-filter is generated correctly
|
||||
|
|
@ -283,7 +283,7 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.or(sf)
|
||||
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s AND %s) OR (%s)", clause1, clause2, clause3), r)
|
||||
assert.Equal(fmt.Sprintf("((%s) AND (%s)) OR ((%s))", clause1, clause2, clause3), r)
|
||||
assert.Len(rArgs, 3)
|
||||
|
||||
// ensure NOT sub-filter is generated correctly
|
||||
|
|
@ -293,7 +293,7 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.not(sf)
|
||||
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s AND %s) AND NOT (%s)", clause1, clause2, clause3), r)
|
||||
assert.Equal(fmt.Sprintf("((%s) AND (%s)) AND NOT ((%s))", clause1, clause2, clause3), r)
|
||||
assert.Len(rArgs, 3)
|
||||
|
||||
// ensure empty filter with ANDed sub-filter does not include AND
|
||||
|
|
@ -301,7 +301,7 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.and(sf)
|
||||
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s)", clause3), r)
|
||||
assert.Equal(fmt.Sprintf("((%s))", clause3), r)
|
||||
assert.Len(rArgs, 1)
|
||||
|
||||
// ensure empty filter with ORed sub-filter does not include OR
|
||||
|
|
@ -309,7 +309,7 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.or(sf)
|
||||
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("(%s)", clause3), r)
|
||||
assert.Equal(fmt.Sprintf("((%s))", clause3), r)
|
||||
assert.Len(rArgs, 1)
|
||||
|
||||
// ensure empty filter with NOTed sub-filter does not include AND
|
||||
|
|
@ -317,7 +317,7 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.not(sf)
|
||||
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("NOT (%s)", clause3), r)
|
||||
assert.Equal(fmt.Sprintf("NOT ((%s))", clause3), r)
|
||||
assert.Len(rArgs, 1)
|
||||
|
||||
// (clause1) AND ((clause2) OR (clause3))
|
||||
|
|
@ -328,7 +328,7 @@ func TestGenerateWhereClauses(t *testing.T) {
|
|||
f.and(sf2)
|
||||
sf2.or(sf)
|
||||
r, rArgs = f.generateWhereClauses()
|
||||
assert.Equal(fmt.Sprintf("%s AND (%s OR (%s))", clause1, clause2, clause3), r)
|
||||
assert.Equal(fmt.Sprintf("(%s) AND ((%s) OR ((%s)))", clause1, clause2, clause3), r)
|
||||
assert.Len(rArgs, 3)
|
||||
}
|
||||
|
||||
|
|
@ -348,14 +348,14 @@ func TestGenerateHavingClauses(t *testing.T) {
|
|||
// ensure single Having clause is generated correctly
|
||||
f.addHaving(clause1)
|
||||
r, rArgs := f.generateHavingClauses()
|
||||
assert.Equal(clause1, r)
|
||||
assert.Equal(fmt.Sprintf("(%s)", clause1), r)
|
||||
assert.Len(rArgs, 0)
|
||||
|
||||
// ensure multiple Having clauses are surrounded with parenthesis and
|
||||
// ANDed together
|
||||
f.addHaving(clause2, arg1, arg2)
|
||||
r, rArgs = f.generateHavingClauses()
|
||||
assert.Equal("("+clause1+" AND "+clause2+")", r)
|
||||
assert.Equal("(("+clause1+") AND ("+clause2+"))", r)
|
||||
assert.Len(rArgs, 2)
|
||||
|
||||
// ensure empty subfilter is not added to generated Having clause
|
||||
|
|
@ -363,13 +363,13 @@ func TestGenerateHavingClauses(t *testing.T) {
|
|||
f.and(sf)
|
||||
|
||||
r, rArgs = f.generateHavingClauses()
|
||||
assert.Equal("("+clause1+" AND "+clause2+")", r)
|
||||
assert.Equal("(("+clause1+") AND ("+clause2+"))", r)
|
||||
assert.Len(rArgs, 2)
|
||||
|
||||
// ensure sub-filter is generated correctly
|
||||
sf.addHaving(clause3, arg3)
|
||||
r, rArgs = f.generateHavingClauses()
|
||||
assert.Equal("("+clause1+" AND "+clause2+") AND ("+clause3+")", r)
|
||||
assert.Equal("(("+clause1+") AND ("+clause2+")) AND (("+clause3+"))", r)
|
||||
assert.Len(rArgs, 3)
|
||||
|
||||
// ensure OR sub-filter is generated correctly
|
||||
|
|
@ -379,7 +379,7 @@ func TestGenerateHavingClauses(t *testing.T) {
|
|||
f.or(sf)
|
||||
|
||||
r, rArgs = f.generateHavingClauses()
|
||||
assert.Equal("("+clause1+" AND "+clause2+") OR ("+clause3+")", r)
|
||||
assert.Equal("(("+clause1+") AND ("+clause2+")) OR (("+clause3+"))", r)
|
||||
assert.Len(rArgs, 3)
|
||||
|
||||
// ensure NOT sub-filter is generated correctly
|
||||
|
|
@ -389,7 +389,7 @@ func TestGenerateHavingClauses(t *testing.T) {
|
|||
f.not(sf)
|
||||
|
||||
r, rArgs = f.generateHavingClauses()
|
||||
assert.Equal("("+clause1+" AND "+clause2+") AND NOT ("+clause3+")", r)
|
||||
assert.Equal("(("+clause1+") AND ("+clause2+")) AND NOT (("+clause3+"))", r)
|
||||
assert.Len(rArgs, 3)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
### 🐛 Bug fixes
|
||||
* Fix is missing date scene criterion causing invalid SQL. ([#1577](https://github.com/stashapp/stash/pull/1577))
|
||||
* Fix rendering of carousel images on Apple devices. ([#1562](https://github.com/stashapp/stash/pull/1562))
|
||||
* Show New and Delete buttons in mobile view. ([#1539](https://github.com/stashapp/stash/pull/1539))
|
||||
Loading…
Reference in a new issue