@@ -857,36 +857,57 @@ public List<Assignment> visitSetClause(SqmSetClause setClause) {
857
857
final SqmExpression <?> assignmentValue = sqmAssignment .getValue ();
858
858
final SqmParameter <?> assignmentValueParameter = getSqmParameter ( assignmentValue );
859
859
final Expression pathSqlExpression = assignedPathInterpretation .getSqlExpression ();
860
- final List <? extends Expression > targetColumnReferences =
861
- pathSqlExpression instanceof SqlTuple sqlTuple
862
- ? sqlTuple .getExpressions ()
860
+ //noinspection unchecked
861
+ final List <ColumnReference > targetColumnReferences =
862
+ pathSqlExpression instanceof SqlTupleContainer sqlTuple
863
+ ? (List <ColumnReference >) sqlTuple .getSqlTuple ().getExpressions ()
863
864
: pathSqlExpression .getColumnReference ().getColumnReferences ();
864
865
if ( assignmentValueParameter != null ) {
866
+ final ArrayList <Expression > expressions = new ArrayList <>( targetColumnReferences .size () );
865
867
consumeSqmParameter (
866
868
assignmentValueParameter ,
867
869
assignedPathInterpretation .getExpressionType (),
868
- (index , jdbcParameter ) -> addAssignment (
869
- assignments ,
870
- aggregateColumnAssignmentHandler ,
871
- targetColumnReferences .get ( index ),
872
- jdbcParameter
873
- )
870
+ (index , jdbcParameter ) -> expressions .add ( jdbcParameter )
874
871
);
875
- }
876
- else if ( assignmentValue instanceof SqmLiteralNull <?> ) {
877
- for ( Expression columnReference : targetColumnReferences ) {
872
+ if ( pathSqlExpression instanceof SqlTupleContainer ) {
878
873
addAssignment (
879
874
assignments ,
880
875
aggregateColumnAssignmentHandler ,
881
- columnReference ,
882
- new QueryLiteral <>( null , (BasicValuedMapping ) columnReference .getExpressionType () )
876
+ (Assignable ) assignedPathInterpretation ,
877
+ targetColumnReferences ,
878
+ new SqlTuple ( expressions , assignedPathInterpretation .getExpressionType () )
883
879
);
884
880
}
881
+ else {
882
+ assert expressions .size () == 1 ;
883
+ addAssignment (
884
+ assignments ,
885
+ aggregateColumnAssignmentHandler ,
886
+ (Assignable ) assignedPathInterpretation ,
887
+ targetColumnReferences ,
888
+ expressions .get ( 0 )
889
+ );
890
+ }
891
+ }
892
+ else if ( pathSqlExpression instanceof SqlTupleContainer
893
+ && assignmentValue instanceof SqmLiteralNull <?> ) {
894
+ final ArrayList <Expression > expressions = new ArrayList <>( targetColumnReferences .size () );
895
+ for ( ColumnReference targetColumnReference : targetColumnReferences ) {
896
+ expressions .add ( new QueryLiteral <>( null ,
897
+ (SqlExpressible ) targetColumnReference .getExpressionType () ) );
898
+ }
899
+ addAssignment (
900
+ assignments ,
901
+ aggregateColumnAssignmentHandler ,
902
+ (Assignable ) assignedPathInterpretation ,
903
+ targetColumnReferences ,
904
+ new SqlTuple ( expressions , assignedPathInterpretation .getExpressionType () )
905
+ );
885
906
}
886
907
else {
887
908
addAssignments (
888
909
(Expression ) assignmentValue .accept ( this ),
889
- assignedPathInterpretation . getExpressionType () ,
910
+ assignedPathInterpretation ,
890
911
targetColumnReferences ,
891
912
assignments ,
892
913
aggregateColumnAssignmentHandler
@@ -908,35 +929,18 @@ else if ( assignmentValue instanceof SqmLiteralNull<?> ) {
908
929
909
930
private void addAssignments (
910
931
Expression valueExpression ,
911
- ModelPart assignedPathType ,
912
- List <? extends Expression > targetColumnReferences ,
932
+ SqmPathInterpretation <?> assignedPathInterpretation ,
933
+ List <ColumnReference > targetColumnReferences ,
913
934
ArrayList <Assignment > assignments ,
914
- AggregateColumnAssignmentHandler assignmentHandler ) {
915
- checkAssignment ( valueExpression , assignedPathType );
916
- if ( valueExpression instanceof SqlTuple sqlTuple ) {
917
- addTupleAssignments ( targetColumnReferences , assignments , assignmentHandler , sqlTuple );
918
- }
919
- else if ( valueExpression instanceof EmbeddableValuedPathInterpretation <?> embeddable ) {
920
- addTupleAssignments ( targetColumnReferences , assignments , assignmentHandler , embeddable .getSqlTuple () );
921
- }
922
- else {
923
- for ( Expression columnReference : targetColumnReferences ) {
924
- addAssignment ( assignments , assignmentHandler , columnReference , valueExpression );
925
- }
926
- }
927
- }
928
-
929
- private void addTupleAssignments (
930
- List <? extends Expression > targetColumnReferences ,
931
- ArrayList <Assignment > assignments ,
932
- AggregateColumnAssignmentHandler aggregateColumnAssignmentHandler ,
933
- SqlTuple sqlTuple ) {
934
- final List <? extends Expression > expressions = sqlTuple .getExpressions ();
935
- assert targetColumnReferences .size () == expressions .size ();
936
- for ( int i = 0 ; i < targetColumnReferences .size (); i ++ ) {
937
- final ColumnReference columnReference = (ColumnReference ) targetColumnReferences .get ( i );
938
- addAssignment ( assignments , aggregateColumnAssignmentHandler , columnReference , expressions .get ( i ) );
939
- }
935
+ AggregateColumnAssignmentHandler aggregateColumnAssignmentHandler ) {
936
+ checkAssignment ( valueExpression , assignedPathInterpretation .getExpressionType () );
937
+ addAssignment (
938
+ assignments ,
939
+ aggregateColumnAssignmentHandler ,
940
+ (Assignable ) assignedPathInterpretation ,
941
+ targetColumnReferences ,
942
+ valueExpression
943
+ );
940
944
}
941
945
942
946
private void checkAssignment (Expression valueExpression , ModelPart assignedPathType ) {
@@ -957,12 +961,15 @@ private void checkAssignment(Expression valueExpression, ModelPart assignedPathT
957
961
private void addAssignment (
958
962
List <Assignment > assignments ,
959
963
AggregateColumnAssignmentHandler aggregateColumnAssignmentHandler ,
960
- Expression columnReference ,
964
+ Assignable assignable ,
965
+ List <ColumnReference > targetColumnReferences ,
961
966
Expression valueExpression ) {
962
967
if ( aggregateColumnAssignmentHandler != null ) {
963
- aggregateColumnAssignmentHandler .addAssignment ( assignments .size (), (ColumnReference ) columnReference );
968
+ for ( ColumnReference targetColumnReference : targetColumnReferences ) {
969
+ aggregateColumnAssignmentHandler .addAssignment ( assignments .size (), targetColumnReference );
970
+ }
964
971
}
965
- assignments .add ( new Assignment ( ( ColumnReference ) columnReference , valueExpression ) );
972
+ assignments .add ( new Assignment ( assignable , valueExpression ) );
966
973
}
967
974
968
975
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0 commit comments