@@ -6165,6 +6165,7 @@ fn test_simple_postgres_insert_with_alias() {
61656165 assignments: vec![ ] ,
61666166 partitioned: None ,
61676167 after_columns: vec![ ] ,
6168+ overriding: None ,
61686169 has_table_keyword: false ,
61696170 on: None ,
61706171 returning: None ,
@@ -6249,6 +6250,7 @@ fn test_simple_postgres_insert_with_alias() {
62496250 assignments: vec![ ] ,
62506251 partitioned: None ,
62516252 after_columns: vec![ ] ,
6253+ overriding: None ,
62526254 has_table_keyword: false ,
62536255 on: None ,
62546256 returning: None ,
@@ -6331,6 +6333,7 @@ fn test_simple_insert_with_quoted_alias() {
63316333 assignments: vec![ ] ,
63326334 partitioned: None ,
63336335 after_columns: vec![ ] ,
6336+ overriding: None ,
63346337 has_table_keyword: false ,
63356338 on: None ,
63366339 returning: None ,
@@ -9996,6 +9999,72 @@ fn parse_trim_from_without_characters() {
99969999 pg ( ) . one_statement_parses_to ( "SELECT TRIM(FROM ' x ')" , "SELECT TRIM(' x ')" ) ;
999710000}
999810001
10002+ #[ test]
10003+ fn parse_insert_overriding ( ) {
10004+ for ( sql, expected) in [
10005+ (
10006+ "INSERT INTO t (id, a) OVERRIDING SYSTEM VALUE VALUES (1, 'x')" ,
10007+ InsertOverriding :: System ,
10008+ ) ,
10009+ (
10010+ "INSERT INTO t (id, a) OVERRIDING USER VALUE VALUES (1, 'x')" ,
10011+ InsertOverriding :: User ,
10012+ ) ,
10013+ (
10014+ "INSERT INTO t (id, a) OVERRIDING SYSTEM VALUE SELECT id, a FROM u" ,
10015+ InsertOverriding :: System ,
10016+ ) ,
10017+ (
10018+ "INSERT INTO t (id) OVERRIDING USER VALUE VALUES (1) ON CONFLICT DO NOTHING RETURNING id" ,
10019+ InsertOverriding :: User ,
10020+ ) ,
10021+ ] {
10022+ match pg_and_generic ( ) . verified_stmt ( sql) {
10023+ Statement :: Insert ( Insert { overriding, .. } ) => assert_eq ! ( overriding, Some ( expected) ) ,
10024+ statement => panic ! ( "Expected INSERT statement, got: {statement:?}" ) ,
10025+ }
10026+ }
10027+
10028+ // Without a column list, PostgreSQL's implicit table alias must not swallow `OVERRIDING`.
10029+ for sql in [
10030+ "INSERT INTO t OVERRIDING SYSTEM VALUE VALUES (1, 'x')" ,
10031+ "INSERT INTO t OVERRIDING USER VALUE SELECT * FROM u" ,
10032+ ] {
10033+ match pg ( ) . verified_stmt ( sql) {
10034+ Statement :: Insert ( Insert {
10035+ table_alias,
10036+ overriding,
10037+ ..
10038+ } ) => {
10039+ assert_eq ! ( table_alias, None ) ;
10040+ assert ! ( overriding. is_some( ) ) ;
10041+ }
10042+ statement => panic ! ( "Expected INSERT statement, got: {statement:?}" ) ,
10043+ }
10044+ }
10045+ pg ( ) . verified_stmt ( "INSERT INTO t AS x (id) OVERRIDING SYSTEM VALUE VALUES (1)" ) ;
10046+
10047+ // An INSERT without the clause has none.
10048+ match pg_and_generic ( ) . verified_stmt ( "INSERT INTO t (id) VALUES (1)" ) {
10049+ Statement :: Insert ( Insert { overriding, .. } ) => assert_eq ! ( overriding, None ) ,
10050+ statement => panic ! ( "Expected INSERT statement, got: {statement:?}" ) ,
10051+ }
10052+
10053+ // `OVERRIDING` takes `SYSTEM` or `USER`, then `VALUE`, and is followed by a query: PostgreSQL's
10054+ // grammar does not allow it before `DEFAULT VALUES`.
10055+ for sql in [
10056+ "INSERT INTO t (id) OVERRIDING VALUE VALUES (1)" ,
10057+ "INSERT INTO t (id) OVERRIDING SYSTEM VALUES (1)" ,
10058+ "INSERT INTO t (id) OVERRIDING DEFAULT VALUE VALUES (1)" ,
10059+ "INSERT INTO t OVERRIDING SYSTEM VALUE DEFAULT VALUES" ,
10060+ ] {
10061+ assert ! (
10062+ pg_and_generic( ) . parse_sql_statements( sql) . is_err( ) ,
10063+ "{sql} should not parse"
10064+ ) ;
10065+ }
10066+ }
10067+
999910068#[ test]
1000010069fn parse_insert_by_name_keywords_as_table_and_alias ( ) {
1000110070 // Without a table name, `BY NAME` is not an INSERT BY NAME clause. PostgreSQL
0 commit comments