From 244ae1a162f61b033a5d4e52465c0e554f65f5ee Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Wed, 22 Jul 2026 19:36:47 +0300 Subject: [PATCH] updated fexpr --- go.mod | 2 +- go.sum | 4 ++-- tools/search/filter_test.go | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 8be65d1f..c6596507 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/fatih/color v1.19.0 github.com/fsnotify/fsnotify v1.10.1 github.com/gabriel-vasile/mimetype v1.4.13 - github.com/ganigeorgiev/fexpr v0.5.0 + github.com/ganigeorgiev/fexpr v0.6.0 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/pocketbase/dbx v1.12.0 github.com/pocketbase/ozzo-validation/v4 v4.3.0 diff --git a/go.sum b/go.sum index 61043f37..31db4bbb 100644 --- a/go.sum +++ b/go.sum @@ -28,8 +28,8 @@ github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx5 github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= -github.com/ganigeorgiev/fexpr v0.5.0 h1:XA9JxtTE/Xm+g/JFI6RfZEHSiQlk+1glLvRK1Lpv/Tk= -github.com/ganigeorgiev/fexpr v0.5.0/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE= +github.com/ganigeorgiev/fexpr v0.6.0 h1:Fza3O/QMBKEudUvxV862qe6GjxM60GJjjKytdp+VQus= +github.com/ganigeorgiev/fexpr v0.6.0/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE= github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= diff --git a/tools/search/filter_test.go b/tools/search/filter_test.go index a5bf81e8..df8fd08f 100644 --- a/tools/search/filter_test.go +++ b/tools/search/filter_test.go @@ -215,7 +215,8 @@ func TestFilterDataBuildExprWithParams(t *testing.T) { test9 = {:test9} || test10 = {:test10} || test11 = {:test11} || - test12 = {:test12} + test12 = {:test12} || + test13 = {:test13} `) replacements := []dbx.Params{ @@ -223,10 +224,11 @@ func TestFilterDataBuildExprWithParams(t *testing.T) { {"test2": false}, {"test3": 123.456}, {"test4": nil}, - {"test5": "", "test6": "simple", "test7": `'single_quotes'`, "test8": `"double_quotes"`, "test9": `escape\"quote`}, + {"test5": "", "test6": "simple", "test7": `'single_quotes'`, "test8": `"double_quotes"`, "test9": "'\"quote_with_backslash\\"}, {"test10": date}, - {"test11": []string{"a", "b", `"quote`}}, + {"test11": []string{"a", "'quote", `"quote`}}, {"test12": map[string]any{"a": 123, "b": `quote"`}}, + {"test13": "a\nb"}, } expr, err := filter.BuildExpr(resolver, replacements...) @@ -240,7 +242,8 @@ func TestFilterDataBuildExprWithParams(t *testing.T) { t.Fatalf("Expected 1 query, got %d", len(calledQueries)) } - expectedQuery := `SELECT * WHERE ([[test1]] = 1 OR [[test2]] = 0 OR [[test3a]] = 123.456 OR [[test3b]] = 123.456 OR ([[test4]] = '' OR [[test4]] IS NULL) OR [[test5]] = '""' OR [[test6]] = 'simple' OR [[test7]] = '''single_quotes''' OR [[test8]] = '"double_quotes"' OR [[test9]] = 'escape\\"quote' OR [[test10]] = '2023-01-01 00:00:00 +0000 UTC' OR [[test11]] = '["a","b","\\"quote"]' OR [[test12]] = '{"a":123,"b":"quote\\""}')` + expectedQuery := `SELECT * WHERE ([[test1]] = 1 OR [[test2]] = 0 OR [[test3a]] = 123.456 OR [[test3b]] = 123.456 OR ([[test4]] = '' OR [[test4]] IS NULL) OR [[test5]] = '""' OR [[test6]] = 'simple' OR [[test7]] = '''single_quotes''' OR [[test8]] = '"double_quotes"' OR [[test9]] = '''"quote_with_backslash\' OR [[test10]] = '2023-01-01 00:00:00 +0000 UTC' OR [[test11]] = '["a","''quote","\"quote"]' OR [[test12]] = '{"a":123,"b":"quote\""}' OR [[test13]] = 'a` + expectedQuery += "\nb')" if expectedQuery != calledQueries[0] { t.Fatalf("Expected query \n%s, \ngot \n%s", expectedQuery, calledQueries[0]) } @@ -305,7 +308,8 @@ func TestLikeParamsWrapping(t *testing.T) { test9 ~ {:p9} || test10 ~ {:p10} || test11 ~ {:p11} || - test12 ~ {:p12} + test12 ~ {:p12} || + test13 ~ {:p13} `) replacements := []dbx.Params{ @@ -321,6 +325,7 @@ func TestLikeParamsWrapping(t *testing.T) { {"p10": `ab\c`}, {"p11": `_ab\c_`}, {"p12": `ab\c%`}, + {"p13": "a\nb\\"}, } expr, err := filter.BuildExpr(resolver, replacements...) @@ -334,7 +339,8 @@ func TestLikeParamsWrapping(t *testing.T) { t.Fatalf("Expected 1 query, got %d", len(calledQueries)) } - expectedQuery := `SELECT * WHERE ([[test1]] LIKE '%abc%' ESCAPE '\' OR [[test2]] LIKE 'ab%c' ESCAPE '\' OR [[test3]] LIKE 'ab\\%c' ESCAPE '\' OR [[test4]] LIKE '%ab\\%c' ESCAPE '\' OR [[test5]] LIKE 'ab\\\\%c' ESCAPE '\' OR [[test6]] LIKE 'ab\\\\\\%c' ESCAPE '\' OR [[test7]] LIKE '%ab\_c%' ESCAPE '\' OR [[test8]] LIKE '%ab\\\_c%' ESCAPE '\' OR [[test9]] LIKE '%ab_c' ESCAPE '\' OR [[test10]] LIKE '%ab\\c%' ESCAPE '\' OR [[test11]] LIKE '%\_ab\\c\_%' ESCAPE '\' OR [[test12]] LIKE 'ab\\c%' ESCAPE '\')` + expectedQuery := `SELECT * WHERE ([[test1]] LIKE '%abc%' ESCAPE '\' OR [[test2]] LIKE 'ab%c' ESCAPE '\' OR [[test3]] LIKE '%ab\%c%' ESCAPE '\' OR [[test4]] LIKE '%ab\%c' ESCAPE '\' OR [[test5]] LIKE 'ab\\%c' ESCAPE '\' OR [[test6]] LIKE '%ab\\\%c%' ESCAPE '\' OR [[test7]] LIKE '%ab\_c%' ESCAPE '\' OR [[test8]] LIKE '%ab\_c%' ESCAPE '\' OR [[test9]] LIKE '%ab_c' ESCAPE '\' OR [[test10]] LIKE '%ab\\c%' ESCAPE '\' OR [[test11]] LIKE '%\_ab\\c\_%' ESCAPE '\' OR [[test12]] LIKE 'ab\c%' ESCAPE '\' OR [[test13]] LIKE '%a` + expectedQuery += "\n" + `b\\%' ESCAPE '\')` if expectedQuery != calledQueries[0] { t.Fatalf("Expected query \n%s, \ngot \n%s", expectedQuery, calledQueries[0]) }