@@ -22,14 +22,15 @@ use pretty_assertions::assert_eq;
2222
2323use sqlparser:: {
2424 ast:: {
25- BinaryOperator , Expr , Ident , Insert , ObjectName , Query , QuoteDelimitedString , SetExpr ,
26- Statement , TableAliasWithoutColumns , TableObject , Value , ValueWithSpan ,
25+ BinaryOperator , Expr , Ident , Insert , ObjectName , ObjectNamePart , Query ,
26+ QuoteDelimitedString , Select , SelectItem , SetExpr , Statement , TableAliasWithoutColumns ,
27+ TableFactor , TableObject , TableWithJoins , Value , ValueWithSpan ,
2728 } ,
2829 dialect:: OracleDialect ,
2930 parser:: ParserError ,
3031 tokenizer:: Span ,
3132} ;
32- use test_utils:: { all_dialects_where, expr_from_projection, number, TestedDialects } ;
33+ use test_utils:: { TestedDialects , all_dialects_where, expr_from_projection, number} ;
3334
3435mod test_utils;
3536
@@ -542,3 +543,36 @@ fn test_insert_without_alias() {
542543 if matches!( & * source, Query { body, .. } if matches!( & * * body, SetExpr :: Values ( _) ) )
543544 ) ) ;
544545}
546+
547+ #[ test]
548+ fn test_insert_with_query_table ( ) {
549+ let oracle_dialect = oracle ( ) ;
550+
551+ // a simple query (block); i.e. SELECT ...
552+ let sql = "INSERT INTO (SELECT employee_id, last_name FROM employees) VALUES (207, 'Gregory')" ;
553+ oracle_dialect. verified_stmt ( sql) ;
554+
555+ // a full blown query; i.e. `WITH ... SELECT .. ORDER BY ...`
556+ let sql = "INSERT INTO \
557+ (WITH cte AS (SELECT 1 AS id, 2 AS val FROM dual) SELECT foo_t.id, foo_t.val FROM foo_t \
558+ WHERE EXISTS (SELECT 1 FROM cte WHERE cte.id = foo_t.id) ORDER BY 1, 2) \
559+ (id, val) \
560+ VALUES (1000, 10101)";
561+ oracle_dialect. verified_stmt ( sql) ;
562+
563+ // an alias to the insert target query table
564+ let sql = "INSERT INTO \
565+ (WITH cte AS (SELECT 1 AS id, 2 AS val FROM dual) SELECT foo_t.id, foo_t.val FROM foo_t \
566+ WHERE EXISTS (SELECT 1 FROM cte WHERE cte.id = foo_t.id)) abc \
567+ (id, val) \
568+ VALUES (1000, 10101)";
569+ oracle_dialect. verified_stmt ( sql) ;
570+
571+ // a query table target and a query source
572+ let sql = "INSERT INTO (SELECT foo_t.id, foo_t.val FROM foo_t) SELECT 10, 20 FROM dual" ;
573+ oracle_dialect. verified_stmt ( sql) ;
574+
575+ // a query table target and a query source, with explicit columns
576+ let sql = "INSERT INTO (SELECT foo_t.id, foo_t.val FROM foo_t) (id, val) SELECT 10, 20 FROM dual" ;
577+ oracle_dialect. verified_stmt ( sql) ;
578+ }
0 commit comments