mirror of
https://github.com/MontFerret/ferret.git
synced 2025-05-13 22:16:36 +02:00
Fixed incorrectly compiled LIMIT clause.
This commit is contained in:
parent
d3f1a2d88d
commit
da446892b5
BIN
assets/logo.png
Normal file
BIN
assets/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
@ -497,9 +497,11 @@ func TestFor(t *testing.T) {
|
|||||||
Convey("Should compile query with LIMIT 2, 2", t, func() {
|
Convey("Should compile query with LIMIT 2, 2", t, func() {
|
||||||
c := compiler.New()
|
c := compiler.New()
|
||||||
|
|
||||||
|
// 4 is offset
|
||||||
|
// 2 is count
|
||||||
prog, err := c.Compile(`
|
prog, err := c.Compile(`
|
||||||
FOR i IN [ 1, 2, 3, 4, 1, 3 ]
|
FOR i IN [ 1,2,3,4,5,6,7,8 ]
|
||||||
LIMIT 2, 2
|
LIMIT 4, 2
|
||||||
RETURN i
|
RETURN i
|
||||||
`)
|
`)
|
||||||
|
|
||||||
@ -509,7 +511,7 @@ func TestFor(t *testing.T) {
|
|||||||
|
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
So(string(out), ShouldEqual, `[3,4]`)
|
So(string(out), ShouldEqual, `[5,6]`)
|
||||||
})
|
})
|
||||||
|
|
||||||
Convey("Should compile query with FILTER i > 2", t, func() {
|
Convey("Should compile query with FILTER i > 2", t, func() {
|
||||||
|
@ -292,29 +292,37 @@ func (v *visitor) doVisitForExpression(ctx *fql.ForExpressionContext, scope *sco
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (v *visitor) createLimit(ctx *fql.LimitClauseContext) (int, int, error) {
|
func (v *visitor) createLimit(ctx *fql.LimitClauseContext) (int, int, error) {
|
||||||
var limit int
|
var err error
|
||||||
|
var count int
|
||||||
var offset int
|
var offset int
|
||||||
|
|
||||||
intLiterals := ctx.AllIntegerLiteral()
|
intLiterals := ctx.AllIntegerLiteral()
|
||||||
|
|
||||||
limitLiteral := intLiterals[0]
|
|
||||||
limit, err := strconv.Atoi(limitLiteral.GetText())
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(intLiterals) > 1 {
|
if len(intLiterals) > 1 {
|
||||||
offsetLiteral := intLiterals[1]
|
offset, err = v.parseInt(intLiterals[0])
|
||||||
|
|
||||||
offset, err = strconv.Atoi(offsetLiteral.GetText())
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
count, err = v.parseInt(intLiterals[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
count, err = strconv.Atoi(intLiterals[0].GetText())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, err
|
return 0, 0, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return limit, offset, nil
|
return count, offset, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *visitor) parseInt(node antlr.TerminalNode) (int, error) {
|
||||||
|
return strconv.Atoi(node.GetText())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *visitor) createFilter(ctx *fql.FilterClauseContext, scope *scope) (core.Expression, error) {
|
func (v *visitor) createFilter(ctx *fql.FilterClauseContext, scope *scope) (core.Expression, error) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user