Skip to content

Commit 1a65d16

Browse files
authored
feat: fill param marker order (#15)
1 parent 551bf0e commit 1a65d16

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

parser.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -15277,7 +15277,10 @@ yynewstate:
1527715277
}
1527815278
case 1226:
1527915279
{
15280-
parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset)
15280+
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
15281+
paramExpr.SetOrder(parser.paramMarkerCursor)
15282+
parser.paramMarkerCursor++
15283+
parser.yyVAL.expr = paramExpr
1528115284
}
1528215285
case 1229:
1528315286
{
@@ -17184,7 +17187,10 @@ yynewstate:
1718417187
}
1718517188
case 1612:
1718617189
{
17187-
parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset)
17190+
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
17191+
paramExpr.SetOrder(parser.paramMarkerCursor)
17192+
parser.paramMarkerCursor++
17193+
parser.yyVAL.item = paramExpr
1718817194
}
1718917195
case 1617:
1719017196
{

parser.y

+8-2
Original file line numberDiff line numberDiff line change
@@ -6754,7 +6754,10 @@ SimpleExpr:
67546754
| Literal
67556755
| paramMarker
67566756
{
6757-
$$ = ast.NewParamMarkerExpr(yyS[yypt].offset)
6757+
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
6758+
paramExpr.SetOrder(parser.paramMarkerCursor)
6759+
parser.paramMarkerCursor++
6760+
$$ = paramExpr
67586761
}
67596762
| Variable
67606763
| SumExpr
@@ -8941,7 +8944,10 @@ LimitOption:
89418944
}
89428945
| paramMarker
89438946
{
8944-
$$ = ast.NewParamMarkerExpr(yyS[yypt].offset)
8947+
paramExpr := ast.NewParamMarkerExpr(yyS[yypt].offset)
8948+
paramExpr.SetOrder(parser.paramMarkerCursor)
8949+
parser.paramMarkerCursor++
8950+
$$ = paramExpr
89458951
}
89468952

89478953
RowOrRows:

parser_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -6660,3 +6660,19 @@ SELECT 3;
66606660
assert.Equal(t, []string{"bar", "qux"}, stmts[1].Hints())
66616661
assert.Len(t, stmts[2].Hints(), 0)
66626662
}
6663+
6664+
func TestFillParamMarker(t *testing.T) {
6665+
p := parser.New()
6666+
stmt, err := p.ParseOneStmt("select * from t where k = ? limit ?,?", "", "")
6667+
assert.NoError(t, err)
6668+
sel := stmt.(*ast.SelectStmt)
6669+
6670+
where := sel.Where.(*ast.BinaryOperationExpr).R.(*test_driver.ParamMarkerExpr).Order
6671+
assert.Equal(t, 0, where)
6672+
6673+
offset := sel.Limit.Offset.(*test_driver.ParamMarkerExpr).Order
6674+
assert.Equal(t, 1, offset)
6675+
6676+
limit := sel.Limit.Count.(*test_driver.ParamMarkerExpr).Order
6677+
assert.Equal(t, 2, limit)
6678+
}

yy_parser.go

+6
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ type Parser struct {
8888

8989
explicitCharset bool
9090
strictDoubleFieldType bool
91+
paramMarkerCursor int
9192

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

131+
func (parser *Parser) ParamMarkerCursor() int {
132+
return parser.paramMarkerCursor
133+
}
134+
130135
func (parser *Parser) SetStrictDoubleTypeCheck(val bool) {
131136
parser.strictDoubleFieldType = val
132137
}
@@ -397,6 +402,7 @@ var (
397402
func resetParams(p *Parser) {
398403
p.charset = mysql.DefaultCharset
399404
p.collation = mysql.DefaultCollationName
405+
p.paramMarkerCursor = 0
400406
}
401407

402408
// ParseParam represents the parameter of parsing.

0 commit comments

Comments
 (0)