@@ -10025,6 +10025,71 @@ fn parse_unpivot_table() {
1002510025 ) ;
1002610026}
1002710027
10028+ #[ test]
10029+ fn parse_select_table_with_index_hints ( ) {
10030+ let supported_dialects = all_dialects_where ( |d| d. supports_table_hints ( ) ) ;
10031+ let s = supported_dialects. verified_only_select (
10032+ "SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a" ,
10033+ ) ;
10034+ if let TableFactor :: Table { index_hints, .. } = & s. from [ 0 ] . relation {
10035+ assert_eq ! (
10036+ vec![
10037+ TableIndexHints {
10038+ hint_type: TableIndexHintType :: Use ,
10039+ index_names: vec![ "i1" . into( ) ] ,
10040+ index_type: TableIndexType :: Index ,
10041+ for_clause: None ,
10042+ } ,
10043+ TableIndexHints {
10044+ hint_type: TableIndexHintType :: Ignore ,
10045+ index_names: vec![ "i2" . into( ) ] ,
10046+ index_type: TableIndexType :: Index ,
10047+ for_clause: Some ( TableIndexHintForClause :: OrderBy ) ,
10048+ } ,
10049+ ] ,
10050+ * index_hints
10051+ ) ;
10052+ } else {
10053+ panic ! ( "Expected TableFactor::Table" ) ;
10054+ }
10055+ supported_dialects. verified_stmt ( "SELECT * FROM t1 USE INDEX (i1) USE INDEX (i1, i1)" ) ;
10056+ supported_dialects. verified_stmt (
10057+ "SELECT * FROM t1 USE INDEX () IGNORE INDEX (i2) USE INDEX (i1) USE INDEX (i2)" ,
10058+ ) ;
10059+ supported_dialects. verified_stmt ( "SELECT * FROM t1 FORCE INDEX FOR JOIN (i2)" ) ;
10060+ supported_dialects. verified_stmt ( "SELECT * FROM t1 IGNORE INDEX FOR JOIN (i2)" ) ;
10061+ supported_dialects. verified_stmt (
10062+ "SELECT * FROM t USE INDEX (index1) IGNORE INDEX FOR ORDER BY (index1) IGNORE INDEX FOR GROUP BY (index1) WHERE A = B" ,
10063+ ) ;
10064+
10065+ // Test that dialects that don't support table hints will keep parsing the USE as table alias
10066+ let sql = "SELECT * FROM T USE LIMIT 1" ;
10067+ let unsupported_dialects = all_dialects_where ( |d| !d. supports_table_hints ( ) ) ;
10068+ let select = unsupported_dialects
10069+ . verified_only_select_with_canonical ( sql, "SELECT * FROM T AS USE LIMIT 1" ) ;
10070+ assert_eq ! (
10071+ select. from,
10072+ vec![ TableWithJoins {
10073+ relation: TableFactor :: Table {
10074+ name: ObjectName ( vec![ Ident :: new( "T" ) ] ) ,
10075+ alias: Some ( TableAlias {
10076+ name: Ident :: new( "USE" ) ,
10077+ columns: vec![ ] ,
10078+ } ) ,
10079+ args: None ,
10080+ with_hints: vec![ ] ,
10081+ version: None ,
10082+ partitions: vec![ ] ,
10083+ with_ordinality: false ,
10084+ json_path: None ,
10085+ sample: None ,
10086+ index_hints: vec![ ] ,
10087+ } ,
10088+ joins: vec![ ] ,
10089+ } ]
10090+ ) ;
10091+ }
10092+
1002810093#[ test]
1002910094fn parse_pivot_unpivot_table ( ) {
1003010095 let sql = concat ! (
0 commit comments