1616import net .sf .jsqlparser .expression .JdbcParameter ;
1717import net .sf .jsqlparser .expression .LongValue ;
1818import net .sf .jsqlparser .expression .StringValue ;
19+ import net .sf .jsqlparser .expression .operators .relational .ExistsExpression ;
1920import net .sf .jsqlparser .expression .operators .relational .ExpressionList ;
2021import net .sf .jsqlparser .expression .operators .relational .ParenthesedExpressionList ;
2122import net .sf .jsqlparser .parser .CCJSqlParserManager ;
2223import net .sf .jsqlparser .parser .CCJSqlParserUtil ;
2324import net .sf .jsqlparser .schema .Column ;
2425import net .sf .jsqlparser .schema .Table ;
25- import net .sf .jsqlparser .statement .select .AllColumns ;
26- import net .sf .jsqlparser .statement .select .PlainSelect ;
27- import net .sf .jsqlparser .statement .select .Select ;
28- import net .sf .jsqlparser .statement .select .Values ;
26+ import net .sf .jsqlparser .statement .select .*;
2927import net .sf .jsqlparser .statement .update .UpdateSet ;
3028import org .junit .jupiter .api .Disabled ;
3129import org .junit .jupiter .api .Test ;
3230import org .junit .jupiter .api .function .Executable ;
3331
3432import java .io .StringReader ;
33+ import java .util .List ;
3534
35+ import static junit .framework .Assert .assertNull ;
3636import static net .sf .jsqlparser .test .TestUtils .assertDeparse ;
3737import static net .sf .jsqlparser .test .TestUtils .assertOracleHintExists ;
3838import static net .sf .jsqlparser .test .TestUtils .assertSqlCanBeParsedAndDeparsed ;
@@ -277,12 +277,26 @@ public void testInsertSelect() throws JSQLParserException {
277277
278278 @ Test
279279 public void testInsertWithSelect () throws JSQLParserException {
280- assertSqlCanBeParsedAndDeparsed (
281- "INSERT INTO mytable (mycolumn) WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a" ,
282- true );
283- assertSqlCanBeParsedAndDeparsed (
284- "INSERT INTO mytable (mycolumn) (WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a)" ,
285- true );
280+ String sqlStr1 = "INSERT INTO mytable (mycolumn) WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a" ;
281+ Insert insert1 = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr1 , true );
282+ List <WithItem > insertWithItems1 = insert1 .getWithItemsList ();
283+ List <WithItem > selectWithItems1 = insert1 .getSelect ().getWithItemsList ();
284+ assertEquals ("mytable" , insert1 .getTable ().getFullyQualifiedName ());
285+ assertNull (insertWithItems1 );
286+ assertEquals (1 , selectWithItems1 .size ());
287+ assertEquals ("SELECT mycolumn FROM mytable" , selectWithItems1 .get (0 ).getSelect ().getPlainSelect ().toString ());
288+ assertEquals (" a" , selectWithItems1 .get (0 ).getAlias ().toString ());
289+
290+ String sqlStr2 = "INSERT INTO mytable (mycolumn) (WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a)" ;
291+ Insert insert2 = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr2 , true );
292+ List <WithItem > insertWithItems2 = insert2 .getWithItemsList ();
293+ assertEquals ("mytable" , insert2 .getTable ().getFullyQualifiedName ());
294+ assertNull (insertWithItems2 );
295+ ParenthesedSelect select = (ParenthesedSelect ) insert2 .getSelect ();
296+ List <WithItem > selectWithItems2 = select .getSelect ().getWithItemsList ();
297+ assertEquals (1 , selectWithItems2 .size ());
298+ assertEquals ("SELECT mycolumn FROM mytable" , selectWithItems2 .get (0 ).getSelect ().getPlainSelect ().toString ());
299+ assertEquals (" a" , selectWithItems2 .get (0 ).getAlias ().toString ());
286300 }
287301
288302 @ Test
@@ -348,9 +362,15 @@ public void testKeywordPrecisionIssue363() throws JSQLParserException {
348362
349363 @ Test
350364 public void testWithDeparsingIssue406 () throws JSQLParserException {
351- assertSqlCanBeParsedAndDeparsed (
352- "insert into mytab3 (a,b,c) select a,b,c from mytab where exists(with t as (select * from mytab2) select * from t)" ,
353- true );
365+ String sqlStr = "insert into mytab3 (a,b,c) select a,b,c from mytab where exists(with t as (select * from mytab2) select * from t)" ;
366+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr , true );
367+ List <WithItem > insertWithItems = insert .getWithItemsList ();
368+ List <WithItem > selectWithItems = insert .getSelect ().getWithItemsList ();
369+ assertEquals ("mytab3" , insert .getTable ().getFullyQualifiedName ());
370+ assertNull (insertWithItems );
371+ assertNull (selectWithItems );
372+ ExistsExpression exists = (ExistsExpression ) insert .getPlainSelect ().getWhere ();
373+ assertEquals ("(WITH t AS (SELECT * FROM mytab2) SELECT * FROM t)" , exists .getRightExpression ().toString ());
354374 }
355375
356376 @ Test
@@ -390,9 +410,16 @@ public void testInsertKeyWordIntervalIssue682() throws JSQLParserException {
390410
391411 @ Test
392412 public void testWithAtFront () throws JSQLParserException {
393- assertSqlCanBeParsedAndDeparsed (
394- "WITH foo AS ( SELECT attr FROM bar ) INSERT INTO lalelu (attr) SELECT attr FROM foo" ,
395- true );
413+ String sqlStr = "WITH foo AS ( SELECT attr FROM bar ) INSERT INTO lalelu (attr) SELECT attr FROM foo" ;
414+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr , true );
415+ List <WithItem > insertWithItems = insert .getWithItemsList ();
416+ assertEquals ("lalelu" , insert .getTable ().getFullyQualifiedName ());
417+ assertEquals (1 , insertWithItems .size ());
418+ assertEquals ("SELECT attr FROM bar" , insertWithItems .get (0 ).getSelect ().getPlainSelect ().toString ());
419+ assertEquals (" foo" , insertWithItems .get (0 ).getAlias ().toString ());
420+ assertEquals ("SELECT attr FROM foo" , insert .getSelect ().toString ());
421+ assertEquals ("foo" , insert .getSelect ().getPlainSelect ().getFromItem ().toString ());
422+ assertEquals ("[attr]" , insert .getSelect ().getPlainSelect ().getSelectItems ().toString ());
396423 }
397424
398425 @ Test
@@ -427,8 +454,16 @@ public void testDisableKeywordIssue945() throws JSQLParserException {
427454
428455 @ Test
429456 public void testWithListIssue282 () throws JSQLParserException {
430- assertSqlCanBeParsedAndDeparsed (
431- "WITH myctl AS (SELECT a, b FROM mytable) INSERT INTO mytable SELECT a, b FROM myctl" );
457+ String sqlStr = "WITH myctl AS (SELECT a, b FROM mytable) INSERT INTO mytable SELECT a, b FROM myctl" ;
458+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr , true );
459+ List <WithItem > insertWithItems = insert .getWithItemsList ();
460+ assertEquals ("mytable" , insert .getTable ().getFullyQualifiedName ());
461+ assertEquals (1 , insertWithItems .size ());
462+ assertEquals ("SELECT a, b FROM mytable" , insertWithItems .get (0 ).getSelect ().getPlainSelect ().toString ());
463+ assertEquals (" myctl" , insertWithItems .get (0 ).getAlias ().toString ());
464+ assertEquals ("SELECT a, b FROM myctl" , insert .getSelect ().toString ());
465+ assertEquals ("myctl" , insert .getSelect ().getPlainSelect ().getFromItem ().toString ());
466+ assertEquals ("[a, b]" , insert .getSelect ().getPlainSelect ().getSelectItems ().toString ());
432467 }
433468
434469 @ Test
@@ -468,8 +503,18 @@ public void testInsertUnionSelectIssue1491() throws JSQLParserException {
468503 assertSqlCanBeParsedAndDeparsed ("insert into table1 (tf1,tf2,tf2)\n "
469504 + "((select sf1,sf2,sf3 from s1)" + "union " + "(select rf1,rf2,rf2 from r1))" ,
470505 true );
506+ }
471507
472- assertSqlCanBeParsedAndDeparsed ("(with a as (select * from dual) select * from a)" , true );
508+ @ Test
509+ public void testWithSelectFromDual () throws JSQLParserException {
510+ String sqlStr = "(with a as (select * from dual) select * from a)" ;
511+ ParenthesedSelect parenthesedSelect = (ParenthesedSelect ) assertSqlCanBeParsedAndDeparsed (sqlStr , true );
512+ List <WithItem > withItems = parenthesedSelect .getSelect ().getWithItemsList ();
513+ assertEquals (1 , withItems .size ());
514+ assertEquals ("SELECT * FROM dual" , withItems .get (0 ).getSelect ().getPlainSelect ().toString ());
515+ assertEquals (" a" , withItems .get (0 ).getAlias ().toString ());
516+ assertEquals ("a" , parenthesedSelect .getPlainSelect ().getFromItem ().toString ());
517+ assertEquals ("[*]" , parenthesedSelect .getPlainSelect ().getSelectItems ().toString ());
473518 }
474519
475520 @ Test
@@ -528,6 +573,11 @@ public void insertOnConflictObjectsTest() throws JSQLParserException {
528573 String sqlStr = "WITH a ( a, b , c ) \n " + "AS (SELECT 1 , 2 , 3 )\n "
529574 + "insert into test\n " + "select * from a" ;
530575 Insert insert = (Insert ) CCJSqlParserUtil .parse (sqlStr );
576+ List <WithItem > withItems = insert .getWithItemsList ();
577+ assertEquals ("test" , insert .getTable ().getFullyQualifiedName ());
578+ assertEquals (1 , withItems .size ());
579+ assertEquals ("[1, 2, 3]" , withItems .get (0 ).getSelect ().getPlainSelect ().getSelectItems ().toString ());
580+ assertEquals (" a" , withItems .get (0 ).getAlias ().toString ());
531581
532582 Expression whereExpression = CCJSqlParserUtil .parseExpression ("a=1" , false );
533583 Expression valueExpression = CCJSqlParserUtil .parseExpression ("b/2" , false );
@@ -608,8 +658,7 @@ public void testDefaultValues() throws JSQLParserException {
608658 @ Test
609659 public void testDefaultValuesWithAlias () throws JSQLParserException {
610660 String statement = "INSERT INTO mytable x DEFAULT VALUES" ;
611- assertSqlCanBeParsedAndDeparsed (statement );
612- Insert insert = (Insert ) parserManager .parse (new StringReader (statement ));
661+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (statement );
613662 assertEquals ("mytable" , insert .getTable ().getFullyQualifiedName ());
614663 assertEquals ("INSERT INTO MYTABLE X DEFAULT VALUES" , insert .toString ().toUpperCase ());
615664 assertEquals ("x" , insert .getTable ().getAlias ().getName ());
@@ -623,8 +672,7 @@ public void testDefaultValuesWithAlias() throws JSQLParserException {
623672 @ Test
624673 public void testDefaultValuesWithAliasAndAs () throws JSQLParserException {
625674 String statement = "INSERT INTO mytable AS x DEFAULT VALUES" ;
626- assertSqlCanBeParsedAndDeparsed (statement );
627- Insert insert = (Insert ) parserManager .parse (new StringReader (statement ));
675+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (statement );
628676 assertEquals ("mytable" , insert .getTable ().getFullyQualifiedName ());
629677 assertEquals ("INSERT INTO MYTABLE AS X DEFAULT VALUES" , insert .toString ().toUpperCase ());
630678 assertEquals ("x" , insert .getTable ().getAlias ().getName ());
0 commit comments