diff --git a/ast/expressions.go b/ast/expressions.go index e81f87876..c3d38dcf7 100644 --- a/ast/expressions.go +++ b/ast/expressions.go @@ -699,7 +699,7 @@ func (n *ParenthesesExpr) Accept(v Visitor) (Node, bool) { type PositionExpr struct { exprNode // N is the position, started from 1 now. - N int + N ExprNode // Refer is the result field the position refers to. Refer *ResultField } @@ -716,6 +716,13 @@ func (n *PositionExpr) Accept(v Visitor) (Node, bool) { return v.Leave(newNode) } n = newNode.(*PositionExpr) + if n.N != nil { + node, ok := n.N.Accept(v) + if !ok { + return n, false + } + n.N = node.(ExprNode) + } return v.Leave(n) } diff --git a/parser.go b/parser.go index 13277a307..5d0bac0dc 100644 --- a/parser.go +++ b/parser.go @@ -8399,12 +8399,10 @@ yynewstate: case 606: { expr := yyS[yypt-1].expr - valueExpr, ok := expr.(ast.ValueExpr) - if ok { - position, isPosition := valueExpr.GetValue().(int64) - if isPosition { - expr = &ast.PositionExpr{N: int(position)} - } + if valueExpr, ok := expr.(ast.ValueExpr); ok { + expr = &ast.PositionExpr{N: valueExpr} + } else if paramExpr, ok := expr.(ast.ParamMarkerExpr); ok { + expr = &ast.PositionExpr{N: paramExpr} } parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} } diff --git a/parser.y b/parser.y index 344d2c5d0..04b9b82df 100644 --- a/parser.y +++ b/parser.y @@ -3187,13 +3187,11 @@ ByItem: Expression Order { expr := $1 - valueExpr, ok := expr.(ast.ValueExpr) - if ok { - position, isPosition := valueExpr.GetValue().(int64) - if isPosition { - expr = &ast.PositionExpr{N: int(position)} - } - } + if valueExpr, ok := expr.(ast.ValueExpr); ok { + expr = &ast.PositionExpr{N: valueExpr} + } else if paramExpr, ok := expr.(ast.ParamMarkerExpr); ok { + expr = &ast.PositionExpr{N: paramExpr} + } $$ = &ast.ByItem{Expr: expr, Desc: $2.(bool)} }