Always wrap filter conditions in parentheses (#1577)

* Always wrap filter conditions in parentheses

Fixes #1571
This commit is contained in:
gitgiggety 2021-07-14 10:29:59 +02:00 committed by GitHub
parent 1b20fd1ad6
commit a13f43c13b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 17 deletions

View file

@ -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 + ")"
}

View file

@ -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)
}

View file

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