Skip to content

Commit

Permalink
feat: fill param marker order (arana-db#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
jjeffcaii authored Sep 24, 2022
1 parent 551bf0e commit 1a65d16
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 4 deletions.
10 changes: 8 additions & 2 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -15277,7 +15277,10 @@ yynewstate:
}
case 1226:
{
parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr.SetOrder(parser.paramMarkerCursor)
parser.paramMarkerCursor++
parser.yyVAL.expr = paramExpr
}
case 1229:
{
Expand Down Expand Up @@ -17184,7 +17187,10 @@ yynewstate:
}
case 1612:
{
parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr.SetOrder(parser.paramMarkerCursor)
parser.paramMarkerCursor++
parser.yyVAL.item = paramExpr
}
case 1617:
{
Expand Down
10 changes: 8 additions & 2 deletions parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -6754,7 +6754,10 @@ SimpleExpr:
| Literal
| paramMarker
{
$$ = ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr.SetOrder(parser.paramMarkerCursor)
parser.paramMarkerCursor++
$$ = paramExpr
}
| Variable
| SumExpr
Expand Down Expand Up @@ -8941,7 +8944,10 @@ LimitOption:
}
| paramMarker
{
$$ = ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
paramExpr.SetOrder(parser.paramMarkerCursor)
parser.paramMarkerCursor++
$$ = paramExpr
}

RowOrRows:
Expand Down
16 changes: 16 additions & 0 deletions parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6660,3 +6660,19 @@ SELECT 3;
assert.Equal(t, []string{"bar", "qux"}, stmts[1].Hints())
assert.Len(t, stmts[2].Hints(), 0)
}

func TestFillParamMarker(t *testing.T) {
p := parser.New()
stmt, err := p.ParseOneStmt("select * from t where k = ? limit ?,?", "", "")
assert.NoError(t, err)
sel := stmt.(*ast.SelectStmt)

where := sel.Where.(*ast.BinaryOperationExpr).R.(*test_driver.ParamMarkerExpr).Order
assert.Equal(t, 0, where)

offset := sel.Limit.Offset.(*test_driver.ParamMarkerExpr).Order
assert.Equal(t, 1, offset)

limit := sel.Limit.Count.(*test_driver.ParamMarkerExpr).Order
assert.Equal(t, 2, limit)
}
6 changes: 6 additions & 0 deletions yy_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ type Parser struct {

explicitCharset bool
strictDoubleFieldType bool
paramMarkerCursor int

// the following fields are used by yyParse to reduce allocation.
cache []yySymType
Expand Down Expand Up @@ -127,6 +128,10 @@ func New() *Parser {
return p
}

func (parser *Parser) ParamMarkerCursor() int {
return parser.paramMarkerCursor
}

func (parser *Parser) SetStrictDoubleTypeCheck(val bool) {
parser.strictDoubleFieldType = val
}
Expand Down Expand Up @@ -397,6 +402,7 @@ var (
func resetParams(p *Parser) {
p.charset = mysql.DefaultCharset
p.collation = mysql.DefaultCollationName
p.paramMarkerCursor = 0
}

// ParseParam represents the parameter of parsing.
Expand Down

0 comments on commit 1a65d16

Please sign in to comment.