@@ -7135,6 +7135,16 @@ impl<'a> Parser<'a> {
7135
7135
} else if self . consume_token ( & Token :: LParen ) {
7136
7136
// CTEs are not allowed here, but the parser currently accepts them
7137
7137
let subquery = self . parse_query ( ) ?;
7138
+
7139
+ let is_generic = dialect_of ! ( self is GenericDialect ) ;
7140
+ if !is_generic {
7141
+ if let SetExpr :: Values ( _) = * subquery. body {
7142
+ return Err ( ParserError :: ParserError ( format ! (
7143
+ "VALUES is not a recognized subquery"
7144
+ ) ) )
7145
+ }
7146
+ }
7147
+
7138
7148
self . expect_token ( & Token :: RParen ) ?;
7139
7149
SetExpr :: Query ( Box :: new ( subquery) )
7140
7150
} else if self . parse_keyword ( Keyword :: VALUES ) {
@@ -10152,7 +10162,35 @@ mod tests {
10152
10162
fn test_replace_into_select ( ) {
10153
10163
let sql = r#"REPLACE INTO t1 (a, b, c) (SELECT * FROM t2)"# ;
10154
10164
10155
- assert ! ( Parser :: parse_sql( & GenericDialect { } , sql) . is_err( ) ) ;
10165
+ assert ! ( Parser :: parse_sql( & GenericDialect { } , sql) . is_ok( ) ) ;
10166
+ }
10167
+
10168
+ #[ test]
10169
+ fn test_insert_into_select ( ) {
10170
+ let sql = r#"INSERT INTO t1 (a, b, c) (SELECT * FROM t2)"# ;
10171
+
10172
+ assert ! ( Parser :: parse_sql( & GenericDialect { } , sql) . is_ok( ) ) ;
10173
+ }
10174
+
10175
+ #[ test]
10176
+ fn test_insert_into_values ( ) {
10177
+ let sql = r#"INSERT INTO t1 (a) VALUES(1)"# ;
10178
+
10179
+ assert ! ( Parser :: parse_sql( & GenericDialect { } , sql) . is_ok( ) ) ;
10180
+ }
10181
+
10182
+ #[ test]
10183
+ fn test_insert_into_values_wrapped ( ) {
10184
+ let sql = r#"INSERT INTO t1 (a) (VALUES(1))"# ;
10185
+
10186
+ assert ! ( Parser :: parse_sql( & GenericDialect { } , sql) . is_ok( ) ) ;
10187
+ }
10188
+
10189
+ #[ test]
10190
+ fn test_insert_into_values_wrapped_not_generic ( ) {
10191
+ let sql = r#"INSERT INTO t1 (a) (VALUES(1))"# ;
10192
+
10193
+ assert ! ( Parser :: parse_sql( & MySqlDialect { } , sql) . is_err( ) ) ;
10156
10194
}
10157
10195
10158
10196
#[ test]
0 commit comments