Skip to content

Commit 9d24d32

Browse files
authored
Support table hint in dmls (#274)
* Support table hints in DMLs * Update testdata
1 parent 8dca202 commit 9d24d32

13 files changed

+264
-117
lines changed

ast/ast.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -3952,7 +3952,7 @@ type ThenReturn struct {
39523952
// Insert is INSERT statement node.
39533953
//
39543954
// {{.Hint | sqlOpt}}
3955-
// INSERT {{if .InsertOrType}}OR .InsertOrType{{end}}INTO {{.TableName | sql}} ({{.Columns | sqlJoin ","}}) {{.Input | sql}}
3955+
// INSERT {{if .InsertOrType}}OR .InsertOrType{{end}}INTO {{.TableName | sql}}{{.TableHint | sqlOpt}} ({{.Columns | sqlJoin ","}}) {{.Input | sql}}
39563956
// {{.ThenReturn | sqlOpt}}
39573957
type Insert struct {
39583958
// pos = Hint.pos || Insert
@@ -3964,6 +3964,7 @@ type Insert struct {
39643964

39653965
Hint *Hint // optional
39663966
TableName *Path
3967+
TableHint *Hint // optional
39673968
Columns []*Ident
39683969
Input InsertInput
39693970
ThenReturn *ThenReturn // optional
@@ -4019,7 +4020,7 @@ type SubQueryInput struct {
40194020
// Delete is DELETE statement.
40204021
//
40214022
// {{.Hint | sqlOpt}}
4022-
// DELETE FROM {{.TableName | sql}} {{.As | sqlOpt}} {{.Where | sql}}
4023+
// DELETE FROM {{.TableName | sql}}{{.TableHint | sqlOpt}} {{.As | sqlOpt}} {{.Where | sql}}
40234024
// {{.ThenReturn | sqlOpt}}
40244025
type Delete struct {
40254026
// pos = Hint.pos || Delete
@@ -4029,6 +4030,7 @@ type Delete struct {
40294030

40304031
Hint *Hint // optional
40314032
TableName *Path
4033+
TableHint *Hint // optional
40324034
As *AsAlias // optional
40334035
Where *Where
40344036
ThenReturn *ThenReturn // optional
@@ -4037,7 +4039,7 @@ type Delete struct {
40374039
// Update is UPDATE statement.
40384040
//
40394041
// {{.Hint | sqlOpt}}
4040-
// UPDATE {{.TableName | sql}} {{.As | sqlOpt}}
4042+
// UPDATE {{.TableName | sql}}{{.TableHint | sqlOpt}} {{.As | sqlOpt}}
40414043
// SET {{.Updates | sqlJoin ","}} {{.Where | sql}}
40424044
// {{.ThenReturn | sqlOpt}}
40434045
type Update struct {
@@ -4048,6 +4050,7 @@ type Update struct {
40484050

40494051
Hint *Hint // optional
40504052
TableName *Path
4053+
TableHint *Hint // optional
40514054
As *AsAlias // optional
40524055
Updates []*UpdateItem // len(Updates) > 0
40534056
Where *Where

ast/sql.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,8 @@ func (i *Insert) SQL() string {
13131313
return sqlOpt("", i.Hint, " ") +
13141314
"INSERT " +
13151315
strOpt(i.InsertOrType != "", "OR "+string(i.InsertOrType)+" ") +
1316-
"INTO " + i.TableName.SQL() + " (" +
1316+
"INTO " + i.TableName.SQL() +
1317+
sqlOpt("", i.TableHint, "") + " (" +
13171318
sqlJoin(i.Columns, ", ") +
13181319
") " +
13191320
i.Input.SQL() +
@@ -1342,15 +1343,17 @@ func (s *SubQueryInput) SQL() string {
13421343
func (d *Delete) SQL() string {
13431344
return sqlOpt("", d.Hint, " ") +
13441345
"DELETE FROM " +
1345-
d.TableName.SQL() + " " +
1346+
d.TableName.SQL() +
1347+
sqlOpt("", d.TableHint, "") + " " +
13461348
sqlOpt("", d.As, " ") +
13471349
d.Where.SQL() +
13481350
sqlOpt(" ", d.ThenReturn, "")
13491351
}
13501352

13511353
func (u *Update) SQL() string {
13521354
return sqlOpt("", u.Hint, " ") +
1353-
"UPDATE " + u.TableName.SQL() + " " +
1355+
"UPDATE " + u.TableName.SQL() +
1356+
sqlOpt("", u.TableHint, "") + " " +
13541357
sqlOpt("", u.As, " ") +
13551358
"SET " +
13561359
sqlJoin(u.Updates, ", ") +

ast/walk_internal.go

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

parser.go

+6
Original file line numberDiff line numberDiff line change
@@ -5107,6 +5107,7 @@ func (p *Parser) parseInsert(pos token.Pos, hint *ast.Hint) *ast.Insert {
51075107
}
51085108

51095109
name := p.parsePath()
5110+
tableHint := p.tryParseHint()
51105111

51115112
p.expect("(")
51125113
var columns []*ast.Ident
@@ -5135,6 +5136,7 @@ func (p *Parser) parseInsert(pos token.Pos, hint *ast.Hint) *ast.Insert {
51355136
Hint: hint,
51365137
InsertOrType: insertOrType,
51375138
TableName: name,
5139+
TableHint: tableHint,
51385140
Columns: columns,
51395141
Input: input,
51405142
ThenReturn: thenReturn,
@@ -5203,6 +5205,7 @@ func (p *Parser) parseDelete(pos token.Pos, hint *ast.Hint) *ast.Delete {
52035205
}
52045206

52055207
name := p.parsePath()
5208+
tableHint := p.tryParseHint()
52065209
as := p.tryParseAsAlias(withOptionalAs)
52075210
where := p.parseWhere()
52085211
thenReturn := p.tryParseThenReturn()
@@ -5211,6 +5214,7 @@ func (p *Parser) parseDelete(pos token.Pos, hint *ast.Hint) *ast.Delete {
52115214
Delete: pos,
52125215
Hint: hint,
52135216
TableName: name,
5217+
TableHint: tableHint,
52145218
As: as,
52155219
Where: where,
52165220
ThenReturn: thenReturn,
@@ -5219,6 +5223,7 @@ func (p *Parser) parseDelete(pos token.Pos, hint *ast.Hint) *ast.Delete {
52195223

52205224
func (p *Parser) parseUpdate(pos token.Pos, hint *ast.Hint) *ast.Update {
52215225
name := p.parsePath()
5226+
tableHint := p.tryParseHint()
52225227
as := p.tryParseAsAlias(withOptionalAs)
52235228

52245229
p.expect("SET")
@@ -5232,6 +5237,7 @@ func (p *Parser) parseUpdate(pos token.Pos, hint *ast.Hint) *ast.Update {
52325237
Update: pos,
52335238
Hint: hint,
52345239
TableName: name,
5240+
TableHint: tableHint,
52355241
As: as,
52365242
Updates: items,
52375243
Where: where,
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
@{pdml_max_parallelism=1} delete foo where foo = 1 and bar = 2
1+
@{pdml_max_parallelism=1} delete foo@{force_index=_base_table} where foo = 1 and bar = 2
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
@{pdml_max_parallelism=1}
2-
insert into foo (foo, bar, baz)
2+
insert into foo@{force_index=_base_table} (foo, bar, baz)
33
values (1, 2, 3),
44
(4, 5, 6)
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
@{pdml_max_parallelism=1}
2-
update foo set foo = bar, bar = foo, baz = DEFAULT where foo = 1
2+
update foo@{force_index=_base_table} set foo = bar, bar = foo, baz = DEFAULT where foo = 1

testdata/result/dml/delete_with_hint.sql.txt

+33-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--- delete_with_hint.sql
2-
@{pdml_max_parallelism=1} delete foo where foo = 1 and bar = 2
2+
@{pdml_max_parallelism=1} delete foo@{force_index=_base_table} where foo = 1 and bar = 2
33
--- AST
44
&ast.Delete{
55
Delete: 26,
@@ -34,34 +34,56 @@
3434
},
3535
},
3636
},
37+
TableHint: &ast.Hint{
38+
Atmark: 36,
39+
Rbrace: 61,
40+
Records: []*ast.HintRecord{
41+
&ast.HintRecord{
42+
Key: &ast.Path{
43+
Idents: []*ast.Ident{
44+
&ast.Ident{
45+
NamePos: 38,
46+
NameEnd: 49,
47+
Name: "force_index",
48+
},
49+
},
50+
},
51+
Value: &ast.Ident{
52+
NamePos: 50,
53+
NameEnd: 61,
54+
Name: "_base_table",
55+
},
56+
},
57+
},
58+
},
3759
Where: &ast.Where{
38-
Where: 37,
60+
Where: 63,
3961
Expr: &ast.BinaryExpr{
4062
Op: "AND",
4163
Left: &ast.BinaryExpr{
4264
Op: "=",
4365
Left: &ast.Ident{
44-
NamePos: 43,
45-
NameEnd: 46,
66+
NamePos: 69,
67+
NameEnd: 72,
4668
Name: "foo",
4769
},
4870
Right: &ast.IntLiteral{
49-
ValuePos: 49,
50-
ValueEnd: 50,
71+
ValuePos: 75,
72+
ValueEnd: 76,
5173
Base: 10,
5274
Value: "1",
5375
},
5476
},
5577
Right: &ast.BinaryExpr{
5678
Op: "=",
5779
Left: &ast.Ident{
58-
NamePos: 55,
59-
NameEnd: 58,
80+
NamePos: 81,
81+
NameEnd: 84,
6082
Name: "bar",
6183
},
6284
Right: &ast.IntLiteral{
63-
ValuePos: 61,
64-
ValueEnd: 62,
85+
ValuePos: 87,
86+
ValueEnd: 88,
6587
Base: 10,
6688
Value: "2",
6789
},
@@ -71,4 +93,4 @@
7193
}
7294

7395
--- SQL
74-
@{pdml_max_parallelism=1} DELETE FROM foo WHERE foo = 1 AND bar = 2
96+
@{pdml_max_parallelism=1} DELETE FROM foo@{force_index=_base_table} WHERE foo = 1 AND bar = 2

testdata/result/dml/insert_with_hint.sql.txt

+47-25
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
--- insert_with_hint.sql
22
@{pdml_max_parallelism=1}
3-
insert into foo (foo, bar, baz)
3+
insert into foo@{force_index=_base_table} (foo, bar, baz)
44
values (1, 2, 3),
55
(4, 5, 6)
66
--- AST
@@ -37,86 +37,108 @@ values (1, 2, 3),
3737
},
3838
},
3939
},
40+
TableHint: &ast.Hint{
41+
Atmark: 41,
42+
Rbrace: 66,
43+
Records: []*ast.HintRecord{
44+
&ast.HintRecord{
45+
Key: &ast.Path{
46+
Idents: []*ast.Ident{
47+
&ast.Ident{
48+
NamePos: 43,
49+
NameEnd: 54,
50+
Name: "force_index",
51+
},
52+
},
53+
},
54+
Value: &ast.Ident{
55+
NamePos: 55,
56+
NameEnd: 66,
57+
Name: "_base_table",
58+
},
59+
},
60+
},
61+
},
4062
Columns: []*ast.Ident{
4163
&ast.Ident{
42-
NamePos: 43,
43-
NameEnd: 46,
64+
NamePos: 69,
65+
NameEnd: 72,
4466
Name: "foo",
4567
},
4668
&ast.Ident{
47-
NamePos: 48,
48-
NameEnd: 51,
69+
NamePos: 74,
70+
NameEnd: 77,
4971
Name: "bar",
5072
},
5173
&ast.Ident{
52-
NamePos: 53,
53-
NameEnd: 56,
74+
NamePos: 79,
75+
NameEnd: 82,
5476
Name: "baz",
5577
},
5678
},
5779
Input: &ast.ValuesInput{
58-
Values: 58,
80+
Values: 84,
5981
Rows: []*ast.ValuesRow{
6082
&ast.ValuesRow{
61-
Lparen: 65,
62-
Rparen: 73,
83+
Lparen: 91,
84+
Rparen: 99,
6385
Exprs: []*ast.DefaultExpr{
6486
&ast.DefaultExpr{
6587
DefaultPos: -1,
6688
Expr: &ast.IntLiteral{
67-
ValuePos: 66,
68-
ValueEnd: 67,
89+
ValuePos: 92,
90+
ValueEnd: 93,
6991
Base: 10,
7092
Value: "1",
7193
},
7294
},
7395
&ast.DefaultExpr{
7496
DefaultPos: -1,
7597
Expr: &ast.IntLiteral{
76-
ValuePos: 69,
77-
ValueEnd: 70,
98+
ValuePos: 95,
99+
ValueEnd: 96,
78100
Base: 10,
79101
Value: "2",
80102
},
81103
},
82104
&ast.DefaultExpr{
83105
DefaultPos: -1,
84106
Expr: &ast.IntLiteral{
85-
ValuePos: 72,
86-
ValueEnd: 73,
107+
ValuePos: 98,
108+
ValueEnd: 99,
87109
Base: 10,
88110
Value: "3",
89111
},
90112
},
91113
},
92114
},
93115
&ast.ValuesRow{
94-
Lparen: 83,
95-
Rparen: 91,
116+
Lparen: 109,
117+
Rparen: 117,
96118
Exprs: []*ast.DefaultExpr{
97119
&ast.DefaultExpr{
98120
DefaultPos: -1,
99121
Expr: &ast.IntLiteral{
100-
ValuePos: 84,
101-
ValueEnd: 85,
122+
ValuePos: 110,
123+
ValueEnd: 111,
102124
Base: 10,
103125
Value: "4",
104126
},
105127
},
106128
&ast.DefaultExpr{
107129
DefaultPos: -1,
108130
Expr: &ast.IntLiteral{
109-
ValuePos: 87,
110-
ValueEnd: 88,
131+
ValuePos: 113,
132+
ValueEnd: 114,
111133
Base: 10,
112134
Value: "5",
113135
},
114136
},
115137
&ast.DefaultExpr{
116138
DefaultPos: -1,
117139
Expr: &ast.IntLiteral{
118-
ValuePos: 90,
119-
ValueEnd: 91,
140+
ValuePos: 116,
141+
ValueEnd: 117,
120142
Base: 10,
121143
Value: "6",
122144
},
@@ -128,4 +150,4 @@ values (1, 2, 3),
128150
}
129151

130152
--- SQL
131-
@{pdml_max_parallelism=1} INSERT INTO foo (foo, bar, baz) VALUES (1, 2, 3), (4, 5, 6)
153+
@{pdml_max_parallelism=1} INSERT INTO foo@{force_index=_base_table} (foo, bar, baz) VALUES (1, 2, 3), (4, 5, 6)

0 commit comments

Comments
 (0)