@@ -1885,7 +1885,7 @@ func (p *parser) parseQuery() (Query, *parseError) {
1885
1885
[ LIMIT count [ OFFSET skip_rows ] ]
1886
1886
*/
1887
1887
1888
- // TODO: hints, sub-selects, etc.
1888
+ // TODO: sub-selects, etc.
1889
1889
1890
1890
if err := p .expect ("SELECT" ); err != nil {
1891
1891
return Query {}, err
@@ -2111,6 +2111,13 @@ func (p *parser) parseSelectFrom() (SelectFrom, *parseError) {
2111
2111
return nil , err
2112
2112
}
2113
2113
sf := SelectFromTable {Table : tname }
2114
+ if p .eat ("@" ) {
2115
+ hints , err := p .parseHints (map [string ]string {})
2116
+ if err != nil {
2117
+ return nil , err
2118
+ }
2119
+ sf .Hints = hints
2120
+ }
2114
2121
2115
2122
// TODO: The "AS" keyword is optional.
2116
2123
if p .eat ("AS" ) {
@@ -2159,46 +2166,20 @@ func (p *parser) parseSelectFrom() (SelectFrom, *parseError) {
2159
2166
Type : jt ,
2160
2167
LHS : sf ,
2161
2168
}
2162
- setHint := func (k , v string ) {
2163
- if sfj .Hints == nil {
2164
- sfj .Hints = make (map [string ]string )
2165
- }
2166
- sfj .Hints [k ] = v
2167
- }
2169
+ var hints map [string ]string
2168
2170
if hashJoin {
2169
- setHint ("JOIN_METHOD" , "HASH_JOIN" )
2171
+ hints = map [string ]string {}
2172
+ hints ["JOIN_METHOD" ] = "HASH_JOIN"
2170
2173
}
2171
2174
2172
2175
if p .eat ("@" ) {
2173
- if err := p .expect ("{" ); err != nil {
2174
- return nil , err
2175
- }
2176
- for {
2177
- if p .sniff ("}" ) {
2178
- break
2179
- }
2180
- tok := p .next ()
2181
- if tok .err != nil {
2182
- return nil , tok .err
2183
- }
2184
- k := tok .value
2185
- if err := p .expect ("=" ); err != nil {
2186
- return nil , err
2187
- }
2188
- tok = p .next ()
2189
- if tok .err != nil {
2190
- return nil , tok .err
2191
- }
2192
- v := tok .value
2193
- setHint (k , v )
2194
- if ! p .eat ("," ) {
2195
- break
2196
- }
2197
- }
2198
- if err := p .expect ("}" ); err != nil {
2176
+ h , err := p .parseHints (hints )
2177
+ if err != nil {
2199
2178
return nil , err
2200
2179
}
2180
+ hints = h
2201
2181
}
2182
+ sfj .Hints = hints
2202
2183
2203
2184
sfj .RHS , err = p .parseSelectFrom ()
2204
2185
if err != nil {
@@ -2889,6 +2870,41 @@ func (p *parser) parseAlias() (ID, *parseError) {
2889
2870
return p .parseTableOrIndexOrColumnName ()
2890
2871
}
2891
2872
2873
+ func (p * parser ) parseHints (hints map [string ]string ) (map [string ]string , * parseError ) {
2874
+ if hints == nil {
2875
+ hints = map [string ]string {}
2876
+ }
2877
+ if err := p .expect ("{" ); err != nil {
2878
+ return nil , err
2879
+ }
2880
+ for {
2881
+ if p .sniff ("}" ) {
2882
+ break
2883
+ }
2884
+ tok := p .next ()
2885
+ if tok .err != nil {
2886
+ return nil , tok .err
2887
+ }
2888
+ k := tok .value
2889
+ if err := p .expect ("=" ); err != nil {
2890
+ return nil , err
2891
+ }
2892
+ tok = p .next ()
2893
+ if tok .err != nil {
2894
+ return nil , tok .err
2895
+ }
2896
+ v := tok .value
2897
+ hints [k ] = v
2898
+ if ! p .eat ("," ) {
2899
+ break
2900
+ }
2901
+ }
2902
+ if err := p .expect ("}" ); err != nil {
2903
+ return nil , err
2904
+ }
2905
+ return hints , nil
2906
+ }
2907
+
2892
2908
func (p * parser ) parseTableOrIndexOrColumnName () (ID , * parseError ) {
2893
2909
/*
2894
2910
table_name and column_name and index_name:
0 commit comments