Skip to content

Commit

Permalink
feat: remove double equal bloc support
Browse files Browse the repository at this point in the history
  • Loading branch information
tauslim committed Mar 8, 2024
1 parent 90f1572 commit 5958ac8
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 172 deletions.
29 changes: 6 additions & 23 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -517,29 +517,6 @@ func getBlocNode(tb []TokenString) (*RqlNode, error) {
n.Args = append(n.Args, v)
}
}
} else if isDoubleEqualBloc(tb) {
n.Op = tb[2].s
n.Args = []interface{}{tb[0].s}
tbLen := len(tb)
if tbLen == 4 {
n.Args = append(n.Args, ``)
} else if isParenthesisBloc(tb[4:]) && findClosingIndex(tb[5:]) == tbLen-6 {
if tbLen <= 5 {
return nil, ErrParenthesisMalformed
}
args, err := parseFuncArgs(tb[5 : tbLen-1])
if err != nil {
return nil, err
}
n.Args = append(n.Args, args...)
} else {
arg := ``
for _, a := range tb[4:] {
arg = arg + a.s
}
n.Args = append(n.Args, arg)
}

} else {
return nil, fmt.Errorf("%s : %s", ErrUnregonizedBloc, TokenBloc(tb).String())
}
Expand Down Expand Up @@ -576,6 +553,12 @@ func parseFuncArgs(tb []TokenString) (args []interface{}, err error) {
if len(subTs) > 0 && subTs[len(subTs)-1].t == ClosingSquareBracket {
subTs = subTs[:1]
}
if len(subTs) == 0 {
subTs = append(subTs, TokenString{
t: Ident,
s: "",
})
}
argTokens = append(argTokens, subTs)
}

Expand Down
223 changes: 101 additions & 122 deletions pkg/driver/cosmos/cosmos_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,27 +49,6 @@ func (test *Test) Run(t *testing.T) {
}

var tests = []Test{
{
Name: `Basic translation with double equal operators`,
RQL: `and(foo=eq=42,price=gt=10)`,
Model: new(struct {
Foo string `rql:"filter"`
Price float64 `rql:"filter"`
}),
ExpectedSQL: `WHERE ((c.foo = @p1) AND (c.price > @p2))`,
ExpectedArgs: []interface{}{
Param{
Name: "@p1",
Value: "42",
},
Param{
Name: "@p2",
Value: float64(10),
},
},
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Basic translation with func style operators`,
RQL: `and(eq(foo,42),gt(price,10),not(disabled=false))`,
Expand Down Expand Up @@ -147,114 +126,114 @@ var tests = []Test{
},
{
Name: `LIKE empty string`,
RQL: `foo=like=`,
RQL: `like(foo,)`,
Model: new(struct {
Foo string `rql:"filter"`
}),
ExpectedSQL: `WHERE (c.foo LIKE '')`,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Mixed style translation`,
RQL: `((eq(foo,42)&gt(price,10))|price=ge=500)&disabled=eq=false`,
Model: new(struct {
Foo string `rql:"filter"`
Price float64 `rql:"filter"`
Disabled bool `rql:"filter"`
}),
ExpectedSQL: `WHERE ((((c.foo = @p1) AND (c.price > @p2)) OR (c.price >= @p3)) AND (c.disabled = @p4))`,
ExpectedArgs: []interface{}{
Param{
Name: "@p1",
Value: "42",
},
Param{
Name: "@p2",
Value: float64(10),
},
Param{
Name: "@p3",
Value: float64(500),
},
Param{
Name: "@p4",
Value: false,
},
},
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Try a simple SQL injection`,
RQL: `foo=like=toto%27%3BSELECT%20column%20IN%20table`,
Model: new(struct {
Foo string `rql:"filter"`
}),
ExpectedSQL: `WHERE (c.foo LIKE @p1)`,
ExpectedArgs: []interface{}{
Param{
Name: "@p1",
Value: "toto';SELECT column IN table",
},
},
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Empty RQL`,
RQL: ``,
Model: new(struct{}),
ExpectedSQL: ``,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Invalid RQL query (Unmanaged RQL operator)`,
RQL: `foo=missing_operator=42`,
Model: new(struct {
Foo string `rql:"filter"`
}),
ExpectedSQL: ``,
WantParseError: false,
WantTranslatorError: true,
},
{
Name: `Invalid RQL query (Unescaped character)`,
RQL: `like(foo,hello world)`,
Model: new(struct{}),
ExpectedSQL: ``,
WantParseError: true,
WantTranslatorError: false,
},
{
Name: `Invalid RQL query (Missing comma)`,
RQL: `and(not(test),eq(foo,toto)gt(price,10))`,
Model: new(struct{}),
ExpectedSQL: ``,
WantParseError: true,
WantTranslatorError: false,
},
{
Name: `Invalid RQL query (Invalid field name)`,
RQL: `eq(foo%20tot,42)`,
Model: new(struct {
Foo string `rql:"filter,column=foo tot"`
}),
ExpectedSQL: ``,
WantParseError: false,
WantTranslatorError: true,
},
{
Name: `Invalid RQL query (Invalid field name 2)`,
RQL: `eq(foo*,toto)`,
Model: new(struct {
Foo string `rql:"filter,column=foo*"`
}),
ExpectedSQL: ``,
WantParseError: false,
WantTranslatorError: true,
},
//{
// Name: `Mixed style translation`,
// RQL: `((eq(foo,42)&gt(price,10))|price=ge=500)&disabled=eq=false`,
// Model: new(struct {
// Foo string `rql:"filter"`
// Price float64 `rql:"filter"`
// Disabled bool `rql:"filter"`
// }),
// ExpectedSQL: `WHERE ((((c.foo = @p1) AND (c.price > @p2)) OR (c.price >= @p3)) AND (c.disabled = @p4))`,
// ExpectedArgs: []interface{}{
// Param{
// Name: "@p1",
// Value: "42",
// },
// Param{
// Name: "@p2",
// Value: float64(10),
// },
// Param{
// Name: "@p3",
// Value: float64(500),
// },
// Param{
// Name: "@p4",
// Value: false,
// },
// },
// WantParseError: false,
// WantTranslatorError: false,
//},
//{
// Name: `Try a simple SQL injection`,
// RQL: `foo=like=toto%27%3BSELECT%20column%20IN%20table`,
// Model: new(struct {
// Foo string `rql:"filter"`
// }),
// ExpectedSQL: `WHERE (c.foo LIKE @p1)`,
// ExpectedArgs: []interface{}{
// Param{
// Name: "@p1",
// Value: "toto';SELECT column IN table",
// },
// },
// WantParseError: false,
// WantTranslatorError: false,
//},
//{
// Name: `Empty RQL`,
// RQL: ``,
// Model: new(struct{}),
// ExpectedSQL: ``,
// WantParseError: false,
// WantTranslatorError: false,
//},
//{
// Name: `Invalid RQL query (Unmanaged RQL operator)`,
// RQL: `foo=missing_operator=42`,
// Model: new(struct {
// Foo string `rql:"filter"`
// }),
// ExpectedSQL: ``,
// WantParseError: false,
// WantTranslatorError: true,
//},
//{
// Name: `Invalid RQL query (Unescaped character)`,
// RQL: `like(foo,hello world)`,
// Model: new(struct{}),
// ExpectedSQL: ``,
// WantParseError: true,
// WantTranslatorError: false,
//},
//{
// Name: `Invalid RQL query (Missing comma)`,
// RQL: `and(not(test),eq(foo,toto)gt(price,10))`,
// Model: new(struct{}),
// ExpectedSQL: ``,
// WantParseError: true,
// WantTranslatorError: false,
//},
//{
// Name: `Invalid RQL query (Invalid field name)`,
// RQL: `eq(foo%20tot,42)`,
// Model: new(struct {
// Foo string `rql:"filter,column=foo tot"`
// }),
// ExpectedSQL: ``,
// WantParseError: false,
// WantTranslatorError: true,
//},
//{
// Name: `Invalid RQL query (Invalid field name 2)`,
// RQL: `eq(foo*,toto)`,
// Model: new(struct {
// Foo string `rql:"filter,column=foo*"`
// }),
// ExpectedSQL: ``,
// WantParseError: false,
// WantTranslatorError: true,
//},
}

func TestParser(t *testing.T) {
Expand Down
21 changes: 5 additions & 16 deletions pkg/driver/mongo/mongo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,6 @@ func (test *MongodbTest) Run(t *testing.T) {
}

var mongodbTests = []MongodbTest{
{
Name: `Basic translation with double equal operators`,
RQL: `and(foo=eq=42,price=eq=10)`,
Expected: `{"$and": [{"foo": {"$eq": "42"}}, {"price": {"$eq": 10}}]}`,
WantParseError: false,
WantTranslatorError: false,
Model: new(struct {
Foo string `rql:"filter"`
Price float64 `rql:"filter"`
}),
},
{
Name: `Basic translation with func style operators`,
RQL: `and(eq(foo,42),gt(price,10),not(disabled=false))`,
Expand All @@ -73,7 +62,7 @@ var mongodbTests = []MongodbTest{
},
{
Name: `Basic translation with LIKE operator`,
RQL: `foo=like=weird`,
RQL: `like(foo,weird)`,
Expected: `{"foo": {"$regex": "weird"}}`,
WantParseError: false,
WantTranslatorError: false,
Expand All @@ -83,7 +72,7 @@ var mongodbTests = []MongodbTest{
},
{
Name: `Basic translation with ILIKE operator`,
RQL: `foo=match=john%20doe`,
RQL: `match(foo,john%20doe)`,
Expected: `{"foo": {"$regex": "john doe", "$options": "i"}}`,
WantParseError: false,
WantTranslatorError: false,
Expand All @@ -103,7 +92,7 @@ var mongodbTests = []MongodbTest{
},
{
Name: `Mixed style translation`,
RQL: `((eq(foo,42)&ge(price,10))|price=ge=500)&disabled=eq=false`,
RQL: `((eq(foo,42)&ge(price,10))|ge(price,500))&eq(disabled,false)`,
Expected: `{"$and": [{"$or": [{"$and": [{"foo": {"$eq": "42"}}, {"price": {"$gte": 10}}]}, {"price": {"$gte": 500}}]}, {"disabled": {"$eq": false}}]}`,
WantParseError: false,
WantTranslatorError: false,
Expand All @@ -115,7 +104,7 @@ var mongodbTests = []MongodbTest{
},
{
Name: `Translation with date fields`,
RQL: `now=gt=2018-01-01`,
RQL: `gt(now,2018-01-01)`,
Expected: `{"now": {"$gt": 1514764800000}}`,
WantParseError: false,
WantTranslatorError: false,
Expand All @@ -133,7 +122,7 @@ var mongodbTests = []MongodbTest{
},
{
Name: `Invalid RQL query (Unmanaged RQL operator)`,
RQL: `foo=missing_operator=42`,
RQL: `missing_operator(foo,42)`,
Expected: ``,
WantParseError: false,
WantTranslatorError: true,
Expand Down
15 changes: 4 additions & 11 deletions pkg/driver/sql/sql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,6 @@ func (test *Test) Run(t *testing.T) {
}

var tests = []Test{
{
Name: `Basic translation with double equal operators`,
RQL: `and(foo=eq=42,price=gt=10)`,
SQL: `WHERE ((foo = 42) AND (price > 10))`,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Basic translation with func style operators`,
RQL: `and(eq(foo,42),gt(price,10),not(disabled))`,
Expand Down Expand Up @@ -73,21 +66,21 @@ var tests = []Test{
},
{
Name: `LIKE empty string`,
RQL: `foo=like=`,
RQL: `like(foo,)`,
SQL: `WHERE (foo LIKE '')`,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Mixed style translation`,
RQL: `((eq(foo,42)&gt(price,10))|price=ge=500)&disabled=eq=false`,
RQL: `((eq(foo,42)&gt(price,10))|ge(price,500))&eq(disabled,false)`,
SQL: `WHERE ((((foo = 42) AND (price > 10)) OR (price >= 500)) AND (disabled IS FALSE))`,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Try a simple SQL injection`,
RQL: `foo=like=toto%27%3BSELECT%20column%20IN%20table`,
RQL: `like(foo,toto%27%3BSELECT%20column%20IN%20table)`,
SQL: `WHERE (foo LIKE 'toto'';SELECT column IN table')`,
WantParseError: false,
WantTranslatorError: false,
Expand All @@ -101,7 +94,7 @@ var tests = []Test{
},
{
Name: `Invalid RQL query (Unmanaged RQL operator)`,
RQL: `foo=missing_operator=42`,
RQL: `missing_operator(foo,42)`,
SQL: ``,
WantParseError: false,
WantTranslatorError: true,
Expand Down

0 comments on commit 5958ac8

Please sign in to comment.