@@ -677,6 +677,118 @@ public void testInsertOnConflictIssue1551() throws JSQLParserException {
677677 true );
678678 }
679679
680+ @ Test
681+ public void testInsertOnConflictAfterJoinIssue2358 () throws JSQLParserException {
682+ String sqlStr = "INSERT INTO conf.supply_info (id, deal_id)\n "
683+ + "SELECT uuid_generate_v4(), rep.deal_id\n "
684+ + "FROM conf.reports rep\n "
685+ + "JOIN conf.orders o ON rep.id = o.report_id\n "
686+ + "ON CONFLICT DO NOTHING" ;
687+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr , true );
688+ PlainSelect plainSelect = insert .getSelect ().getPlainSelect ();
689+ assertEquals (1 , plainSelect .getJoins ().size ());
690+ assertEquals (1 , plainSelect .getJoins ().get (0 ).getOnExpressions ().size ());
691+ assertEquals (ConflictActionType .DO_NOTHING ,
692+ insert .getConflictAction ().getConflictActionType ());
693+ assertNull (insert .getConflictTarget ());
694+
695+ assertSqlCanBeParsedAndDeparsed (
696+ "INSERT INTO conf.supply_info (id, deal_id)\n "
697+ + "SELECT uuid_generate_v4(), rep.deal_id\n "
698+ + "FROM conf.reports rep\n "
699+ + "JOIN conf.orders o ON rep.id = o.report_id\n "
700+ + "ON CONFLICT (id) DO NOTHING" ,
701+ true );
702+
703+ assertSqlCanBeParsedAndDeparsed (
704+ "INSERT INTO distributors (did, dname)\n "
705+ + "SELECT did, dname FROM staging\n "
706+ + "JOIN suppliers s ON staging.did = s.did\n "
707+ + "ON CONFLICT ON CONSTRAINT distributors_pkey DO NOTHING" ,
708+ true );
709+
710+ assertSqlCanBeParsedAndDeparsed (
711+ "INSERT INTO distributors (did, dname)\n "
712+ + "SELECT did, dname FROM staging\n "
713+ + "JOIN suppliers s ON staging.did = s.did\n "
714+ + "ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname" ,
715+ true );
716+
717+ assertSqlCanBeParsedAndDeparsed (
718+ "INSERT INTO distributors (did, dname)\n "
719+ + "SELECT did, dname FROM staging\n "
720+ + "JOIN suppliers s ON staging.did = s.did\n "
721+ + "ON CONFLICT (did) WHERE is_active DO NOTHING" ,
722+ true );
723+
724+ assertSqlCanBeParsedAndDeparsed (
725+ "INSERT INTO conf.supply_info (id, deal_id)\n "
726+ + "SELECT uuid_generate_v4(), rep.deal_id\n "
727+ + "FROM conf.reports rep\n "
728+ + "JOIN conf.orders o ON rep.id = o.report_id\n "
729+ + "ON CONFLICT DO UPDATE SET deal_id = excluded.deal_id" ,
730+ true );
731+
732+ assertSqlCanBeParsedAndDeparsed (
733+ "INSERT INTO conf.supply_info (id, deal_id)\n "
734+ + "SELECT uuid_generate_v4(), rep.deal_id\n "
735+ + "FROM conf.reports rep\n "
736+ + "JOIN conf.orders o ON rep.id = o.report_id\n "
737+ + "ON CONFLICT (id, deal_id) DO NOTHING" ,
738+ true );
739+
740+ assertSqlCanBeParsedAndDeparsed (
741+ "INSERT INTO supply_info (id, deal_id)\n "
742+ + "SELECT rep.deal_id, o.total\n "
743+ + "FROM reports rep\n "
744+ + "JOIN orders o ON rep.id = o.report_id\n "
745+ + "JOIN regions r ON o.region = r.id\n "
746+ + "ON CONFLICT DO NOTHING" ,
747+ true );
748+
749+ assertSqlCanBeParsedAndDeparsed (
750+ "INSERT INTO conf.supply_info (id, deal_id)\n "
751+ + "SELECT uuid_generate_v4(), rep.deal_id\n "
752+ + "FROM conf.reports rep\n "
753+ + "JOIN conf.orders o ON rep.id = o.report_id\n "
754+ + "ON CONFLICT (id) WHERE (deal_id IN (1, 2)) DO NOTHING" ,
755+ true );
756+ }
757+
758+ @ Test
759+ public void testInsertSelectWithTrailingOnExpressionsIssue2358 () throws JSQLParserException {
760+ String sqlStr = "INSERT INTO supply_info (id, deal_id)\n "
761+ + "SELECT rep.deal_id, o.total\n "
762+ + "FROM reports rep\n "
763+ + "JOIN orders o ON rep.id = o.report_id\n "
764+ + "ON o.total > 100" ;
765+ Insert insert = (Insert ) assertSqlCanBeParsedAndDeparsed (sqlStr , true );
766+ PlainSelect plainSelect = insert .getSelect ().getPlainSelect ();
767+ assertEquals (1 , plainSelect .getJoins ().size ());
768+ assertEquals (2 , plainSelect .getJoins ().get (0 ).getOnExpressions ().size ());
769+ assertNull (insert .getConflictAction ());
770+ assertNull (insert .getConflictTarget ());
771+
772+ insert = (Insert ) assertSqlCanBeParsedAndDeparsed (
773+ "INSERT INTO supply_info (id, deal_id)\n "
774+ + "SELECT rep.deal_id, o.total\n "
775+ + "FROM reports rep\n "
776+ + "JOIN orders o ON rep.id = o.report_id\n "
777+ + "ON conflict" ,
778+ true );
779+ assertEquals (2 ,
780+ insert .getSelect ().getPlainSelect ().getJoins ().get (0 ).getOnExpressions ().size ());
781+
782+ insert = (Insert ) assertSqlCanBeParsedAndDeparsed (
783+ "INSERT INTO t (a)\n "
784+ + "SELECT x FROM u\n "
785+ + "JOIN v USING (id)\n "
786+ + "ON CONFLICT DO NOTHING" ,
787+ true );
788+ assertEquals (ConflictActionType .DO_NOTHING ,
789+ insert .getConflictAction ().getConflictActionType ());
790+ }
791+
680792 @ Test
681793 public void insertOnConflictObjectsTest () throws JSQLParserException {
682794 String sqlStr = "WITH a ( a, b , c ) \n " + "AS (SELECT 1 , 2 , 3 )\n "
0 commit comments