@@ -570,43 +570,33 @@ parse_upsert_field1([C | S], Acc, ParamPos, Loc) ->
570
570
571
571
make_sql_upsert (Table , ParseRes , Pos ) ->
572
572
check_upsert (ParseRes , Pos ),
573
- HasInsertOnlyFields = lists :any (
574
- fun ({_ , {false }, _ }) -> true ;
575
- (_ ) -> false
576
- end , ParseRes ),
577
- MySqlReplace = case HasInsertOnlyFields of
578
- false ->
579
- [erl_syntax :clause (
580
- [erl_syntax :atom (mysql ), erl_syntax :underscore ()],
581
- [],
582
- [make_sql_upsert_mysql (Table , ParseRes ),
583
- erl_syntax :atom (ok )])];
584
- _ ->
585
- []
586
- end ,
587
573
erl_syntax :fun_expr (
588
- [erl_syntax :clause (
589
- [erl_syntax :atom (pgsql ), erl_syntax :variable (" __Version" )],
590
- [erl_syntax :infix_expr (
591
- erl_syntax :variable (" __Version" ),
592
- erl_syntax :operator ('>=' ),
593
- erl_syntax :integer (90500 ))],
594
- [make_sql_upsert_pgsql905 (Table , ParseRes ),
595
- erl_syntax :atom (ok )]),
596
- erl_syntax :clause (
597
- [erl_syntax :atom (pgsql ), erl_syntax :variable (" __Version" )],
598
- [erl_syntax :infix_expr (
599
- erl_syntax :variable (" __Version" ),
600
- erl_syntax :operator ('>=' ),
601
- erl_syntax :integer (90100 ))],
602
- [make_sql_upsert_pgsql901 (Table , ParseRes ),
603
- erl_syntax :atom (ok )])] ++
604
- MySqlReplace ++
605
- [erl_syntax :clause (
606
- [erl_syntax :underscore (), erl_syntax :underscore ()],
607
- none ,
608
- [make_sql_upsert_generic (Table , ParseRes )])
609
- ]).
574
+ [erl_syntax :clause (
575
+ [erl_syntax :atom (pgsql ), erl_syntax :variable (" __Version" )],
576
+ [erl_syntax :infix_expr (
577
+ erl_syntax :variable (" __Version" ),
578
+ erl_syntax :operator ('>=' ),
579
+ erl_syntax :integer (90500 ))],
580
+ [make_sql_upsert_pgsql905 (Table , ParseRes ),
581
+ erl_syntax :atom (ok )]),
582
+ erl_syntax :clause (
583
+ [erl_syntax :atom (pgsql ), erl_syntax :variable (" __Version" )],
584
+ [erl_syntax :infix_expr (
585
+ erl_syntax :variable (" __Version" ),
586
+ erl_syntax :operator ('>=' ),
587
+ erl_syntax :integer (90100 ))],
588
+ [make_sql_upsert_pgsql901 (Table , ParseRes ),
589
+ erl_syntax :atom (ok )]),
590
+ erl_syntax :clause (
591
+ [erl_syntax :atom (mysql ), erl_syntax :underscore ()],
592
+ [],
593
+ [make_sql_upsert_mysql (Table , ParseRes ),
594
+ erl_syntax :atom (ok )]),
595
+ erl_syntax :clause (
596
+ [erl_syntax :underscore (), erl_syntax :underscore ()],
597
+ none ,
598
+ [make_sql_upsert_generic (Table , ParseRes )])
599
+ ]).
610
600
611
601
make_sql_upsert_generic (Table , ParseRes ) ->
612
602
Update = make_sql_query (make_sql_upsert_update (Table , ParseRes )),
@@ -672,9 +662,6 @@ make_sql_upsert_update(Table, ParseRes) ->
672
662
State .
673
663
674
664
make_sql_upsert_insert (Table , ParseRes ) ->
675
- make_sql_upsert_insert_replace (Table , ParseRes , " INSERT" ).
676
-
677
- make_sql_upsert_insert_replace (Table , ParseRes , Keyword ) ->
678
665
Vals =
679
666
lists :map (
680
667
fun ({_Field , _ , ST }) ->
@@ -687,23 +674,43 @@ make_sql_upsert_insert_replace(Table, ParseRes, Keyword) ->
687
674
end , ParseRes ),
688
675
State =
689
676
concat_states (
690
- [# state {'query' = [{str , Keyword ++ " INTO " }, {str , Table }, {str , " (" }]},
677
+ [# state {'query' = [{str , " INSERT INTO " }, {str , Table }, {str , " (" }]},
691
678
join_states (Fields , " , " ),
692
679
# state {'query' = [{str , " ) VALUES (" }]},
693
680
join_states (Vals , " , " ),
694
681
# state {'query' = [{str , " );" }]}
695
682
]),
696
683
State .
697
684
698
- make_sql_upsert_replace (Table , ParseRes ) ->
699
- make_sql_upsert_insert_replace (Table , ParseRes , " REPLACE" ).
700
-
701
685
make_sql_upsert_mysql (Table , ParseRes ) ->
702
- Replace = make_sql_query (make_sql_upsert_replace (Table , ParseRes )),
686
+ Vals =
687
+ lists :map (
688
+ fun ({_Field , _ , ST }) ->
689
+ ST
690
+ end , ParseRes ),
691
+ {Fields , Set } =
692
+ lists :foldr (
693
+ fun ({Field , key , _ST }, {F , S }) ->
694
+ {[# state {'query' = [{str , Field }]} | F ], S };
695
+ ({Field , {false }, _ST }, {F , S }) ->
696
+ {[# state {'query' = [{str , Field }]} | F ], S };
697
+ ({Field , {true }, _ST }, {F , S }) ->
698
+ {[# state {'query' = [{str , Field }]} | F ],
699
+ [# state {'query' = [{str , Field }, {str , " =VALUES(" }, {str , Field }, {str , " )" }]} | S ]}
700
+ end , {[], []}, ParseRes ),
701
+ Insert =
702
+ concat_states (
703
+ [# state {'query' = [{str , " INSERT INTO " }, {str , Table }, {str , " (" }]},
704
+ join_states (Fields , " , " ),
705
+ # state {'query' = [{str , " ) VALUES (" }]},
706
+ join_states (Vals , " , " ),
707
+ # state {'query' = [{str , " ) ON DUPLICATE KEY UPDATE " }]},
708
+ join_states (Set , " , " )
709
+ ]),
703
710
erl_syntax :application (
704
711
erl_syntax :atom (ejabberd_sql ),
705
712
erl_syntax :atom (sql_query_t ),
706
- [Replace ]).
713
+ [make_sql_query ( Insert ) ]).
707
714
708
715
make_sql_upsert_pgsql901 (Table , ParseRes0 ) ->
709
716
ParseRes = lists :map (
0 commit comments